我想更好地理解渐近分析,因为我相信我对此没有扎实的理解。如果有人能突出更好的方法,我将不胜感激。这是两个例子
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循环?
任何答案都非常感谢。先谢谢
答案 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)
如果不了解发生的一些事情,就没有“简单的方法”来了解复杂性 - 复杂性分析依赖于案例。
但是,有一些提示可能对你有所帮助,例如 - 如果迭代计数器正在乘以每次迭代 - 这是一个强烈的指示,对数将涉及复杂度函数,就像在你的第一个例子中一样。