對演算法複雜度的淺層討論

2021-10-04 19:37:00 字數 1923 閱讀 5185

第一種寫法:

#include

using

namespace std;

intfibs

(int n)

intmain()

第二種寫法:

#include

using

namespace std;

intfibs

(int n)

return second;

}

當我們輸入1,5,28,45等這些數時發現,兩種方法均可瞬間得出我們想要的結果,但當我們輸入的數為64時,會出現乙個問題:方法一遲遲得不出結果,而方法二卻是瞬間得出來結果。why?

如果單從執行效率上進行評估,可能會想到這麼一種方案:比較不同演算法對同一組輸入的執行處理時間 (事後統計法)

上述方案有比較明顯的缺點

一般從以下維度來評估演算法的優劣

//執行次數為1

intf

(int n)

//執行次數為1+4+4+4=13

for(

int i=

0;i<

4;i++

)

//執行次數為1+n+n+n=3n+1;

for(

int i=

0;i)

//執行次數為1+n+n+n*(1+3n)=3n^2+3n+1

for(

int i=

0;i)}

//執行次數為1+n+n+n*(1+15*3)=48n+1

for(

int i-

0;i)}

//執行次數為log2(n)

while

(n=n/2)

//執行次數為1+log2(n)+log2(n)+log2(n)*(1+3n)=1+3*log2(n)+2*nlog2(n)

for(

int i=

0;i=i)}

/*i+=i即為i=i*2*/

對數階的細節

對數階一般省略底數

log2(n)=log2(9)*log9(n)

所以log2(n)、log9(n)統稱為logn

所以根據大o表示法上面的程式的演算法複雜度可以表示為

o(1)、o(1)、o(n)、o(n^2)、o(n)、o(logn)、o(nlog2(n))

#include

using

namespace std;

intfibs

(int n)

intmain()

假如輸入的是5,則可得如下**

所以複雜度為o(2^n)

空間換時間(字串雜湊)

時間換空間

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

在一次筆試題目中,發現了自己對於演算法的時間複雜度問題上並沒有完全清晰這個概念和計算方法,故上網尋找到比較好的詳細介紹來學習。演算法的時間複雜度和空間複雜度合稱為演算法的複雜度。1.時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也...

演算法的複雜度 時間複雜度與空間複雜度

通常,對於乙個給定的演算法,我們要做 兩項分析。第一是從數學上證明演算法的正確性,這一步主要用到形式化證明的方法及相關推理模式,如迴圈不變式 數學歸納法等。而在證明演算法是正確的基礎上,第二步就是分析演算法的時間複雜度。演算法的時間複雜度反映了程式執行時間隨輸入規模增長而增長的量級,在很大程度上能很...

演算法複雜度 時間複雜度和空間複雜度

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