θ符號,f(n) = θ(g(n)),表示f(n)的複雜度既大於等於*g(n)的複雜度,又小於等於g(n)的複雜度,即於g(n)的複雜度相當*。
o符號,f(n) = o(g(n)),表示f(n)的複雜度最多與g(n)乙個數量級,即小於等於。
ω符號,f(n) = ω(g(n)),f(n)的複雜度最少與g(n)乙個數量級,即大於等於。
o符號,f(n) = o(g(n)),表示f(n)的複雜度要比g(n)的數量級小,即小於。
例如2n = o(n^2) ,但是2n^2 != o(n^2)
ω符號,f(n) = ω(g(n)),表示f(n)的複雜度要比g(n)的數量級大,即大於。
演算法設計中經常會用到遞迴,利用遞迴式的方法可以清晰地顯示演算法的整個過程,而對於分析演算法的複雜度,解遞迴式就有了用處。
利用數學歸納法證明遞迴式的時間複雜度是否符合上界或下界。
例如 t(n)= 4t(n/2) +n , [t(1) = o(1)]
假設t(k) ≤ ck
^3(k
t(n) ≤
4c(n/2)
^3+ n = 1/
2cn^3+n = cn
^3-(1/
2cn3-n)≤cn
^3
這樣就得到了乙個上界o(n^3)。
假設t(k) ≤ ck
^2(k
t(n) ≤
4c(n/2)
^2+ n =cn
^2+n= cn
^2-(-n)
因此這裡無法得到t(n) ≤cn^2,也就是說o(n^2)不是t(n)的上界。
在遞迴樹中,每乙個結點都代表乙個子代價,每層的代價是該層所有子代價的總和,總問題的代價就是所有層的代價總和。
所以,我們利用遞迴樹求解代價,需要知道,乙個是每一層的代價,乙個是樹的高度。
如下面的例子所示:
得最後的θ(n)= n^2。
主定理方法的證明
如下圖所示,最後的葉節點數量為 a^(logbn) = n^(logba),因此o(n)的取值和f(n)以及葉節點數量有關。
1,整個遞迴樹的權重從根節點到葉節點一直增加,所以整個遞迴樹的權重主要在葉子節點上;
2,(k = 0)遞迴樹每層的權重大致相同,總共h層,所以整個遞迴樹的權重將各層的權重加起來即可;
3,則與case 1的情況正好相反,所以整個遞迴樹的權重主要在根節點上。
演算法導論第二章
插入排序原始碼 1 include 2 include 3 4using namespace std 56 void insert sort inta 7 17 a i 1 key 18 19 2021 intmain 22view code 逆序輸出 1 include 2 include 3 4...
演算法導論 第三章 掌握漸進符號O和
本篇文章基於麻省理工學院的公開課第二講。首先從純數學的角度上來理解。exam1 f n o g n 代表存在常數c和n0,使得n n0時,滿足0 f n c g n 比如2 n 2 o n 3 這裡n 2代表n的平方,n 3代表n的三次方,用過matlab的應該很好理解。這裡套用o的定義可知,即存在...
演算法 排序演算法第二講 選擇排序
前面我們已經介紹過排序演算法的歸類以及插入排序 鏈結戳這裡 選擇排序分為選擇排序和堆排序。選擇排序的思想是先讓最大數和最小數都為陣列第乙個數,遍歷陣列記錄每一趟最大或最小數與第乙個數進行比較。void selectsort int a,size t n swap a min a left if ma...