Priority Queues, Heaps
-
Upload
amos-baker -
Category
Documents
-
view
44 -
download
4
description
Transcript of Priority Queues, Heaps
2
Goals
• Describe a priority queue at the logical level and implement a priority queue as a list
• Describe the shape and order property of a heap and implement a heap in a nonlinked tree representation in an array
• Implement a priority queue as a heap
• Compare the implementations of a priority queue using a heap, a linked list, and a binary search tree
3
Priority Queue
Priority QueueAn ADT in which only the item with the highest priority can be accessed
4
Priority Queue
Items on a priority queue are made up of
<data, priority> pairs
Can you think of how a priority queue might be implemented as
An unsorted list?
An array-based sorted list?
A linked sorted list?
A binary search tree?
5
Heaps
HeapA complete binary tree, each of whose elements contains a value that is greater than or equal to the value of each of its children
Remember?Complete tree
10
Heaps
70
60
40 30
12
8
treePtr
Can we use this fact to implement an efficient PQ?
Whereis the
largestelement?
11
Heaps
We have immediate access to highest priority item BUT if we remove it, the structure isn't a heap
Can we "fix" the problem efficiently?
15
Heaps
template<class ItemType>
struct HeapType
{
void reheapDown(int root, int bottom);
…
ItemType* elements; // Dynamic array
int numElements;
}
17
Heaps
70
0
60
1
40
3
30
4
12
2
8
5
tree[ 0 ]
[ 1 ]
[ 2 ]
[ 3 ]
[ 4 ]
[ 5 ]
[ 6 ]
70
60
12
40
30
8
elements
Use number as index
18
Heaps
ReapDown(heap, root, bottom)
if heap.elements[root] is not a leaf
Set maxChild to index of child with larger value
if heap.elements[root] < heap.elements[maxChild]
Swap(heap.elements[root], heap.elements[maxChild])
ReheapDown(heap, maxChild, bottom)
What variables do we need?
Where are a node's children?
19
Heaps
// IMPLEMENTATION OF RECURSIVE HEAP MEMBER FUNCTIONSvoid HeapType<ItemType>::ReheapDown(int root, int bottom)// Pre: ItemType overloads the relational operators// root is the index of the node that may violate the // heap order property// Post: Heap order property is restored between root and // bottom
{ int maxChild ; int rightChild ; int leftChild ;
leftChild = root * 2 + 1 ; rightChild = root * 2 + 2 ;
20
Heaps if (leftChild <= bottom) // ReheapDown continued { if (leftChild == bottom) maxChild = leftChld; else { if (elements[leftChild] <= elements[rightChild]) maxChild = rightChild; else maxChild = leftChild; } if (elements[root] < elements[maxChild]) { Swap(elements[root], elements[maxChild]); ReheapDown(maxChild, bottom); } }}
24
void HeapType::ReheapUp(int root, int bottom)// Pre: ItemType overloads the relational operators// bottom is the index of the node that may violate// the heap order property. The order property is // satisfied from root to next-to-last node.// Post:Heap order property is restored between root and// bottom{ int parent; if (bottom > root) { parent = ( bottom - 1 ) / 2; if (elements[parent] < elements[bottom]) { Swap(elements[parent], elements[bottom]); ReheapUp(root, parent); } }}
26
Priority Queuesclass FullPQ(){};class EmptyPQ(){};template<class ItemType>class PQType{public: PQType(int); ~PQType(); void MakeEmpty(); bool IsEmpty() const; bool IsFull() const; void Enqueue(ItemType newItem); void Dequeue(ItemType& item);private: int length; HeapType<ItemType> items; int maxItems;};
27
Priority Queuestemplate<class ItemType>PQType<ItemType>::PQType(int max){ maxItems = max; items.elements = new ItemType[max]; length = 0;}template<class ItemType>void PQType<ItemType>::MakeEmpty(){ length = 0;}template<class ItemType>PQType<ItemType>::~PQType(){ delete [] items.elements;}
28
Priority Queues
DequeueSet item to root element from queueMove last leaf element into root positionDecrement lengthitems.ReheapDown(0, length-1)
EnqueueIncrement lengthPut newItem in next available positionitems.ReheapUp(0, length-1)
29
Priority Queues
template<class ItemType>void PQType<ItemType>::Dequeue(ItemType& item){ if (length == 0) throw EmptyPQ(); else { item = items.elements[0]; items.elements[0] = items.elements[length-1]; length--; items.ReheapDown(0, length-1); }}
30
Priority Queues
template<class ItemType>void PQType<ItemType>::Enqueue(ItemType newItem){ if (length == maxItems) throw FullPQ(); else { length++; items.elements[length-1] = newItem; items.ReheapUp(0, length-1); }}