算法復雜度O(nlogn)詳解
首先看以下程序段:https://blog.csdn.net/shikelang_pp/article/details/77145684
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j+=i)
{
..... //復雜度為O(1);
}
}
求該程序段的時間復雜度。
可以看出:(1)當i=1時,需要執行n次;
(2)當i=2時,需要執行n/2次;
(3)當i=3時,需要執行n/3次;
.............
(4)當i=n-1時,需要執行n/n-1次;
(5)當i=n時,需要執行n/n次;
每次的時間復雜度為O(1),則總共的時間復雜度為n(1 +1/2+1/3 +1/4 + 1/5+ 1/6+1/7+1/8 +...1/n)。
1 +1/2+1/3 +1/4 + 1/5+ 1/6+1/7+1/8 +...1/n是一個調和級數。很早就有數學家研究,比如中世紀后期的數學家Oresme在1360年就證明了這個級數是發散的。Euler(歐拉)在1734年,利用Newton的成果,首先獲得了這個調和級數有限多項和的值。
1+1/2+1/3+1/4+...+1/n= ln(n+1)+r(r為常量)
則總共的時間復雜度為:
n(1 +1/2+1/3 +1/4 + 1/5+ 1/6+1/7+1/8 +...1/n)
=n(ln(n+1) + r)
=nln(n+1)+rn
因此該程序段的時間復雜度為O(nlogn).
