Dic*_*ldi 3 c big-o time-complexity
谁能解释一下这个算法的时间复杂度是多少?
for (i = 1; i <= n; i++){
for(j = 1; j <= n; j += i) { // note: not j++
printf("Iteration %d : %d\n", i, j);
}
}
Run Code Online (Sandbox Code Playgroud)
该printf内部循环被称为正好 ceil(n) + ceil(n/2) + ceil(n/3) + ... ceil(n/n)倍。为了去掉ceil,我们知道ceil(y/n)是由 上界的y/n + 1,所以我们知道执行的次数是>= n + n/2 + n/3 ... n/n但是是< n + 1 + n/2 + 1 + n/3 + 1 + n/4 + 1... + n/n + 1。前者可以分解为n(1 + 1/2 + 1/3 + 1/4 ... 1/n),后者可以重构为n(1 + 1/2 + 1/3 + 1/4 ... 1/n) + n。
后一个因子是无穷大的第一个加数,是发散的谐波级数。k已知来自维基百科页面的第一项的总和是有界的:

这意味着1 + 1/2 + 1/3 + 1/4 ... 1/n是?(ln n) = ?(log n);我们可以为printf被调用的次数给出严格的界限 ( c(n): n log n <= c(n) < n log n + 2n。由于n log n增长速度比 快2n,我们只能保留前者并注意两个界限都属于?(n log n)也因此c(n)属于?(n log n)(?(F)意味着函数是?(F)和O(F))。