1. 程式人生 > >演算法分析——排序演算法(歸併排序)複雜度分析(代換法)

演算法分析——排序演算法(歸併排序)複雜度分析(代換法)

上篇文章中我們對歸併排序的時間複雜度使用遞迴樹法進行了簡答的分析,並得出了結果歸併排序的時間複雜度為O(nlogn),這裡將使用代換法再進行一次分析。使用代換法解遞迴式的時候,主要的步驟有兩步:

        1)猜測解的結果

        2)使用數學歸納法驗證猜測結果

       由上篇文章的遞迴樹分析中我們得出T(n) = 2T(\frac{n}{2}) +cn \leq O(nlogn),我們這裡將使用代換法對歸併排序的遞迴式進行求解,下面分別用T(n) = 2T(\frac{n}{2}) + ck \leq O(n)T(n) = 2T(\frac{n}{2}) + ck \leq O(n^{2})T(n) = 2T(\frac{n}{2}) + ck \leq O(nlogn)三個證明進行代入分析。

證明1

      首先猜測歸併排序的時間複雜度為O(n),假設 對於 所有的  k\leq n , k >0,都滿足T(k) \leq ck 對於所有的k<n,k>0 
                 T(k) = 2T(\frac{k}{2}) + ck \leq 2(\frac{ck}{2}) + ck = ck +ck

                 T(k) \leq ck + ck \leq ck

      當證明不等式成立時,歸併排序的時間複雜度為O(n)成立,但很明顯不等式只有當k=0的時候才成立,所以結論歸併排序的時間複雜度為O(n)不成立

證明2 

       假設歸併排序的時間複雜度為O(n^{2}),假設對於所有的k> 0k\leq n都符合T(k) \leq c.k^{2}

                T(k) = 2T(\frac{k}{2}) + c.k\leq 2.c(\frac{k}{2})^{2} +c.k = \frac{c}{2}.k^{2} +c.k

                T(k) \leq c.k^{2} -(\frac{c}{2}.k^{2} - c.k) \leq c.k^{2}

      當k\geq 2時不等式均成立,,不等式成立。所以對於c為正常數,k\geq 2時,歸併排序的時間複雜度為O(n^{2})成立。

證明3 

假設歸併排序的時間複雜度為O(nlogn),假設對於所有的k> 0k\leq n都符合T(k) \leq c.klogk

               T(k) = 2T(\frac{k}{2}) + ck \leq ck.log\frac{k}{2} +ck

               T(k) \leq ck(logk -log2) +ck = ck.logk

        所以當 c,k取任何數值時,不等式cklogk \leq cklogk均成立,所以對於任意的c,k> 0,k\leq n歸併排序的時間複雜為O(nlogn)均成立。 

       經過上面的三次證明後,可以很容易發現代換法的缺點,對解的猜測要求比較高

,證明1中由於猜測結果過小無法滿足要求,證明2中猜測結果過大又無法獲得一個漸進緊確界,所以對於遞迴式函式的複雜度求解,往往首先由主定理或遞迴樹法求得結果,再由代換法二次證明。

相關推薦

演算法分析——排序演算法歸併排序複雜分析遞迴樹

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

演算法分析——排序演算法歸併排序複雜分析代換

上篇文章中我們對歸併排序的時間複雜度使用遞迴樹法進行了簡答的分析,並得出了結果歸併排序的時間複雜度為,這裡將使用代換法再進行一次分析。使用代換法解遞迴式的時候,主要的步驟有兩步:         1)猜測解的結果         2)使用數學歸納法驗證猜測結果      

演算法分析——排序演算法歸併排序複雜分析主定理

       前兩篇文章中分別是要用遞迴樹、代換法對歸併排序的時間複雜度進行了簡單的分析和證明,經過兩次分析後,我們發現遞迴樹法的特點是:可以很直觀的反映出整個歸併排序演算法的各個過程,但因為要畫出遞迴樹所以比較麻煩,所以遞迴樹演算法更適合新手,因為它可以讓分析者更直觀、簡易

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

2. 複雜度分析 2.1 什麼是複雜度分析 資料結構和演算法的本質:快和省,如何讓程式碼執行得更快、更省儲存空間。 演算法複雜度分為時間複雜度和空間複雜度,從執行時間和佔用空間兩個維度來評估資料結構和演算法的效能。 複雜度描述的是演算法執行時間(或佔用空間)與資料規模的增長關

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

資料結構與演算法(一)—— 複雜度分析(上) 基礎知識就像是一座大樓的地基,只有打好基礎,才能造成萬丈高樓。資料結構與演算法是一個程式設計師的內功,只有基礎足夠紮實,才能有效提高自己的技術能力,寫出更高效、擴充套件性更好的優秀程式碼。寫這個系列記錄一下自己學習的

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

資料結構與演算法(二)—— 複雜度分析(下) 除了前面記錄的複雜度的基礎知識,還有四個複雜度分析方面的知識點:最好情況時間複雜度、最壞情況時間複雜度、平均情況時間複雜度、均攤時間複雜度。 一、最好、最壞情況時間複雜度 最好情況時間複雜度,就是在最理想的情況下,

《資料結構與演算法之美》專欄閱讀筆記1——複雜分析

蹭可愛的男朋友買的極客時間的專欄【資料結構與演算法之美】,作者讓大家定個學習的flag。o( ̄▽ ̄)o,好吧,最近喜歡做思維導圖(純粹因為好看!),所以flag就是每篇都要寫讀書筆記咯~ 文章目錄 1、如何抓住重點,系統

排序的JAVA實現及時間複雜分析

堆排序是一個比較常用的排序方式,下面是其JAVA的實現: 1. 建堆 // 對輸入的陣列進行建堆的操作 private static void buildMaxHeap(int[] array, int length) { // 遍歷所有

演算法 歸併排序複雜分析含圖解流程和Master公式

圖解流程 整體流程如下: 細節流程: 第一步: 第二步: 第三步: 第四步: 第五步: 第六步: 第七步: 第八步:

資料結構和演算法分析排序篇--歸併排序Merge Sort和常用排序演算法時間複雜比較附贈記憶方法

歸併排序的基本思想 歸併排序法是將兩個或以上的有序表合併成一個新的有序表,即把待排序序列分成若干個子序列,每個子序列是有序的。然後再把有序子序列合併為整體有序序列。注意:一定要是有序序列! 歸併排序例項: 合併方法: 設r[i……n]由兩個有序子表r

演算法導論 第二章:演算法入門 筆記 插入排序、迴圈不變式、演算法分析、最好和最壞時間複雜、選擇排序、分治法、合併排序

插入排序: 排序問題的定義如下: 輸入:N個數{a1, a2,..., an }。 輸出:輸入序列的一個排列{a'1 ,a'1 ,...,a'n },使得a'n <=a' n<=...<

【Java】 大話資料結構(17) 排序演算法(4) 歸併排序 資料結構與演算法合集 資料結構與演算法合集

本文根據《大話資料結構》一書,實現了Java版的堆排序。 更多:資料結構與演算法合集 基本概念   歸併排序:將n個記錄的序列看出n個有序的子序列,每個子序列長度為1,然後不斷兩兩排序歸併,直到得到長度為n的有序序列為止。   歸併方法:每次在兩個子序列中找到較小的那一個賦值給合併序列(通過指標進行操

O(n*logn)級別的演算法之一歸併排序及其優化

原理: 設兩個有序的子序列(相當於輸入序列)放在同一序列中相鄰的位置上:array[low..m],array[m + 1..high],先將它們合併到一個區域性的暫存序列 temp (相當於輸出序列)中,待合併完成後將 temp 複製回 array[low..high]中,從而完成排序。 在具體的合併過

O(n*logn)級別的演算法之一歸併排序

測試用例: #ifndef INC_02_MERGE_SORT_SORTTESTHELPER_H #define INC_02_MERGE_SORT_SORTTESTHELPER_H #include <iostream> #include <

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

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

常見比較排序演算法的實現歸併排序、快速排序、堆排序、選擇排序、插入排序、希爾排序

這篇部落格主要實現一些常見的排序演算法。例如: //氣泡排序 //選擇排序 //簡單插入排序 //折半插入排序 //希爾排序 //歸併排序 //雙向的快速排序(以及快速排序的非遞迴版本) //單向的快速排序 //堆排序 對於各個演算法的實現

演算法1:求逆序對數與顯著逆序對數歸併排序

寫在前面:由本文開始記錄本人的演算法刷題之路,日後會不定期更新,歡迎討論!本系列系本人原創,如需轉載或引用,請註明原作者及文章出處。 求逆序對數問題是歸併排序的基礎問題,顯著逆序對數則是逆序對數的升級

分治演算法歸併排序、一維點對、HDU-1007

分治演算法的基本思想是將一個規模為N的問題分解為K個規模較小的子問題,這些子問題相互獨立且與原問題性質相同。求出子問題的解,就可得到原問題的解。 分治法解題的一般步驟: 分解,將要解決的問題劃分成若干規模較小的同類問題; 求解,當子問題劃分得足夠小時,

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

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

演算法題:對只含有0,1,2三個元素的陣列排序,時間複雜On

題目: 將元素均為0、1、2的陣列排序,時間複雜度O(n)。 思路: 方法1:通過三個下標遍歷一遍實現的方法。 p1從左側開始,指向第一個非1的數字;p3從右側開始,指向第一個非3的數字。 p2從p1開始遍歷,如果是2,p2繼續遍歷,直到p2遇到1或者3 如果遇到