算法導論 — 8.1 排序算法的下界

筆記

我們所熟知的插入排序、歸併排序、快速排序等排序算法,它們的排序過程都依賴於比較元素間的大小,我們稱這些算法爲比較排序。本節討論比較排序算法的運行時間的下界。
  給定一個輸入序列<a1,a2,,an><a_1, a_2, …,a_n>。爲簡化分析,假定所有輸入元素都是互異的。
  比較排序可以抽象爲一棵決策樹。下圖決策樹展示了插入排序算法作用於包含3個元素的輸入序列的情況。決策樹是一棵完全二叉樹。每個非葉結點都以i:ji : j標記,表示一對元素aia_iaja_j的比較過程。插入排序從根結點開始,根據結點的比較結果,逐層向下走。在一個非葉結點,如果比較之後確定兩個元素的大小關係爲aiaja_i ≤ a_j,那麼進入左子樹;如果比較之後確定兩個元素的大小關係爲ai>aja_i > a_j,那麼進入右子樹。當到達一個葉結點時,表示已經排好序。每一個葉結點都表示一個可能的排好序的序列。
  在這裏插入圖片描述
  對於一個有nn個元素的序列來說,可能的排好序的序列一共有n!n!種,對應的決策樹就有n!n!個葉結點。一個排序過程的運行時間取決於它所包含的比較次數。對於一個確定的排序過程,比較次數等於從決策樹的根結點到一個葉結點的路徑長度。因此,一個排序算法的最壞情況比較次數等於其決策樹的高度,即從根結點到最低層次葉結點的路徑長度。
  考慮一棵高度爲hh、具有ll個葉結點的決策樹,它對應一個有nn個輸入元素的排序算法。因爲輸入數據的n!n!種可能的排列都是葉結點,所以有n!ln! ≤ l。由於在一棵高度爲hh的二叉樹中,葉結點的數目最多爲2h2^h個,因此有n!l2hn! ≤ l ≤ 2^h。對該式取對數,得到hlg(n!)=Ω(nlgn)h ≥ {\rm lg}(n!) = Ω(n{\rm lg}n)。於是可以得到,在最壞情況下,任何比較排序算法都至少需要做Ω(nlgn)Ω(n{\rm lg}n)次比較。

練習

8.1-1 在一棵比較排序算法的決策樹中,一個葉結點可能的最小深度是多少?
  
  
8.1-2 不用斯特林近似公式,給出lg(n!){\rm lg}(n!)的漸近緊確界。利用A.2節中介紹的技術來累加和k=1nlgk\sum_{k=1}^{n}{\rm lg}k
  
  lgk{\rm lg}k爲單調遞增函數,根據A.2節結論,可以通過積分近似方法來累加和k=1nlgk\sum_{k=1}^n{\rm lg}k的漸近緊確界。
  k=1nlgk=lg1+k=2nlgk=k=2nlgk1n(lgk)dk=nlgn(n1)ln2\sum_{k=1}^n{\rm lg}k={\rm lg}1+\sum_{k=2}^n{\rm lg}k=\sum_{k=2}^n{\rm lg}k≥∫_1^n({\rm lg}k)dk=n{\rm lg}n-\frac{(n-1)}{{\rm ln}2}
  由上式可以得到,k=1nlgk=Ω(nlgn)\sum_{k=1}^n{\rm lg}k=Ω(n{\rm lg}n)成立。
  
8.1-3 證明:對n!n!種長度爲nn的輸入中的至少一半,不存在能達到線性運行時間的比較排序算法。如果只要求對1/n1/n的輸入達到線性時間呢?1/2n1/2^n呢?
  
  一棵高度爲hh的決策樹最多有2h2^h個葉結點。
  對於一個含nn個元素的序列,如果可能的排列一共有n!/2n!/2種,那麼其決策樹的葉結點數目滿足2hn!/22^h ≥ n!/2。可以得到hlg(n!)1=Ω(nlgn)h ≥ {\rm lg}(n!) − 1 = Ω(n{\rm lg}n)。因此對於至少n!/2n!/2種可能的排列,比較排序算法也不能達到線性運行時間。
  如果可能的排列一共有n!/nn!/n種,,那麼其決策樹的葉結點數目滿足2hn!/n2^h ≥ n!/n。可以得到hlg(n!)lgn=Ω(nlgn)h ≥ {\rm lg}(n!) − {\rm lg}n = Ω(n{\rm lg}n)。這種情況下,比較排序算法也不能達到線性運行時間。
  如果可能的排列一共有n!/2nn!/2^n種,,那麼其決策樹的葉結點數目滿足2hn!/2n2^h ≥ n!/2^n。可以得到hlg(n!)n=Ω(nlgn)h ≥ {\rm lg}(n!) − n = Ω(n{\rm lg}n)。這種情況下,比較排序算法也不能達到線性運行時間。

8.1-4 假設現有一個包含nn個元素的待排序序列。該序列由n/kn/k個子序列組成,每個子序列包含kk個元素。一個給定子序列中的每個元素都小於其後繼子序列中的所有元素,且大於其前驅子序列中的每個元素。因此,對於這個長度爲nn的序列的排序轉化爲對n/kn/k個子序列中的kk個元素的排序。試證明:這個排序問題中所需比較次數的下界是Ω(nlgk)Ω(n{\rm lg}k)。(提示:簡單地將每個子序列的下界進行合併是不嚴謹的。)
  
  正如提示所言,我們不能簡單將每個子序列的下界進行合併。因爲這種做法引入了一個前提,那就是我們採用的排序算法必須是獨立地對每個子序列進行排序的,元素間的比較僅限於各子序列內部。而對於那些存在跨子序列比較的排序算法,這一做法並沒有考慮進來。因此這一做法是不嚴謹的。
  我們還是需要將整個序列當做一個整體來考察。每個子序列都有k!k!種可能的排列,一共有n/kn/k個子序列,那麼整個序列一共有(k!)n/k(k!)^{n/k}種可能的排列。假定針對該序列的排序算法的決策樹的高度爲hh,那麼滿足2h(k!)n/k2^h ≥(k!)^{n/k},兩邊取對數可得到
  hlg[(k!)nk]=nklg(k!)=Ω(nlgk)h≥{\rm lg}[(k!)^{n⁄k} ]=\frac{n}{k}{\rm lg}(k!)=Ω(n{\rm lg}k)

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