written by Wei-ShenLai 3 累堆(Heaps)
Download
Report
Transcript written by Wei-ShenLai 3 累堆(Heaps)
第十章
堆積(Heap)
10-1 Heap
10-2 Min-Heap
10-3 Min-max Heap
10-4 Deap
written by Wei-ShenLai
1
累堆(Heaps)
root
節點的鍵值大於
子節點的鍵值
Tleft
Tright
定義:最大樹( max tree )是一種樹,其中每一節點的鍵值不小於
他的子節點的( 如果有存在的話 )鍵值.最大累堆( max heap )為一
種也是最大樹的完整二元樹。
root
節點的鍵值小於
子節點的鍵值
Tleft
Tright
定義:最小樹( min tree )是一種樹,其中每一節點的鍵值不大於
他的子節點的鍵值( 如果有存在的話 ) .最小累堆( min heap )為一
種也是最小樹的完整二元樹。
written by Wei-ShenLai
2
累堆(Heaps):資料結構思維
因為為完全樹所以可以以陣列表示。
Parent(i)’s index=
2
Left_Child(i)’s index=2*i
Right_Child(i)’s index=2*i+1
i
A
B
written by Wei-ShenLai
[1]
[2]
C
[3]
D
E
F
G
[4]
[5]
[6]
[7]
3
累堆(Heaps):新增元素
想法:
因為必須滿足完全樹的定義,所以將元素加入陣列末端為使用的元素中。
由最末端逐一比對父元素與子元素的鍵值。大鍵值當父元素,小鍵值當子
元素。
void insert_max_heap(element item,int *n){
int i;
i=++(*n);
while((i!=1) && (item.key > heap[i/2].key)){
heap[i]=heap[i/2];
i=i/2;
}
}
複雜度:Q(log2n)
20
20
20
5<20
15
14
written by Wei-ShenLai
2
10
5
15
14
10
5
換記一
錄路
小往
2
的上
資與
5>2 料比
作新
交增
14
14
5
10
2
4
累堆(Heaps):刪除最大節點
想法:
取出最大節點。
取出後的陣列中最末的一個節點temp。刪除之。
由上(1)往下找一個適合放置temp的位置。
每次判斷左右節點走向鍵值大的節點。
void delete_max_heap(int *n){
item=heap[1];
temp=heap[(*n)--];
parent=1;
child=2;
while(child <=*n){
if(child < *n) && (heap[child].key < heap[child+1].key)
child++;
if(temp.key >= heap[child].key) break;
heap[parent]=heap[child];
parent=child;
20
child=child*2;
2
15
}
heap[parent]=temp;
}
15 與最後一 5
筆資料交
換
複雜度:Q(log2n)
14
written by Wei-ShenLai
10
2
15
5
取最大值
14
10
取最大值
一
路
往
下
取
最
大
值
14
2
5
10
5
二元樹調整為Heap的作法
由第└ n/2 ┘個節點開始調整為Heap至第1個節點(樹根)。
1
2
4
8
5
5
48
910
4
8
910
2
8
15
1
written by Wei-ShenLai
6
61
19
1
910
4
11
59
910
7
26
77
5
1
3
19
61
48
15
6
61
6
19
11
3
59
7
5
26
71
77
910
7
59
8
61
15
2
19
5
5
48
3
11
5
48
77
1
77
5
4
26
5
26
5
48
7
59
8
1
4
11
2
19
1
15
6
61
1
2
3
77
1
15
1
26
6
11
3
59
2
7
4
8
15
61
59
5
48
1
910
5
19
6
11
3
26
7
6
Min-Max Heap
以Min Heap與Max Heap交互構成。
min
10
max
40
min
max
45
19
32
written by Wei-ShenLai
13
28
34
18
31
24
15
35
42
33
7
新增節點
min
10
max
40
min
19
max
32
28
min
34
31
40
min
5
19
32
45
13
28
written by Wei-ShenLai
34
18
31
1.先與父節點檢查是否符
合父節點的Heap規則
5
min
10
max
max
45
2.再往樹根方向檢查目前
節點的Heap規則
13
18
15
5
18
10
5
max
40
15 min
max
45
19
32
13
28
34
10
31
18
50
15
50
45
8
刪除節點
min
5
max
40
min
45
1.先與子節點檢查是否符
合新增節點的Heap規則
13
10
2.再往樹葉方向檢查目前
節點的Heap規則
19
max
32
28
34
31
18
5
40
19
32
28
5
45
34
18
13
34
10
31
19
written by Wei-ShenLai
15
18
40
15
19
32
45
34
13
28
34
10
31
15
20
20
9
Deap
deap是一雙向累堆(double-ended heap),它支援雙向優先權佇列的運算如插入、刪除最小、
最大元素的運算。
義:deap是一個完整二元樹,他是是空的獲滿足下列特性:
根不包含元素
左子樹是一個最小堆積
右子樹是一個最大堆積
Min Heap
Max Heap
5
35
12
18
21
16
25
30
27
22
32
29
右大於左
written by Wei-ShenLai
10
新增節點於Deap
Min Heap
Max Heap
5
35
12
18
21
16
25
8
30
27
22
21
32
29
右大於左
5
35
33
8
33
32
25
i 2 log 2 i 1
40
5
12
21
30
35
35
2
32
12
21
30
32
5
18
16
25
27
22
30
29
26
18
16
25
27
21
40
22
written by Wei-ShenLai
22
29
26
2
27
11
刪除Deap中的節點
Min Heap
12
16
22
29
5
35
12
15
Max Heap
21
16
25
30
27
22
32
29
29
5
12
18
25
16
35
26
21
25
26
written by Wei-ShenLai
12
30
27
22
32
29
26
16
18
28
5
35
12
21
16
25
30
27
22
32
28
26
28
28
12