由二分搜尋引出的演算法複雜度分析

2021-06-18 10:04:58 字數 1347 閱讀 1921

由乙個類似於二分搜尋的演算法引出了對複雜度的分析問題。

想來想去,也不知道如何證明。

這也說明自己對演算法的理解不到位的地方,也是如何證明,如何分析複雜度,這裡進行一次大補。

如果用主定理的話,又體現不出對演算法的深入理解吧。而且演算法證明最好不要用主定理,不能體現水平吧。

補充一:

演算法複雜度

分為時間複雜度

和空間複雜度

。對於時間複雜度,可以理解為程式執行的次數 也就是f(n),因此,演算法的

時間複雜度

記做:t(n)=o(f(n))。

首先證明一下二分搜尋的複雜度:

從上面的思路想,由n來說,第一次比較後 n/2 ,第二次比較後為n/4,這也經過k次後停止,此時為n/(2^k)次。

最後一步 所以,n/(2^k) = 1。

要求執行次數,即k,則k = logn。

證畢。

根據定義,可以歸納出基本的計算步驟

1. 計算出基本操作的執行次數t(n)

基本操作即演算法中的每條語句(以;號作為分割),語句的執行次數也叫做語句的頻度。在做演算法分析時,一般預設為考慮最壞的情況。

2. 計算出t(n)的數量級

求t(n)的數量級,只要將t(n)進行如下一些操作:

忽略常量、低次冪和最高次冪的係數,

令f(n)=t(n)的數量級。

3. 用大o來表示時間複雜度

當n趨近於無窮大時,如果lim(t(n)/f(n))的值為不等於0的常數,則稱f(n)是t(n)的同數量級函式。記作t(n)=o(f(n))。

記住演算法的複雜度一定是與k=f(n)有關的,也就是常量語句的執行次數。

例如:

int num1, num2;

for(int i=0; i

k2 = n+1

k3 = n

k4  =>1 2 4 8 ... 2^k4 => 2^k4 = n(n時結束)  所以k4 = log n

k5 = logn

所以總體執行次數t(n) = k2+k3+k2*(k4+k5)= n+1 + n + n*(2 logn) = 2n+1 + n*(2logn)

2.    

f(n) = 對t(n)做:忽略常量、低次冪和最高次冪的係數,

令f(n)=t(n)的數量級。

3.驗證

lim(t(n)/f(n)) = (2n+1 + n*(2logn) ) /  n*(logn)  = 2.

所以複雜度 是 o(f(n))=o(nlogn)

二分搜尋的時間複雜度O(logN)

學過資料結構,當然當年也學過演算法的時間複雜度的,不知道當年是不是會推倒時間複雜度,大概也就是根據基本語句的執行次數來獲得最高的數量級吧 例如i 0 while ii 0 j 0 while i while ji j 0 總共執行次數應該是n n 2次,但時間複雜度只關係最高次,這才是真正影響程式效...

談談演算法複雜度與二分查詢

程式設計對於工科學生的重要性不言而喻,如果你喜歡這篇文章,歡迎一起交流學習!歡迎交流 mate595 126.com 好一點的查詢是雜湊表查詢法,python裡面直接用字典實現了,先給二分的 def binary search list,item low 0 high len list 1 whil...

時間複雜度 二分查詢

不常見的時間複雜度 看看就好 如何一眼判斷時間複雜度?def hanoi n,a,b,c if n 0 hanoi n 1,a,c,b print s s a,c hanoi n 1,b,a,c hanoi 5,a b c h n 2h n 1 1 h 1 1遞迴面試題 斐波那契 斐波那契 數列 f...