跟随函数fun()的时间复杂度是多少?
int fun(int n)
{
for (int i = 1; i <= n; i++)
{
for (int j = 1; j < n; j += i)
{
// Some O(1) task
}
}
}
对于i = 1,内部循环执行n次。
对于i = 2,内部循环执行大约n / 2次。
对于i = 3,内部循环执行约n / 3次。
对于i = 4,内部循环大约执行n / 4次。
……………………………………………………。
……………………………………………………。
对于i = n,内部循环执行约n / n次。
因此,上述算法的总时间复杂度为(n + n / 2 + n / 3 +…+ n / n)
变成n *(1/1 + 1/2 + 1/3 +…+ 1 / n)
关于级数(1/1 + 1/2 + 1/3 +…+ 1 / n)的重要一点是,它等于Θ(Logn)(请参阅此内容以供参考)。因此,以上代码的时间复杂度为Θ(nLogn)。
顺便提一下,无限次谐波序列之和随序列发散而与直觉相反。的价值是∞。这与几何级数不同,因为比率小于1的几何级数收敛。
参考:
http://en.wikipedia.org/wiki/Harmonic_series_%28mathematics%29#Rate_of_divergence
http://staff.ustc.edu.cn/~csli/graduate/algorithms/book6/chap03.htm