Heap結構的基本介紹與範例 - 筆記長也
文章推薦指數: 80 %
Heap結構的基本介紹與範例. 2018-03-11 19:17:00 資料結構. Heap - 堆積. 堆積是一棵二元樹,其樹根大於子樹,且不管左右大小為何,這是與二元搜尋樹最大的差異。
Heap結構的基本介紹與範例-筆記長也
關於
搜尋
ReactJS
Laravel
PHP
資結
登入
首頁
所有文章
資料結構
Heap結構的基本介紹與範例
Heap結構的基本介紹與範例
2018-03-1119:17:00
資料結構
Heap-堆積
堆積是一棵二元樹,其樹根大於子樹,且不管左右大小為何,這是與二元搜尋樹最大的差異。
將二元樹調整為堆積
將二元樹轉為堆積的方式有兩種,第一種是由上而下整理,這種整理方式有兩種:
1.由樹根開始,與其左右節點比較,若樹根較大,則不必交換,反之則要交換
2.由樹根開始,先找出下一個階層最大的節點,再與樹根比較,若樹根較大則不必交換,反之要交換。
這種方法優點是只需要交換一次。
我們利用兩種方法取得了不同的heap,同筆資料的heap不是只有一種,只要符合根大於子即可。
另外一種方法則是由下往上,先取得整棵樹的節點數,假設n,取其n/2,從節點n/2開始至樹根相比。
舉例,先將一棵二元樹依序由上向下編號:
此棵樹共有5個節點,(int)5/2=2,由第2節點開始,取其最大的子節點第4節點30與第2節點比較,因30>29則需交換,以此類推。
實作範例(MAX-HEAP)
heap的加入
heap的加入十分容易,先依照完整二元樹的方式加入節點(即每個階層滿了才能往下一個階層加入,如在陣列中則是一直向下新增),如我們要新增50:
加入在最後一個之後,由於50>10不符合heap,需要調整。
我們在這裡採用由下往上整理(因為插入在最末端),過程不再贅述,請參考下圖:
publicvoidinsert(){
if(last>=max-1){
System.out.println("Heaparrayisfull!");
}else{
System.out.println("inputdata:");
heapt[++last]=input.nextInt();
adsjustup(heapt,last);
}
}
publicvoidadsjustup(intads[],intindex){
while(index>1){
if(ads[index]<=ads[index/2])//當父節點已經大於子結點就不再調整
{
break;
}else{//否則交換
exchange(ads,index);
index/=2;
}
}
}
heap的刪除
heap的刪除是以最後一個節點來代替要被刪除的節點,並由上往下整理(因為通常會向上替代,除非刪除的是最後一個節點),如圖要刪除30:
先將10換到30的位置,再由上往下檢查,50與10比較不必互換,29與10比較則須互換。
publicvoiddel(){
if(last<=0)
System.out.println("Heapisnull!");
else{
System.out.println("Inputdeldata:");
intdeldata=input.nextInt();
intdelindex=search(deldata);
if(delindex==0)
System.out.println("DatanotFind!");
else{
heapt[delindex]=heapt[last];
heapt[last]=0;
last--;
adsjustdown(heapt,1);
}
}
}
publicvoidadsjustdown(intarr[],intindex){
intdata=arr[index];//儲存該點資料
intindex_temp=index*2;//取得下一個階層
while(index_temp<=last){
if((index_temp
延伸文章資訊
- 1來征服資料結構與演算法吧| 搞懂Binary Heap 的排序原理
而Binary Heap 的種類分成兩種,分別為max-heap(最大堆積)和min-heap(最小堆積),max-heap 就是所有數字都大於它之下的數字。像上方的示意圖,不論是 ...
- 2堆積排序Heapsort
說明 · Heapify:將陣列轉換為heap 資料結構(heapify)。 · Sorting:不斷置換heap root 與最後一個元素來排序,並修正剩餘未排序資料使其符合heap order。
- 3堆積排序(Heap Sort)演算法,利用完全二元樹來排序的演算法
堆積排序(Heap Sort)演算法是利用完全二元樹(Complete Binary Tree),也就是堆積(Heap)結構來完成排序的演算法。雖然說要用到堆積結構,看起來好像很 ...
- 4[資料結構] 堆積(Heap) - iT 邦幫忙
[資料結構] 堆積(Heap) ... 堆積(Heap),是一種特殊的完全二元樹,而堆疊不一樣,是完全不同的概念。 有分兩種,一種是最小堆積,另一種是最大堆積。
- 5[教學] 二元堆積(Binary Heap)、最小堆積(Min Heap) 與最大 ...
Binary Heap (二元堆積) 是一種常見的資料結構,適合需要取最大最小值的場合,也適合用來解決top-k 問題,同時也常被用來實作priortity queue (優先權 ...