嵌套循环的渐近分析

时间:2015-02-15 18:34:18

标签: algorithm asymptotic-complexity

我想更好地理解渐近分析,因为我相信我对此没有扎实的理解。如果有人能突出更好的方法,我将不胜感激。这是两个例子

for (int i = 1; i <= n; i *= 2) { for (int j = 0; j < n; j++) { count++; } }

这个问题来自测验,答案是O(n log n)

我观看了斯坦福大学的讲座,其示例如下:

for i = 1 to n
  for j = i + 1 to n
   if A[i] == A [j] return TRUE otherwise
   return FALSE 

第二个问题的渐近分析是二次O(n ^ 2)

我怎么知道O(n log n)或O(n ^ 2)何时嵌套for循环?

任何答案都非常感谢。先谢谢

1 个答案:

答案 0 :(得分:0)

第一个示例是O(nlogn),因为外循环重复log(n)次,并且每次重复都需要O(n)重复内循环 - 所以这总计在O(log(n) * n) = O(nlogn)

然而,在第二个例子中 - 外部循环需要O(n)次迭代,并且对于每次迭代i - 它需要内部循环的O(n-i)次迭代。这意味着它将花费n + (n-1) + (n-2) + ... + 2 + 1个总时间。这是算术级数,它的总和在O(n^2)

如果不了解发生的一些事情,就没有“简单的方法”来了解复杂性 - 复杂性分析依赖于案例。
但是,有一些提示可能对你有所帮助,例如 - 如果迭代计数器正在乘以每次迭代 - 这是一个强烈的指示,对数将涉及复杂度函数,就像在你的第一个例子中一样。