1. 程式人生 > >演算法複雜度分析-主方法及遞迴樹

演算法複雜度分析-主方法及遞迴樹

主方法

       主方法是一個演算法複雜度分析的一個很好的方法,但是隻能用於特定的遞迴上,適合的遞迴形式為:

T(n) = a*T(n/b)+f(n)

       其中,a >=1 ; b >1 ; f(n) : 非遞迴函式,f(n)漸進趨正,漸進趨正的意思是當n足夠大是,f(n)為正數,記:對於n>=n0時,f(n)>0,其中n0為足夠大正數。

判斷n^log (a)與f(n)的大小關係

(1) 如果n^log (a) = Θ(f(n)),那麼該方法的複雜度為   Θ(f(n)*(log b (n)^(k+1))),其中k>=0

(2) 如果

n^log (a) > Θ(f(n)),那麼該方法的複雜度為   Θ(n^(log b (a)))

(3) 如果n^log (a) < Θ(f(n)),那麼該方法複雜度為 Θ(f(n))

下面我們分析下,上面的三種情況是如何得到的


圖1

       每一個結點都有a個子遞迴,整棵樹的高度很顯然是log b (n), 遞迴終端的時間肯定是O(1),故最後一層的時間為 a^h=a^log b (n)=n^log b (a)

我們知道,演算法的總時間是圖1中所有層的總和,即f(n)+a*f(n/b)+...+a^h,對於第(1)種情況,由於n^log (a) 

= Θ(f(n)),所以每一層的時間是相等的,故總時間是f(n)*h=f(n)*log b (n)。對於第(2)種情況,由於n^log (a) > Θ(f(n)), 所以總時間為n^log (a)乘上一個常數,所以為Θ(n^(log b (a))),當然,如果n^log (a) 只比 Θ(f(n))大一丁點的話,是不行的,從上層到下層,要呈幾何遞增對於第(3)種情況,n^log (a) < Θ(f(n)),從上層到下層,時間成幾何遞減,故總時間複雜度為Θ(f(n))。

上面的圖已經用到了遞迴樹。下面介紹遞迴樹

遞迴樹

遞迴樹規則

<1>每層的結點T(n)中的f(n)在當前n/b下的值。

<2>每個節點的分支數為a。

<3>每層的右側標出當前層中所有結點的和。

<4>總時間為每層所有結點和的總和。

例如:T(n)=T(n/4)+T(3n/4)+n

每一層的結點和為n,從根到葉結點的最長路徑為n  ->  (3/4)*n  ->  (3/4)^2*n  ->  ...  ->  1,故a=log 3/2 (n)

所以時間複雜度為Θ(f(n)*(log 3/2 (n)))

小結:

當f(n)為常數時


當f(n)為c*n,c為常數,時


當f(n)為其他函式時,用遞迴樹進行分析。

對本博文的技術探討及建議請發郵件至:[email protected]

郵件標題:網名-博文名稱-日期

謝謝!

相關推薦

演算法複雜分析-方法

主方法        主方法是一個演算法複雜度分析的一個很好的方法,但是隻能用於特定的遞迴上,適合的遞迴形式為: T(n) = a*T(n/b)+f(n)        其中,a >=1 ; b >1 ; f(n) : 非遞迴函式,f(n)漸進趨正,漸

演算法複雜分析(上):分析演算法執行時,時間資源空間資源的消耗

前言 演算法複雜度是指演算法在編寫成可執行程式後,執行時所需要的資源,資源包括時間資源和記憶體資源。 複雜度也叫漸進複雜度,包括時間複雜度和空間複雜度,用來粗略分析執行效率與資料規模之間的增長趨勢關係,越高階複雜度的演算法,執行效率越低。 複雜度分析是資料結構與演算法的核心精髓,指在不依賴硬體、宿主環境

演算法與資料結構】演算法複雜分析

一、什麼是複雜度分析? 1.資料結構和演算法解決是“如何讓計算機更快時間、更省空間的解決問題”。 2.因此需從執行時間和佔用空間兩個維度來評估資料結構和演算法的效能。 3.分別用時間複雜度和空間複雜度兩個概念來描述效能問題,二者統稱為複雜度。 4.複雜度描述的是演算法執行時間(或佔用空間)與資料

13、【演算法演算法複雜分析

一、演算法的時間複雜度分析 1、時間複雜度的定義     在進行演算法分析時,演算法中基本操作語句重複執行的次數是問題規模n的某個函式,用T(n)表示,若有某個輔助函式f(n),使得當n趨近於無窮大時,T(n)/f(n)的極限值為不等於零的常數,則稱f(n)是T(n)的同數量級函式,

演算法複雜分析(時間複雜,空間複雜)

前幾天被問到虛擬DOM的時間複雜度,一臉蒙圈,什麼是時間複雜度,我可能大學的資料結構課都在睡覺吧,今天來看看巨人的肩膀。 為什麼要進行演算法分析? 預測演算法所需的資源: 計算時間(CPU消耗) 記憶體空間(RAM消耗) 通訊時間(頻寬消耗) 預測演算法的執行時間: 在給定輸入規

04-演算法複雜分析(下):最好、最壞、平均、均攤時間複雜

上一節,我們講了複雜度的大 O 表示法和幾個分析技巧,還舉了一些常見覆雜度分析的例子,比如 O(1)、O(logn)、O(n)、O(nlogn) 複雜度分析。掌握了這些內容,對於複雜度分析這個知識點,你已經可以到及格線了。但是,我想你肯定不會滿足於此。 今天我會

時間複雜分析---定理

一直以來時間複雜度都不會算嗚嗚嗚,今天理一理 證明咱就算了,沒這腦子。對於第一種情況,舉幾個栗子: 1)例1:二叉樹的遍歷。            T(n)=2T (n/2)+Θ (1) 。            其中(a=2), (b=2), (f(n)=1

演算法複雜分析中的符號(Θ、Ο、ο、Ω、ω)簡介

Θ,讀音:theta、西塔;既是上界也是下界(tight),等於的意思。 Ο,讀音:big-oh、歐米可榮(大寫);表示上界(tightness unknown),小於等於的意思。 ο,讀音:small-oh、歐米可榮(小寫);表示上界(not tight),小於的意思。

演算法-複雜分析:如何分析、統計演算法的執行效率和資源消耗?

整理自極客時間-資料結構與演算法之美。購買地址(有音訊、更完整): 只要講到資料結構與演算法,就一定離不開時間、空間複雜度分析。而且 我個人認為複雜度分析是真個演算法的精髓,只要掌握了它,資料結構和演算法的內容基本上就掌握了一半。 1.為什麼需要複雜度分析? 你可能

資料結構與演算法隨筆之------演算法複雜分析

一.演算法 1.演算法定義 2.什麼是好的演算法        常見的演算法時間複雜度由小到大依次為:Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)<…<Ο(2n)<Ο(n!) 此外,當你遇到一個Ο(n2)的演算法

學好資料結構和演算法 —— 複雜分析

複雜度也稱為漸進複雜度,包括漸進時間複雜度和漸進空間複雜度,描述演算法隨資料規模變化而逐漸變化的趨勢。複雜度分析是評估演算法好壞的基礎理論方法,所以掌握好複雜度分析方法是很有必要的。 時間複雜度   首先,學習資料結構是為了解決“快”和“省”的問題,那麼如何去評估演算法的速度快和省空間呢?這就需要掌握時間

c++ 演算法複雜分析

1.案例比較 2.複雜度的漸進表示法 3. 函式時間比較和影象 4.複雜度判斷小竅門 加減法不考慮,只考慮乘除 舉例子: // 技巧,先找執行次數,然後用t*(每次的複雜度) //O(1)複雜度 int aFunc(void) {

演算法複雜分析——數學角度

平均複雜度、漸進確界 摘要      本文論述了在演算法分析領域一個重要問題——時間複雜度分析的基礎內容。本文將首先明確時間複雜度的意義,而後以形式化方式論述其在數學上的定義及相關推導。從而幫助大家從本質上認清這個概念。前言      通常,對於一個給定的演算法,我們要做

堆排序中--建堆的演算法複雜分析O(n)

程式碼: [cpp] view plaincopyprint? template<class T> inlinevoid MaxHeap<T>::make_heap(vector<T> & v) {  if (heap_

歐幾里德演算法複雜分析

歐幾里得演算法 function Euclid(a; b) 1: if b = 0 then 2: return a; 3: end if 4: return Euclid(b; a mod b)

演算法複雜分析

一 、時間複雜度    演算法複雜度分為時間複雜度和空間複雜度。其作用: 時間複雜度是度量演算法執行的時間長短;而空間複雜度是度量演算法所需儲存空間的大小。任何演算法執行所需要的時間幾乎總是取決於他所處理的資料量,在這裡我們主要說時間複雜度。對於一個給定計算機的演算法

資料結構與演算法——複雜分析

> 原文連結:[https://jiang-hao.com/articles/2020/algorithms-data-structure-n-algorithm-1.html](https://jiang-hao.com/articles/2020/algorithms-data-structure-

演算法設計與分析(一)——與分治

目錄  D、走迷宮 提示: 提示:  NOJ 2018.9.21 A、二分查詢 時限:1000ms 記憶體限制:10000K  總時限:3000ms 描述 給定一個單調遞增的整數序列,問某個整數是否在序列中。 輸入

java基礎控制語句、方法

1選擇結構 if單選擇結構 /** * 測試if語句 * @author Memorial * */ public class Test { public static void main(String[] args) { double d =Math.random();//返回[

演算法設計與分析:第二章 2.7多項式求值問題

/* 多項式求值問題: 有如下多項式: P (x)= An*x^n + An-1*x^(n-1) + ... +a1*x + a0 如果分別對每一項求職,需要n*(n+1)/2個乘法,效率很低 關鍵:採用遞迴式 Pn(x) = An*x^n + An-1*x^(n-1)