Download presentation
Presentation is loading. Please wait.
Published byKimberly Kennedy Modified over 9 years ago
1
CE 221 Data Structures and Algorithms Chapter 6: Priority Queues (Binary Heaps) Text: Read Weiss, §6.1 – 6.3 1Izmir University of Economics
2
Source: Muangsin / Weiss2 Priority Queue (Heap) A kind of queue Dequeue gets element with the highest priority Priority is based on a comparable value (key) of each object (smaller value higher priority, or higher value higher priority) Example Applications: –printer -> print (dequeue) the shortest document first –operating system -> run (dequeue) the shortest job first –normal queue -> dequeue the first enqueued element first
3
Source: Muangsin / Weiss3 Priority Queue (Heap) Operations insert (enqueue) deleteMin (dequeue) –smaller value higher priority –Find / save the minimum element, delete it from structure and return it Priority Queue insertdeleteMin
4
Source: Muangsin / Weiss4 Implementation using Linked List Unsorted linked list –insert takes O(1) time –deleteMin takes O(N) time Sorted linked list –insert takes O(N) time –deleteMin takes O(1) time
5
Source: Muangsin / Weiss5 Implementation using Binary Search Tree insert takes O(log N) time on the average deleteMin takes O(log N) time on the average support other operations that are not required by priority queue (for example, findMax) deleteMin operations make the tree unbalanced
6
Source: Muangsin / Weiss 6 Binary Heap Implementation Property 1: Structure Property Binary tree & completely filled (bottom level is filled from left to right) (complete binary tree) if height is h, size between 2 h (bottom level has only one node) and 2 h+1 -1 A C G F B E J D HI
7
Source: Muangsin / Weiss7 Array Implementation of Binary Heap A C G F B E J D HI ABCDEFGHIJ 012345678910111213 left child is in position 2i right child is in position (2i+1) parent is in position floor(i/2) or integer division in C
8
Source: Muangsin / Weiss 8 Property 2: Heap Order Property (for Minimum Heap) Any node is smaller than (or equal to) all of its children (any subtree is a heap) Smallest element is at the root (findMin take O(1) time) 13 16 68 19 21 31 32 24 6526
9
Source: Muangsin / Weiss9 Insert 13 16 68 19 21 31 32 24 6526 Create a hole in the next available location Move the hole up (swap with its parent) until data can be placed in the hole without violating the heap order property (called percolate up) 13 16 68 19 21 32 24 6526 31
10
Source: Muangsin / Weiss10 Insert 13 16 68 19 21 31 32 24 6526 13 16 68 19 21 32 24 6526 31 Percolate Up -> move the place to put 14 up (move its parent down) until its parent <= 14 insert 14
11
Source: Muangsin / Weiss11 Insert 13 16 68 19 21 31 32 24 6526 13 16 68 19 21 31 32 24 6526 14
12
Source: Muangsin / Weiss12 deleteMin Create a hole at the root Move the hole down (swap with the smaller one of its children) until the last element of the heap can be placed in the hole without violating the heap order property (called percolate down) 13 16 68 19 21 31 32 19 6526 14 16 68 19 21 32 19 6526 14 31
13
Source: Muangsin / Weiss13 deleteMin 13 16 68 19 21 31 32 19 6526 14 16 68 19 21 32 19 6526 14 31 Percolate Down -> move the place to put 31 down (move its smaller child up) until its children >= 31
14
Source: Muangsin / Weiss14 deleteMin 16 68 19 21 32 19 6526 14 31 16 68 19 21 32 19 6526 14 31
15
Source: Muangsin / Weiss15 deleteMin 16 68 19 21 32 19 65 14 31 26 16 68 19 21 32 19 65 26 14 31
16
Source: Muangsin / Weiss16 Running Time insert –worst case: takes O(log N) time, moves an element from the bottom to the top –on average: takes a constant time (2.607 comparisons), moves an element up 1.607 levels deleteMin –worst case: takes O(log N) time –on average: takes O(log N) time (element that is placed at the root is large, so it is percolated almost to the bottom)
17
Implementation in C - HeapStruct 17 #define MinPQSize (10) #define MinData (-32767) typedef int ElementType; struct HeapStruct { int Capacity; int Size; ElementType *Elements; }; typedef struct HeapStruct *PriorityQueue;
18
Implementation in C - Initialize 18 PriorityQueue Initialize( int MaxElements ) { PriorityQueue H; if( MaxElements < MinPQSize ) Error( "Priority queue size is too small" ); H = malloc( sizeof( struct HeapStruct ) ); if( H ==NULL ) FatalError( "Out of space!!!" ); /* Allocate the array plus one extra for sentinel */ H->Elements = malloc((MaxElements + 1)*sizeof(ElementType)); if( H->Elements == NULL ) FatalError( "Out of space!!!" ); H->Capacity = MaxElements; H->Size = 0; H->Elements[ 0 ] = MinData; return H; }
19
19 int IsEmpty( PriorityQueue H ) { return H->Size == 0; } int IsFull( PriorityQueue H ) { return H->Size == H->Capacity; } Implementation in C – IsEmpty, IsFull
20
20 Implementation in C – Insert /* H->Element[ 0 ] is a sentinel */ void Insert( ElementType X, PriorityQueue H ) { int i; if( IsFull( H ) ) { Error( "Priority queue is full" ); return; } for( i = ++H->Size; H->Elements[ i / 2 ] > X; i /= 2 ) H->Elements[ i ] = H->Elements[ i / 2 ]; H->Elements[ i ] = X; }
21
21 Implementation in C – DeleteMin ElementType DeleteMin( PriorityQueue H ) { ElementType MinElement; if( IsEmpty( H ) ) { Error( "Priority queue is empty" ); return H->Elements[0]; } MinElement = H->Elements[ 1 ]; H->Elements[ 1 ] = H->Elements[ H->Size-- ]; percolateDown( H, 1 ); return MinElement; }
22
22 Implementation in C – percolateDown void percolateDown( PriorityQueue H, int hole ) { int child; ElementType tmp = H->Elements[ hole ]; for( ; hole * 2 Size; hole = child ) { /* Find smaller child */ child = hole * 2; if (child != H->Size && H->Elements[child+1] Elements[child]) child++; /* Percolate one level */ if( tmp > H->Elements[child] ) H->Elements[ hole ] = H->Elements[ child ]; else break; } H->Elements[ hole ] = tmp; }
23
Building a Heap Sometimes it is required to construct it from an initial collection of items O(NlogN) in the worst case. But insertions take O(1) on the average. Hence the question: is it possible to do any better? 23
24
buildHeap Algorithm General Algorithm Place the N items into the tree in any order, maintaining the structure property. Call buildHeap 24 void buildHeap( PriorityQueue H, int N ) { int i; for( i = N / 2; i > 0; i-- ) percolateDown( H, i ); }
25
buildHeap Example - I 25 initial heap after percolateDown(7) after percolateDown(6) after percolateDown(5)
26
26 buildHeap Example - II after percolateDown(4) after percolateDown(3) after percolateDown(2) after percolateDown(1)
27
Complexity of buildHeap The number of dashed lines must be bounded which can simply be done by computing the sum of the heights of all the nodes in the heap. Theorem: For a perfect binary tree of height h with N=2 h+1 -1 nodes, this sum is 2 h+1 -1-(h+1). Proof: number of nodes in a complete tree of height h is less than or equal to the the number of nodes in a perfect binary tree of the same height. Therefore, O(N) 27
28
Homework Assignments 6.2, 6.3, 6.4, 6.10.a, 6.38 You are requested to study and solve the exercises. Note that these are for you to practice only. You are not to deliver the results to me. 28
Similar presentations
© 2024 SlidePlayer.com. Inc.
All rights reserved.