Big o 码段的渐近分析

Big o 码段的渐近分析,big-o,analysis,Big O,Analysis,我需要找到以下片段的大O运行时间: sum =0; for (int i=1; i<n; i++) { for (int j=1; j< n/i; j++) { sum = sum +j; } } sum=0; 对于(inti=1;i,正如Dave所说,它是O(n logn),因为内部循环是O(logn)。让我们用这种伪数学风格来写这个 sum i <- [1..n] (sum j <- [1..n/i] 1) 迭代,使整个术语 sum i <

我需要找到以下片段的大O运行时间:

sum =0; 
for (int i=1; i<n; i++) {
  for (int j=1; j< n/i; j++) {
    sum = sum +j;
  }
}
sum=0;

对于(inti=1;i,正如Dave所说,它是O(n logn),因为内部循环是O(logn)。

让我们用这种伪数学风格来写这个

sum i <- [1..n] (sum j <- [1..n/i] 1)
迭代,使整个术语

sum i <- [1..n] (n/i)

<代码>和i i> p>最好的方法是考虑算法将采取多少步骤。

如果你有n个元素,你知道外循环至少要运行n次,所以它必须至少是O(n)

对于每个i,内部循环必须运行多少次?它是随着i的增加而增加、保持不变还是减少

很明显,内循环中的步数会随着i的增加而减少,更重要的是,它会非线性减少,所以你知道它没有O(n^2)那么糟糕


所以它介于O(n)和O(n^2)之间…再分析一下内部循环中的步长是如何减少的,应该可以达到这个目的。编辑:…尽管看起来人们已经把它送走了:)

哇,太快了;我回答的问题已经不存在了:)实际上,它可能是O(n^2)(或者更准确地说,θ(n^2)),即使内部循环中的步数减少了。例如,考虑一下内部循环是
n-i
步骤的情况(这是插入排序算法中的情况),那么
对于i in 1..n对于j in 1..i…
呢?根据你的解释,这并没有O(n²)
那么糟糕,因为内环的范围随着我的增加而减小,但实际上是O(n²)@jk:有趣,只有17秒的差异^^^@Dario:你刚才不是在这个评论中反驳了你的答案吗?@Dario和@jk-你们是对的,我应该说“线性减小”。
sum i <- [1..n] (n/i)
n * (sum i <- [1..n] (1/i))