算法導論(第三版)第二章思考題2-1 (在歸併排序中對最小數組採用插入排序) 雖然歸併排序的最壞情況運行時間爲...

2-1(在歸併排序中對最小數組採用插入排序) 雖然歸併排序的最壞情況運行時間爲θ(nlgn),而插入排序的最壞情況運行時間爲θ(n2n2),但是插入排序中的常量因子可能使得它在n較小時,在許多機器上實際運行得更快。因此,在歸併排序中當子問題變得足夠小時,採用插入排序來使遞歸的葉變粗是有意義的。考慮對歸併排序的一種修改,其中使用插入排序來排序長度爲k的n/k個子表,然後使用標準的合併機制來合併這些子表,這裏k是一個待定的值。
a) 證明:插入排序最壞情況可以在θ(nk)時間內排序每個長度爲k的n/k個子表
b) 表明在最壞情況下如何在θ(nlg(n/k))時間內合併這些子表
c) 假定修改後的算法的最壞情況運行時間爲θ(nk+nlg(n/k)),要使修改後的算法與標準的歸併排序具有相同的運行時間,作爲n的一個函數,藉助θ記號,k的最大值是什麼?
d) 在實踐中,我們應該如何選擇k?

 

a)

對k個數進行插入排序 可以想一下

第1個數排序時長爲1;

第二個數排序時長爲2;

...

第k個數排序時長爲k;

加起來的排序時長就是(k+1)*k/2

題目告訴我們有n/k個子表 所以總運行時長是(k+1)*k/2*(n/k)

約分k後得出總運行時長是(k+1)*n/2 所以θ(nk) 是關於nk的複雜度

 

b)子表的個數是n/k個 可以想象在樹狀歸併圖的底部 依次排列:

組1: 1 2 3...... k  組2: 1 2 3.....k ...... 組n/k 1 2 3......k

這樣的結構的第二層就是

組1: 1 1 2 2 ...... k k 組2: 1 1 2 2 ...... k k  組n/k/2 1 1 2 2 ...... k k 

第1層有n/k個組 每組k個元素 

第2層有n/k/2個組 每組2k個元素

第3層有n/k/2^(層數-1)個組 每組有2^(層數-1)*k個元素

......

第lg(n/k)層最高層 有1個組 每組有n個元素

 

每一次合併 如果用標準的合併機制 則:

對於第lg(n/k)-1層 合併的複雜度爲:

假設兩個組 每組有m個元素 假如都是從大到小排序排好的 合併的時候 比較放在最前端的兩個數 把較大的數拿出來組成新的組 在最壞的情況下要比較2m次

最終總的合併時間 是:

第一層: 2*k*(n/k)/2 = n(每次兩兩合併要2k時間 n/k組按照兩兩分組 有n/k/2個兩兩組合)

第二層: 2*2k*(n/2/k)/2 = n

...

最終 有lg(n/k)層 總共耗時n*lg(n/k)的時間

因此 總耗時的最大因素可以縮寫爲: θ(n*lg(n/k))

(c)

由題幹θ(nlgn)標準二分法的運行時間是nlg(n)

本小題中算法的運行時間是nk+nlg(n/k)

即問什麼情況下 能使 nk+nlg(n/k) = nlg(n)

過程如下:

左邊提取公因式 = n*(k+lg(n/k))

左右都➗n 得到: k+lg(n/k) = lg(n)

k+lgn-lgk = lgn

k-lg(k) = 0

k不存在🤷‍♀️懷疑自己算錯了歡迎指正...

(4) k怎麼選?

就是問對於n個數,在一開始就要分組,那麼每組排序的時候用插入法排序,合併時用歸併法,怎麼分配最快

如果對於一臺運算很快的機器 在執行插入排序比細分到最小的歸併排序快的話 這時選插入排序

這時就要計算 這個最小的n值在哪裏 在n到達多少的時候 歸併排序比插入排序快,這個n作爲歸併排序最低層的數字個數

比如對機器的運行速度的實驗表明 對於32個數排序 插入排序比歸併排序快,33個數就慢了

那麼當要排序128個數的時候 k就應該是32 每組32個數 當這4組數在插入排序完成後 再進行歸併排序 在第3層的時候運算完畢 這樣是最快的.

 

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