1. 程式人生 > >時間複雜度分析:遞迴演算法

時間複雜度分析:遞迴演算法

遞迴演算法中的時間複雜度有好幾種解法,在我看來,最容易掌握的是迭代法和遞迴樹法,這就列出這兩種

迭代法:

*** 從原始遞推方程開始,反覆將對於遞推方程左邊的函式用右邊的等式代入,直到得到初值,然後將所得的結果進行化簡。

例如在呼叫歸併排序mergeSort(a,0,n-1)對陣列a[0…n−1]a[0…n−1]排序時,執行時間T(n)T(n)的遞推關係式為:
在這裡插入圖片描述
其中,O(n)為merge()所需要的時間,設為cn(c為正常量)。因此:
在這裡插入圖片描述
類似的,我們也可以用迭代法求解漢諾塔遞迴求解時的時間複雜度。但遺憾的是,迭代法一般適用於一階的遞推方程。對於二階及以上(即T(n)依賴它前面更多個遞迴項T(n)依賴它前面更多個遞迴項)的遞推方程,迭代法將導致迭代後的項太多,從而使得求和公式過於複雜,因此需要將遞推方程化簡,利用差消法等技巧將高階遞推方程化為一階遞推方程。如在求快速排序演算法平均時間複雜度T(n)的遞推方程,T(n)依賴T(n−1)、T(n−2)、…、T(1)T(n−1)、T(n−2)、…、T(1)等所有的項,這樣的遞推方程也稱為全部歷史遞推方程。

遞迴樹法:

***遞迴樹是一棵結點帶權值的樹。初始的遞迴樹只有一個結點,它的權標記為T(n);然後按照遞迴樹的迭代規則不斷進行迭代,每迭代一次遞迴樹就增加一層,直到樹中不再含有權值為函式的結點(即葉結點都為T(1))。

迭代規則:第一步: 把根結點T(n)用根是cn、左結點為T(n/2)、右結點為T(n/2)的子樹代替(即:以分解、合併子問題需要的代價為根,分解得到的子問題為葉的子樹。其中常量c代表求解規模為1的問題所需的時間);(如下如(a)→(b))
第二步:把葉結點按照“第一步”的方式展開;T(n/2)用根是cn/2、左節點為T(n/4)右結點為T(n/4)的子樹代替。(如下如(b)→©)
第三步:反覆按照“第一步”的方式迭代,每迭代一次遞迴樹就增加一層,直到樹中不再含有權值為函式的結點(即葉結點都為T(1))。(如下如©→(d))

例如:
在這裡插入圖片描述
畫出如下圖:
在這裡插入圖片描述
在得到遞迴樹後,將樹中每層中的代價求和,得到每層代價,然後將所有層的代價求和,得到所有層次的遞迴呼叫的總代價。在上圖(d)部分中,完全展開的遞迴樹高度為lgn(樹高為根結點到葉結點最長簡單路徑上邊的數目),所有遞迴樹具有lgn+1,所以總代價為cn∗(lgn+1),所有時間複雜度為Θ(nlgn)

相關推薦

時間複雜分析演算法

遞迴演算法中的時間複雜度有好幾種解法,在我看來,最容易掌握的是迭代法和遞迴樹法,這就列出這兩種 迭代法: *** 從原始遞推方程開始,反覆將對於遞推方程左邊的函式用右邊的等式代入,直到得到初值,然後將所得的結果進行化簡。 例如在呼叫歸併排序mergeSort(

演算法分析——排序演算法(歸併排序)複雜分析樹法)

前面對演算法分析的一些常用的 漸進符號 做了簡單的描述,這裡將使用歸併排序演算法做為一個實戰演練。 這裡首先假設讀者對歸併排序已經有了簡單的瞭解(如果不瞭解的同學可以自行百度下歸併排序的原理)。瞭解此演算法的同學應都知道,歸併排序的主要思想是分而治之(簡稱分治)。分治演算法

演算法時間複雜分析

在演算法分析中,當一個演算法中包含遞迴呼叫時,其時間複雜度的分析會轉化為一個遞迴方程求解。實際上,這個問題是數學上求解漸近階的問題,而遞迴方程的形式多種多樣,其求解方法也是不一而足,比較常用的有以下四種方法:     (1)代入法(Substitution Method)  

演算法時間複雜分析

4.1  階乘n!的遞迴演算法的時間複雜度  時間複雜度是由語句頻度分析得來. 遞迴演算法中重複執行的語句主要是呼叫. 所以遞迴演算法的時間複雜度分析主要是分析遞迴演算法中遞迴函式呼叫的次數,並給出其呼叫次數的函式f(n). 如例1中,當n=5時fan(5)的呼叫情況如圖1所示:   從圖1中可以總結

斐波那契數列演算法和非演算法以及其時間複雜分析

1、在學習資料結構這門課的過程中,發現斐波那契數列的遞迴演算法以及非遞迴演算法,以及其時間複雜度分析是一個小難點。所以特別總結一下。 斐波那契數列的表示式: Fibonacci數列簡介: F(1)=

函式時間複雜分析

相信下面3個網址足夠解決了遞迴函式時間複雜度的分析了 1.https://www.cnblogs.com/aademeng/articles/7044312.html 2.https://www.cnblogs.com/carazk/p/5860334.html 3.htt

演算法演算法的概述和演算法時間複雜分析

演算法:演算法的概述和演算法時間複雜度分析 我是一名在校大學生,學習到了演算法這門課程,想整理一些筆記和大家分享,各位大佬不喜勿噴,僅供參考,希望能對大家有所幫助。 演算法,什麼是演算法 ? 它是求解問題的一系列計算步驟,用來將輸入的資料轉換成輸出結果。我總結關於演算法,有

二分查詢法的迴圈與實現及時間複雜分析

設陣列為整數陣列,從小到大排序。二分法強調一定是要先排過序的。 迴圈實現二分法程式碼: #include <iostream> using namespace std; int binary_search(int *array,int low ,int hi

算法系列-複雜分析淺析最好、最壞、平均、均攤時間複雜

整理自極客時間-資料結構與演算法之美。原文內容更完整具體,且有音訊。購買地址: 上一節,我們講了複雜度的大 O 表示法和幾個分析技巧,還舉了一些常見覆雜度分析的例子,比如 O(1)、O(logn)、O(n)、O(nlogn) 複雜度分析。掌握了這些內容,對於複雜度分析這個知識點,你已經

常見排序演算法的基本原理、程式碼實現和時間複雜分析

  排序演算法無論是在實際應用還是在工作面試中,都扮演著十分重要的角色。最近剛好在學習演算法導論,所以在這裡對常見的一些排序演算法的基本原理、程式碼實現和時間複雜度分析做一些總結 ,也算是對自己知識的鞏固。 說明: 1.本文所有的結果均按照非降序排列; 2.本文所有的程式均用c++實現,

資料結構與演算法--蠻力法之氣泡排序與時間複雜分析(java)

蠻力法         蠻力法又稱窮舉法和列舉法,是一種簡單直接地解決問題的方法,常常直接基於問題的描述,所以蠻力法也是最容易應用的方法。但是蠻力法所設計的演算法時間特性往往是比較低的,典型的指數時間演算法一般都是通過蠻力

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

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

KMP演算法介紹及時間複雜分析

概念:字串中 一個字元前面的字串 的字首與字尾的最長匹配長度(短的那個字串) 注意:字首與字尾不可以是整個子字串 例如:a b c a b c d , d位置的最長匹配長度為3,abc 與 abc 匹配 Next陣列:長度與字串長度一致,每個位置儲存對應字元的最長匹配長

排序演算法——希爾排序的圖解、程式碼實現以及時間複雜分析

希爾排序(Shellsort) 希爾排序是衝破二次時間屏障的第一批演算法之一。 希爾排序通過比較相距一定間隔的元素來工作;各躺比較所用的距離隨著演算法的進行而減小,直到只比較相鄰元素的最後一趟排序為止。由於這個原因,希爾排序有時也叫做縮減增量排序。 希爾排

常用排序演算法穩定性、時間複雜分析

1、  選擇排序、快速排序、希爾排序、堆排序不是穩定的排序演算法,        氣泡排序、插入排序、歸併排序和基數排序是穩定的排序演算法。 2、研究排序演算法的穩定性有何意義?   首先,排序演算法的穩定性大家應該都知道,通俗地講就是能保證排序前兩個相等的資

淺談直接插入排序演算法思想以及時間複雜分析

研究意義 直接插入排序是最基本的一種排序演算法,其思想簡單,容易掌握,對後期的學習也有一定的幫助。 必備知識(之後不再敘述) 排序:將一組雜亂無章的資料排列成一個按關鍵字有序的序列。 穩定性:關鍵值相

排序演算法 (穩定性時間複雜分析

1、  選擇排序、快速排序、希爾排序、堆排序不是穩定的排序演算法,        氣泡排序、插入排序、歸併排序和基數排序是穩定的排序演算法。 2、研究排序演算法的穩定性有何意義?   首先,排序演算法的穩定性大家應該都知道,通俗地講就是能保證排序前兩個相等的資

JavaScript 演算法之最好、最壞時間複雜分析

上一篇文章中介紹了複雜度的分析,相信小夥伴們對常見程式碼的時間或者空間複雜度肯定能分析出來了。 思考測試 話不多說,出個題目考考大家,分析下面程式碼的時間複雜度(ps: 雖然說並不會這麼寫) function find(n, x, arr) { let ind = -1;

演算法時間複雜分析(1)

如果有錯誤的地方,歡迎大家指正,只希望不要誤導別人。 開篇:      學習演算法時間複雜度分析,首先要對O、o、Ω、ω、Θ這幾個符號有基本的瞭解,下面將給出這幾個符號詳細的定義。     1、大O符號:         定義: 設f和g是定義域為自然數集N上的函式,若存

快速排序演算法時間複雜分析(原地in-place分割槽版本)

快速排序演算法一般來說是採用遞迴來實現,其最關鍵的函式是partition分割函式,其功能是將陣列劃分為兩部分,一部分小於選定的pivot,另一部分大於選定的pivot。我們將重點放在該函式上面。 partition函式總體思路是自從一邊查詢,找到小於pivot的元素,則將