首先看以下程式段:
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 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算...