我对以下算法感到困惑。特别是,我不明白为什么第一个是O(n),第二个是O(n ^ 2)。我唯一的直觉可能是第一个算法的内部和外部循环没有“链接”。其次,我可以直观地看到第二个算法是O(n ^ 2),但我们如何找到一些常数c1,c2来证明f(n)是大0和小0的n ^ 2?< / p>
sum = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
sum++;
sum = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < i; j++)
sum++;
答案 0 :(得分:2)
要正式推断增长顺序,您可以按以下步骤进行:
对于 c'情况,内部循环将不会在i = 0
时执行,因此,解决方案是外部化外部循环“迭代”,这不会影响内部循环。
答案 1 :(得分:1)
这两个都是 O(n 2 )
您的代码有一个方便的机制来衡量时间复杂度,那就是sum
变量
使用n
的不同值实现该实现。如果你的sum
成了一条线,那就是线性的。如果他们不这样做,那就不是线性的。我认为您会发现,在您的第一个算法中,sum
始终是n^2
答案 2 :(得分:0)
两个代码块都代表O(n ^ 2)
第一个块应该是n ^ 2复杂度的典型示例。内部和外部循环遍历N次。
第二个区块也是n ^ 2,即使内环比第一个区块早在小i上破坏。如果你打印出i和j,你会看到这个循环代表i和j的组合对...即(1,0),(2,0),(2,1),(3,0) ,(3,1),(3,2)等