由乙個類似於二分搜尋的演算法引出了對複雜度的分析問題。
想來想去,也不知道如何證明。
這也說明自己對演算法的理解不到位的地方,也是如何證明,如何分析複雜度,這裡進行一次大補。
如果用主定理的話,又體現不出對演算法的深入理解吧。而且演算法證明最好不要用主定理,不能體現水平吧。
補充一:
演算法複雜度
分為時間複雜度
和空間複雜度
。對於時間複雜度,可以理解為程式執行的次數 也就是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+12.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)
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...