Priority Queues
• Container of elements where each element has an associated key
• A key is an attribute that can identify rank or weight of an element
• Examples – passenger, todo list
What is a Priority Queue?
Priority Queue ADT Operations
• size()• isEmpty()• insertItem(k, e) – insert element e with key k• minElement() – return ref to min element• minKey() – return const ref to smallest key• removeMin() – remove and return element with
smallest key
Example
• insertItem(5, A)• insertItem(9, C)• insertItem(3, B)• insertItem(7, D)• minElement()• minKey()• removeMin()
• size()• minElement()• removeMin()• removeMin()• removeMin()• removeMin()• isEmpty()
Implementation
• Using an array?
• Using a linked list?
• Using a binary search tree?
• Running time of insertItem/removeMin?
Heaps
• A heap is a priority queue implemented with a binary tree
Heaps
• Heap-Order Property: In a heap T, for every node v other than the root, the key stored at v is greater than or equal to the key stored at v’s parent
Heaps
• Complete Binary Tree Property: A heap T with height h is a complete binary tree, that is, levels 0,1,2,…,h-1of T have the maximum number of nodes possible and all the internal nodes are to the left of the external nodes in level h-1.
• What does this give us?
Example Heap
7 9
4
56 101115
root
Heap Implementation
• Insertion algorithm
7 9
4
56 101115
root
5new_node
Up-Heap Bubbling
while new node is smaller than its parentmove parent down
• Running time?
Heap Implementation
• Deletion algorithm
5 9
4
56 10117
root
15
delete 4
Down-Heap Bubbling
if right child is null
if left child is null
insert
else if left child is smaller than current
move left up
if both children not null
move up smallest child
Vector Implementation
• Children are positions index*2 and index*2+1
• Implementation of insert and remove?
0 1 2 3 4 5 6 7
Heap Sort
• Algorithm to use a heap to sort a list of numbers
• Running time?
BuildHeap Algorithm
• Goal: Insert N items into initially empty heap
• Algorithm 1: Perform N inserts– Worst-case running time?
Efficient BuildHeap
• Idea: Start at level h-1 and bubble down nodes 1 at a time
for(int i = currentSize/2; i > 0; i--)
percolateDown(i);
Running Time
• Running time is no more than the sum of the heights of all nodes
15 9
56
7 10114
root
BuildHeap Proof
• Theorem: For the perfect binary tree of height h containing 2h+1-1 nodes, the sum of the heights of the nodes is 2h+1-1-(h+1)
• Proof: 1 node at height h, 2 nodes at height h-1, 22 nodes at height h-1, 2i nodes at height h-i
h
• Sum S = ∑ 2i(h-i) i=0
BuildHeap Proof
• S = h+2(h-1)+4(h-2) +...+2h-1(1) + 2h(0)
• 2S = 2h + 4(h-1) + 8(h-2)+ ... +2h(1)
• 2S-S = -h + 2 + 4 + 8 + ... + 2h-1 + 2h
• = 2h+1 -1 - 1 - h
• = 2h+1 -1 - (h+1)
• = < 2N (N = 2h -> 2h+1)
• = O(N)
Event Simulation
• Bank simulation using priority queues?