算法復雜度O(nlogn)詳解【轉】


算法復雜度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為常量)

 

他的證明是這樣的:
根據Newton的冪級數有:
ln(1+1/x) = 1/x - 1/2x^2 + 1/3x^3 - ...
於是:
1/x = ln((x+1)/x) + 1/2x^2 - 1/3x^3 + ...
代入x=1,2,...,n,就給出:
1/1 = ln(2) + 1/2 - 1/3 + 1/4 -1/5 + ...
1/2 = ln(3/2) + 1/2*4 - 1/3*8 + 1/4*16 - ...
......
1/n = ln((n+1)/n) + 1/2n^2 - 1/3n^3 + ...
相加,就得到:
1+1/2+1/3+1/4+...1/n = ln(n+1) + 1/2*(1+1/4+1/9+...+1/n^2) - 1/3*(1+1/8+1/27+...+1/n^3) + ......
后面那一串和都是收斂的,我們可以定義
1+1/2+1/3+1/4+...1/n = ln(n+1) + r
Euler近似地計算了r的值,約為0.5772156649。這個數字就是后來稱作的 歐拉常數
回歸到程序本身:

則總共的時間復雜度為:

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).


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM