算法运行时间为O(n.m ^ 2)

时间:2015-01-01 17:55:16

标签: algorithm big-o complexity-theory time-complexity

我想知道,因为我无法在线查找任何信息,如何分析O(n * m^2)O(n * k)O(n + k)这样的算法?

只有n计数?

其他条款是多余的?

所以O(n * m^2)实际上是O(n)

3 个答案:

答案 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)。