演算法複雜度O nlogn 詳解

2021-08-06 03:52:01 字數 1282 閱讀 5006

首先看以下程式段:

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在2023年就證明了這個級數是發散的。

euler(尤拉)在2023年,利用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).

演算法複雜度詳解

一 定義 一般情況下,演算法中 基本操作重複執行的次數是問題規模n的某個函式,用t n 表示,若有某個輔助函式f n 使得當n趨近於無窮大時,t n f n 的極限值為不等 於零的常數,則稱f n 是t n 的同數量級函式。記作t n o f n 稱o f n 為演算法的漸進時間複雜度 o是數量級的...

2演算法複雜度詳解

1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數多,它花費時間就...

演算法的時間複雜度和空間複雜度詳解

演算法的時間複雜度和空間複雜度合稱為演算法的複雜度。1.時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算...