我想知道,因为我无法在线查找任何信息,如何分析O(n * m^2)
或O(n * k)
或O(n + k)
这样的算法?
只有n
计数?
其他条款是多余的?
所以O(n * m^2)
实际上是O(n)
?
答案 0 :(得分:5)
不,这里的k和m术语并不是多余的,它们确实具有有效的存在性,对计算时间复杂度至关重要。它们被包装在一起,为代码提供了具体的复杂性。
似乎n和k这两个术语在代码中是相互独立的,但它们都决定了算法的复杂性。
比如说,如果你要迭代一个大小为n元素的循环,并且在两者之间,你有另一个k迭代循环,那么整体复杂性就会变为O(nk)。
订单的复杂性 O(nk),您无法在此处转储/弃置。
for(i=0;i<n;i++)
for(j=0;j<k;j++)
// do something
订单的复杂性 O(n + k),您无法在此处转储/弃置。
for(i=0;i<n;i++)
// do something
for(j=0;j<k;j++)
// do something
订单的复杂性 O(nm ^ 2),你不能在这里转储/丢弃。
for(i=0;i<n;i++)
for(j=0;j<m;j++)
for(k=0;k<m;k++)
// do something
回答最后一个问题---所以O(n.m ^ 2)实际上是O(n)?
不,O(nm ^ 2)复杂度不能进一步降低到O(n),因为这意味着m
没有任何意义,实际情况并非如此。
答案 1 :(得分:1)
正式:O(f(n))是满足以下条件的所有函数T(n)的SET:
存在正常数c和N,使得对于所有n> = N,
T(n) <= c f(n)
以下是除了n之外的其他因素的时间和原因的一些例子。
[1] 1,000,000 n在O(n)中。证明:设置c = 1,000,000,N = 0.
Big-Oh表示法并不关心(大多数)常数因素。我们通常会把常数留下来;写O(2n)是不必要的,因为O(2n)= O(n)。 (2没有错;只是没必要。)
[2] n在O(n ^ 3)中。 [那是立方体]。证明:设置c = 1,N = 1。 Big-Oh符号可能会产生误导。仅仅因为算法的运行时间在O(n ^ 3)并不意味着它的速度很慢;它也可能在O(n)中。 Big-Oh符号只给我们一个函数的上限。
[3] n ^ 3 + n ^ 2 + n在O(n ^ 3)中。证明:设置c = 3,N = 1。 Big-Oh表示法通常仅用于表示主导(最大的 功能中的最令人不快的术语。其他条款成为 当n很大时,这是微不足道的。
这些不是一般化的,每种情况可能都不同。这就是问题的答案:“只计算n吗?其他条款是多余的吗?”
答案 2 :(得分:-1)
虽然已经有一个已接受的答案,但我还是想提供以下输入:
O(n * m^2) : Can be viewed as n*m*m and assuming that the bounds for n and m are similar then the complexity would be O(n^3).
同样 -
O(n * k) : Would be O(n^2) (with the bounds for n and k being similar)
和 -
O(n + k) : Would be O(n) (again, with the bounds for n and k being similar).
PS:最好不要假设变量之间的相似性,并在尝试结束之前先了解变量之间的关系(例如:m = n / 2; k = 2n)。