演算法導論第8章習題

2022-08-17 04:00:33 字數 2397 閱讀 3883

前面的排序都是基於比較排序,有時候不需要比較也可以排序。關鍵是那些東西有乙個好的表示,比如說整數。

用decision tree證明,\(\omega(n \lg n)\)是所有比較排序演算法的下界。決策樹中間節點表示比較的兩個東西,葉子節點表示元素的乙個置換,決策樹的每條邊表示這個演算法在這個節點獲得的比較資訊。每個置換至少出現一次,葉子的數目是n!個。

不同演算法有不同的決策樹。比如最笨的最小值排序。它最短的path是這樣的:1跟2~n比較的node –> 2跟3~n比較的node –> 。。。。而快排最短的path是,pivot和其他全部比較的n-1個node –> 中間某個pivot和(n-1)/2個元素比較得到的node –> 。。。。

演算法執行的比較次數與決策樹的路是對應的。所以說,插入排序的最長path的長度是\(\theta(n^2)\),歸併排序merge sort的是\(\theta(n \lg n)\)。這樣我們可以不去分許演算法真實是怎麼執行的,而是通過分析決策樹的路就可以了。換個角度更清楚。

引理說樹的高度\(l \le 2^h\)。因為至少有n!個葉子,一化簡h就至少有\(\omega(n \lg n)\)。

線性排序方法計數排序 counting sort計數排序有假設要求所有元素最大值k要合適.排序[0,2,5,6]可以,排序[0,2^10,2^1024]那就死翹了。因為中間的輔助陣列有k個大小,你說這不浪費嘛。而且時間複雜度是o(n+k)。一般是n大。但是k大的話就得不償失了。

演算法流程:1. 把元素a[i]裝到相應的c[a[i]]中。2.把c[i]作為每個元素i的計數變成小於等於i的累積計數。3. 這時候表示c[i]表示i元素的在陣列第幾個位置。j從n遞減到1,b[c[a[ j ]]] =a[ j ]。b有a的大小。c[a[ j ]] ← c[a[ j ]] − 1,自減1。

k要小,最好小於8bit,也就是小於256。

基數排序 radix sortkey:先排序最低位的數字。否則要維護d個中間陣列。stable也很重要。

演算法流程:從低到高依次對數字位用stable的排序。

\如果用計數排序作為中間排序方法:o(d(n+k))

有時候不一定非得按照10進製個十百千萬順序排序。可以對bits分組,r個一組r個一組,共b/r組。\( \theta(\frac(n+2^r))。如果r約等於\(\lg n\)那麼有\(\theta(bn/\lg n)\)。r太小,就比前面那個複雜度稍大。r太大,那就是n^2複雜度。

比如2^16次32bits的整數,r取16bits,只要跑兩趟就ok了。

桶排序 bucket sort假設:數字的輸入是均勻分布在[0,1),這個假設在習題中得到放鬆。

把[0,1)區間劃分成等大小的n個bucket。你看bucket大小的隨著n變化,這演算法肯定很給力。習題給出不必用大小相等的桶來適應分布不均勻的資料。每個桶用分別排序,然後把桶裡的資料都串起來。

一旦乙個桶裡很多元素,那就悲劇了。每個桶期望有1個元素。那麼乙個桶排序期望時間\(o(1)\)。詳細的分析由e(t(n))歸結到求乙個桶裡的數量的平方的期望e[x_ij^2]

注意這是概率分析,要根據輸入資料的概率分布。如果是隨機演算法,我們是強加乙個概率分布到輸入資料上,不一定要均勻分布。

8.1-1 n,發生在a1<=a2<=a3<= …

8.1-2 假設n是偶數even。把連加號拆成兩項\[ \sum_^ \lg (i) = \sum_^ \lg (i) + \sum_^ \lg (i) \]

上界:\[\sum_^ \lg (i) + \sum_^ \lg (i)  \le \frac\lg(\frac) + \frac \lg(n) = n \lg(n) – \frac\]

下界:\[\sum_^ \lg (i) + \sum_^ \lg (i)  \ge \frac\lg2 + \frac\lg(\frac) = \frac\lg (n)   \]

8.1-3 只要考察以這些點作為葉子的二叉樹的高度就可以了。當#leaf=n!/2時候:\(h \ge \lg n \ge lg(\frac \ge \frac\lg(n) – 1 ) \)。樹的高度超過了\(\theta(n)\),所以木有這樣的比較排序演算法。剩下的兩個也是不可能的。

8.1-4 \( k!^} \le 2^h \rightarrow k=\omega(n\lg k)\)

8.2-1 略

8.2-2 counting sort is stable。因為如果a[i]=a[j],i8.2-3 同上

8.2-4 同counting sort的line1到line8,最後只要輸出c[b]-c[a-1]

8.3-1 略

8.3-2 穩定的演算法:插入,合併。不穩定的:堆排序,快排。這個方法很巧。先給每個元素編號index。先比較兩個元素本身,如果還是相等的話,再比較index。空間複雜度需要額外的\(\omega(n\lg n)\)空間。因為每個index可以\(\lg n\)大小的數字來表示,這樣有n個。時間複雜度只是增加了常數項。

8.3-3

演算法導論 第8章

這一章2個事情 1.決策樹。2.三種線性排序。關於決策樹 1.決策樹其實是對前面的堆排序,快排等是最優的比較演算法的證明。2.重要結論,定理8.1證明了任意乙個比較演算法在最壞情況下都需要做 n lg n 次的比較。3.這一節其實沒什麼內容,就是一點基本的概念,以及了解比較演算法可以通過轉換為決策樹...

演算法概論第8章習題

8.3 問題描述 stingy satis the following problem given a set of clauses each a disjunction of literals and an integerk,find a satisfying assignment in whic...

演算法第8章習題 8 13題

a 這個問題是屬於 p 的,解法如下 選取任意乙個v l 中的頂點s,以s為根節點進行深度優先搜尋,每當訪問到l中的頂點時,就停止向下擴充套件,使得l中的頂點成為葉節點。如果深度優先搜尋完成後,所有頂點都已經被訪問到,這顆生成樹即是滿足條件的。否則就說明這樣的生成樹不存在。b 是 np 完全的,因為...