heap

5
Heap Posted by basicalgorithm on December 7, 2009 Heap là một trong những cấu trúc dữ liệu đặc biệt quan trọng, nó giúp ta có thể giải được nhiều bài toán trong thời gian cho phép. Độ phức tạp thông thường khi làm việc với Heap là O(lgN). Heap thực chất là một cây cân bằng thỏa mãn các điều kiện sau: - Một nút có không quá 2 nút con. - Với Heap Max thì nút gốc là nút lớn nhất, mọi nút con đều không lớn hơn nút cha của nó. Với Heap Min thì ngược lại. Mặc dù được mô tả như cây nhưng Heap có thể được biểu diễn bằng mảng. Nút con của nút i 2*i 2*i+1. Do Heap là cây cân bằng nên độ cao của 1 nút luôn <=lgN. Ứng dụng chủ yếu của Heap là tìm Min, Max trong 1 tập hợp động (có thể thay đổi, thêm, bớt các phần tử) nhưng như vậy đã là quá đủ. Mô hình biểu diễn Heap bằng cây nhị phân và bằng mảng Các thao tác thường dùng đối với Heap Max (với Heap Min thì làm ngược lại): 1/ Khai báo và thủ tục đổi chỗ 2 phần tử: Ở ví dụ này, Heap sẽ là mảng một chiều kiểu LongInt, nHeap là số phần tử của mảng.

Upload: sonanui888

Post on 08-Sep-2015

213 views

Category:

Documents


1 download

DESCRIPTION

Heap

TRANSCRIPT

HeapPosted bybasicalgorithmon December 7, 2009

Heap l mt trong nhng cu trc d liu c bit quan trng, n gip ta c th gii c nhiu bi ton trong thi gian cho php. phc tp thng thng khi lm vic vi Heap lO(lgN).Heap thc cht l mt cy cn bng tha mn cc iu kin sau: - Mt nt c khng qu 2 nt con. - Vi Heap Max th nt gc l nt ln nht, mi nt con u khng ln hn nt cha ca n. Vi Heap Min th ngc li. Mc d c m t nh cy nhng Heap c th c biu din bng mng. Nt con ca ntil2*iv2*i+1. Do Heap l cy cn bng nn cao ca 1 nt lun nHeap then exit;// Nu i khng c nt con th khng lm vic if (j < nHeap) and (Heap[j] < Heap[j+1]) then Inc(j);// Nu i c 2 nt con th chn nt u tin hn if Heap[i] < Heap[j] then// Nu nt cha nh hn nt con begin swap(Heap[i] , Heap[j]);// i ch 2 phn t trong Heap DownHeap(j);// Tip tc di chuyn xung di end; end;4/ Push: a 1 phn t mi vo Heap: Thm 1 nt vo cui Heap v tin hnhUpHeapt y:

Procedure Push(x : LongInt); begin Inc(nHeap);// Tng s phn t ca Heap Heap[nHeap] := x;// Thm x vo Heap UpHeap(nHeap); end;5/ Pop: Rt ra 1 phn t v trvtrong Heap: GnHeap[v] := Heap[nHeap]ri tin hnh chnh li Heap:

Function Pop(v : LongInt) : LongInt; begin Pop := Heap[v];// Ly phn t v tr v ra khi Heap Heap[v] := Heap[nHeap];// a phn t cui Heap vo v tr v Dec(nHeap);// Gim s phn t ca Heap i 1 {Chnh li Heap} UpHeap(v); DownHeap(v); end; Ngoi ra, khi s dng thut tonDijkstra/Primkt hp cu trc Heap, bn cn c th s dng cch Push v Pop khc thun li hn so vi cch trnh by trn:

1/ Update Dijkstra: Procedure Update(v : LongInt);// nh v va c sa nhn, cn chnh li Heap var child , parent : LongInt; begin child := pos[v];// child l v tr ca nh v trong Heap if child = 0 then// Nu nh v cha c trong Heap begin Inc(nHeap);// Tng s phn t ca Heap child := nHeap;// a v vo cui Heap end; parent := child div 2;// parent l nt cha ca child while (parent > 0) and (d[Heap[parent]] > d[v]) do// Nu nh nt parent km u tin hn v th b ko xung nt child begin Heap[child] := Heap[parent];// y nh c lu trong nt cha xung nt con pos[Heap[child]] := child;// Ghi nhn li v tr mi ca nh child := parent;// Tip tc di chuyn ln parent := child div 2; end; Heap[child] := v;// Thao tc ko xung trn s to ra 1 trng nt child t v vo pos[v] := child;// Ghi nhn v tr mi ca nh v trong Heap end;2/ Pop Dijkstra: Function Pop : LongInt;// Ly t Heap nh c nhn t do nh nht var r , v , c : LongInt; begin Pop := Heap[1];// Nt gc l nt c nhn t do nh nht v := Heap[nHeap];// v l nh nt l cui Heap, s c o ln u v vun ng Dec(nHeap);// Gim s phn t ca Heap r := 1;// Bt u t nt gc while r*2 d[Heap[c+1]]) then Inc(c);// Trong 2 nt con chn nt con cha nh u tin hn if d[Heap[c]] >= d[v] then break;// Nu v u tin hn th khng lm vic na Heap[r] := Heap[c];// Chuyn nh lu nt con ln nt cha pos[Heap[r]] := r;// Cp nht li v tr mi trong Heap ca nh r := c;// Tip tc di chuyn xung di end; Heap[r] := v;// nh v c t vo v tr r m bo cu trc Heap pos[v] := r;// Ghi nhn v tr mi ca nh v trong Heap end;