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.子類在構造物件時候,必須訪問父類的建構...