演算法導論第六章6 5優先佇列課後答案。

2021-06-20 01:44:19 字數 2624 閱讀 9583

6.5-1 試說明heap-extract-max在堆a=上的操作過程。

heap-extract-max(a)

if(a.heap-size<1) //堆中元素是否為空

error"heap underflow" //如果是空的,那麼返回錯誤

max=a[1] //將最大堆最大元素也就是第乙個元素儲存起來

a[1]=a[a.heap_size] //將堆中最後乙個元素賦值給第乙個元素

a.heap_size=a.heap_size-1//堆元素數量減少1

max-heapify(a,1)//保持最大堆的性質

return max//返回這個最大元素

堆a個元素的順序是: a=

a=a=a=

6.5-2/6.5-4試說明max-heap-insert(a,10)在堆a=上的操作過程。

max-heap-insert(a,key)

a.heap-size=a.heap-size+1 //將堆中元素個數+1

a[a.heap-size]=負無窮大 //因為堆中新的最後乙個元素開始沒有被賦值,所以是乙個不確定的數,而

//這個不確定的數可能大於待插入的key,這樣就不符合原書本意。而被賦值為負無窮大後,保證了key>a[a.heap-size]

heap-increase-key(a,a.heap-size,key)//在key>a[a.heap-size]前提條件滿足的情況下,增加a[a.heap-size]值到key實現插入

堆a個元素的順序是: a=

a=a=a=

6.5-3 要求用最小堆實現最小優先佇列,請寫出heap-minmum,heap-extract-min,heap-decrease-key和min-heap-insert的偽**。

這裡已經給出最小堆實現最小優先佇列的**。

6.5-5試分析在使用下列迴圈不變數時,heap-increase-key的正確性:

在演算法的第4-6行while迴圈每次迭代開始的時候,子陣列a[1..a.heap-size]要滿足最大堆的性質。如果有違背,那麼只有一種可能,a[i]>a[parent(i)].這裡,你可以假定在呼叫heap-increase-key時,a[1..a.heap-size]是滿足最大堆性質的。

初始:在迴圈開始前,除了剛增加的a[i]=key不滿足最大堆性質,其他元素都滿足最大堆性質。

保持:在迴圈過程中,通過不斷交換key值與其parent值,並且不斷更新parent值來使增加元素值得堆滿足最大堆性質。

終止:當i=1或a[parent(i)]>=a[i]時,代表所有元素已經排好,並且滿足最大堆,那麼迴圈自然終止。

6.5-6 在heap-increase-key的第5行的交換操作中,一半需要通過三次賦值來完成。想一想如何利用insertion-sort內迴圈部分的思想,只用一次賦值就完成一次交換操作?

void heap_increase_key(int a,int i,int key)

a[i]=key;

}

6.5-7 試說明如何使用優先佇列來實現乙個先進先出佇列,以及如何使用優先佇列來實現棧。(佇列和棧的定義見10.1節)

設定最大堆第乙個元素為隊頭q.head,最後乙個元素為隊尾q.tail。

先進先出佇列的插入:當佇列中有元素要入隊,我們可以呼叫最大堆插入函式,先檢測q.tail==q.head+1?測試棧是否滿?然後把隊尾q.tail向後移動一位,再把隊尾q.tail=負無窮大,再呼叫heap-increase-key函式實現插入。

先進先出佇列的刪除:先檢測q.tail==q.head?測試棧是否空?呼叫heap-increase-key(a,i,a[1])函式把待刪除的元素增加到最大值,呼叫heap-extract-max(a)來刪除,最後隊尾q.tail往前移動一位。

這就是先進先出的佇列插入刪除操作,這裡不談其他操作。

設定最大堆第乙個元素為隊頭s.bottom,最後乙個元素為隊尾s.top。

先進後出棧的插入:當棧中要有新元素加入時,我們可以呼叫最大堆插入函式,先檢測s.top>n? 然後把s.top向上移動一位,並設定新的s.top=負無窮大,呼叫heap-increase-key函式,最後呼叫build-max-heap(a)保持最大堆性質。實現插入。

先進先出棧的刪除:先檢測s.top=0?然後將該元素a[i]與棧頂元素a[heap-size]交換,s.top向下移動一位,最後呼叫build-max-heap(a)保持最大堆性質。實現刪除。

這就是先進後出的棧的插入刪除操作,這裡不談其他操作。

6.5-8 heap-delete(a,i)操作能夠將結點i從堆a中刪除。對於乙個包含n個元素的堆,請設計乙個能夠在o(lgn)時間內完成的heap-delete操作。

heap-delete(a,i)

heap-increase-key(a,i,a[1])//將待刪除的元素增加到陣列最大值也就是最大堆第乙個元素的值

heap-extract-max(a)//陣列中有2個最大值,利用此函式刪除乙個實現對a[i]的刪除。

這裡是6.5-9具體解答。

演算法導論第六章之 優先佇列

優先佇列類模版實現 buildmaxheap.h標頭檔案 includeusing namespace std define left i i 2 1 define right i i 2 2 define parent i i 1 2 void max heapify int a,int leng...

演算法導論第六章6 5有限佇列中的6 5 9課後練習

由題目提示知,需要用到歸併排序,又要用到最小堆,那麼我想到用含有最小堆排序的歸併排序對k個有序陣列進行合併因為鍊錶可以看成特殊的動態陣列,那麼我把鍊錶替換成陣列求解。先把k個陣列放入到乙個新陣列a中,那麼一共就有k n a個陣列 a為k個元素陣列中所含最多元素的數量 include using na...

第六章課後習題

1.this和super各有幾種用法?1.子類的建構函式如果要引用super的話,必須把super放在函式的首位。2.子類中的同名成員變數或方法隱藏了父類的成員變數或方法,需要用到super。3.用super直接傳遞引數。2.子類物件例項化的具體過程是什麼?1.子類在構造物件時候,必須訪問父類的建構...