分治法:歸併排序分析

目錄
一.分而治之
二.歸併排序性能分析



一.分而治之:


遞歸算法的複雜度計算方法:
1、代入法
2、遞歸樹法 P50
3、主方法 

二.歸併排序性能分析:


假設求解規模爲n的問題耗時爲,當n=1。當n>1時,根據分治法按以下步驟對問題進行處理:

  1. 分解:將規模爲n分解爲a個規模爲的問題,假設分解耗時爲
  2. 求解:求解a個規模爲的問題,則求解這些問題的時間爲
  3. 合併:將a個規模爲的問題合併。假設該過程耗時爲

經過上述處理,可得到:

                    1

 

在歸併法中,分解、求解、合併操作的耗時如下

  1. 分解:分解操作爲,耗時爲常量,則
  2. 求解:歸併法中,分解操作是將規模爲n的問題分解成2個規模爲的問題,則
  3. 合併:歸併法的合併操作的僞代碼和耗時如表1所示,其中,明顯可得

                     表1

MERGER(A,p,q,r)                        代價  次數

  1. n1=q-p+1                         c1     1    
  2. n2=r-q                           c2     1
  3. 新建數組L和R                     c3     1
  4. for i=1 to n1                    c4     n/2            
  5.     L[i]=A[p+i-1]                c5     n/2    
  6. for j=1 to n2                    c6     n/2  
  7.     R[j]=A[q+j]                  c7     n/2  
  8. L[n1+1]=∞                       c8     1
  9. R[n2+1]=∞                       c9     1
  10. i=1                              c10    1
  11. j=1                              c11    1
  12. for k = p to r                   c12    n
  13.     if L[i]≤R[j]                c13    n
  14.         A[k]=L[i]                c14    t
  15.         i = i + 1                c15    t
  16.     else A[k]=R[j]               c16    n-t
  17.         j = j + 1                c17    n-t



假設處理規模爲1的問題和在分解和合並操作中處理每個元素的耗時的上界爲常數c,則

因此公式1可變成                           2

                 

公式(2)不斷迭代分解後可得:

     

假設經過k次分解後,達到規模爲1的問題,即,所以,代入上述公式可得


歸併排序小結
    1.歸併排序的時間複雜度爲O(nlgn), 空間複雜度爲O(n)
    2. 歸併排序屬於穩定排序,即排序前後相等元素的先後順序不變,這是在O(nlgn)系列算法中(比如快速排序)少有的穩定排序算法
    3. 在計算mid = (low + high) / 2時,如果low和high很大,則可能發生溢出,可將式子轉換爲mid = low + (high - low) / 2
    4. 書上僞代碼是在每次merge時分配臨時空間,這樣多次分配釋放會影響效率,可以預先分配O(n)的空間作爲參數傳給merge函數
    5. 歸併排序可用於外排序。當我們要對一個很大的數據文件排序(文件不能一次裝入內存),可以將其分段讀入內存排序後寫回(或寫到臨時文件),然後再使用歸併算法合併已排序的多個子文件
    6. 類似的,如果要合併兩個特別大的有序序列,去除重複元素,或者是找出相同元素,也可以採用merge的思想

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章