BI NARY HEAPS
Binary Trees in Contiguous Storage ตัวเลขแทนตํ าแหนง 1 ของขอมูลใน array 2 3 4 5 6 7 9 10 8 11 15 12 13 14 23 16 18 21 22 25 26 27 30 17 19 20 24 28 29 31 1 2 3 4 5 6 7 26 27 28 29 30 31 ลูกทางซายของจุดที่ตํ าแหนง k จะอยูที่ตํ าแหนงที่ 2 k " ขวา " " " " 2 k +1 S. Prasitjutrakul 1994
Binary Trees in Contiguous Storage ตัวเลขแทนตํ าแหนง 0 ของขอมูลใน array 1 2 3 4 5 6 8 9 7 10 14 11 12 13 22 15 17 20 21 24 25 26 29 16 18 19 23 27 28 30 0 1 2 3 4 5 6 25 26 27 28 29 30 ลูกทางซายของจุดที่ตํ าแหนง k จะอยูที่ตํ าแหนงที่ 2 k +1 " ขวา " " " " 2 k +2 S. Prasitjutrakul 1994
Binary Trees in Contiguous Storage a a y y r r a y - r a - y - - - r 0 1 2 3 0 1 2 3 4 5 6 a c b e f g d h a b c d e f g h 0 1 2 3 4 5 6 7 S. Prasitjutrakul 1994
Heaps Heap คือตนไมแบบทวิภาคที่มีคียของขอมูลกํ ากับจุด โดยที่ ทุกๆใบในตนไมจะอยูในระดับเดียวกัน หรือระดับที่ติดกัน ! จุดในทุกๆระดับจะเต็ม ยกเวนระดับลางสุด ! ใบในระดับลางสุด จะอยูชิดทางซาย ! คียของขอมูลที่จุดระดับพอ / แม จะมีคามากกวาคียของลูกหลาน ! ตนไมยอยทั้งสองของจุดใดๆ ก็คือ heap เชนกัน ! Y R P F B K D Y R P D F B K A C E C E A 0 1 2 3 4 5 6 7 8 9 S. Prasitjutrakul 1994
Heapify B B R P R P D K D F E K E F Heap Heap R > P A C A C B R P D F E K A C B R P D F E K A C 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 R R O (log ) n P B P F D F E K D E K B D < F Heap A C A C R B P D F E K A C R F P D B E K A C 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 S. Prasitjutrakul 1994
Heapify void Heapify( ListType *pHeap, int i ) { int largest; left = LeftHeap( i ); right = RightHeap( i ); largest = i; if ( left <= pHeap->count-1 ) && GT( pHeap->entry[left].key, pHeap->entry[largest].key ) ) largest = left; if ( right <= pHeap->count-1 ) && GT( pHeap->entry[right].key, pHeap->entry[largest].key ) ) largest = right; if ( largest != i ) { Swap( pHeap, i, largest ); Heapify( pHeap, largest ); } } S. Prasitjutrakul 1994
Heaps : Deletion C Y Heapify deleted R P R P D K D F B K B F R > P A A C Y R P D F B K A C C R P D F B K A - 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 R R O (log ) n P C P F D F B K D B K C D < F A A R C P D F B K A - R F P D C B K A - 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 S. Prasitjutrakul 1994
Heaps : I nsertion Y Y R P R P D K B K F D F B A A X X Y R P D F B K A Y R P D F B K A X 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 Y Y O (log ) n R X P P F B K R F B K X A D A D Y R P X F B K A D Y X P R F B K A D 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 S. Prasitjutrakul 1994
Building a Heap D D A C A C B G F B G I F I Heapify H E H E D A C B I F G H E D A C B I F G H E 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 D D A C A C H F G H G I F I Heapify Heapify E B E B D A C H I F G B E D A C H I F G B E 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 S. Prasitjutrakul 1994
Building a Heap D H H I C C E G E G F F D I Heapify A B A B H I C E D F G B A D H C E I F G B A 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 O (log ) n S. Prasitjutrakul 1994
Heapsort R A A H R W R X H W H K A K K R X W Heap A A K A H H A H K S. Prasitjutrakul 1994
Heapsort Y P R F P K BuildHeap D A O ( n ) F B R B K Y D A C C Y R P D F B K A C P F K A R B Y D C R P F F P K D D C B K C B A Y A R Y F C R P D B K A Y P F K D C Y B A R S. Prasitjutrakul 1994
Heapsort K F F D B B D A C A C K P P R Y R Y K F B C Y F D B C Y D A P R A K P R C D A C B B D A F K F K P P R Y R Y A F D C B A F Y C B D K P R Y K P R S. Prasitjutrakul 1994
Heapsort B A B A C C D D F K F K P P R Y R Y F A B F Y B A C Y C D K P R D K P R The total number of comparisons n ∑ = + + + 2 log i 2 (log 1 log 2 ... log n ) 2 2 2 2 = i 1 = ⋅ ⋅ ⋅ = 2 log ( 1 2 ... ) n 2 log n ! 2 2 ≈ − 2 n log n 3 n 2 = O n ( log ) n S. Prasitjutrakul 1994
Heapsort void Heapsort( ListType *pList ) { int i; BuildHeap( pList ); for ( i=pList->count-1; i>=1; i-- ) { Swap( pList, 0, i ); Heapify( pList, i ); } } BuildHeap( ListType *pList ) { int i; for (i=pList->count/2; i>=0; i--) Heapify( pList, i ); } S. Prasitjutrakul 1994
Priority Queues Two operations Insert : Insert an item ! ExtractMax : Remove the item having the largest key ! Insert : 23 17 31 * * 99 87 * * * ExtractMax : 31 23 99 87 23 Implementations : ExtractMax Insert Sorted contiguous list O ( n ) O (1) Binary search tree O (log n ) avg. O (log n ) avg. Heap O (log n ) O (log n ) S. Prasitjutrakul 1994
Recommend
More recommend