📜  一个有趣的时间复杂度问题

📅  最后修改于: 2021-05-08 17:23:10             🧑  作者: Mango

跟随函数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