heap
DESCRIPTION
HeapTRANSCRIPT
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;