Priority Queues and Heaps
Priority Queues and Heaps
class LexCompare {
public:
int operator()(Point a, Point b) {
if (a.x < b.x) return –1;
else if (a.x > b.x) return +1;
else if (a.y < b.y) return –1;
else if (a.y > b.y) return +1;
else return 0;
}
};
Total Order Relation
5 6
9 7
What is a heap?
• A heap is a binary tree storing • The last node of a heap is
keys at its internal nodes and the rightmost internal
satisfying the following node of depth h 1
properties:
• Heap-Order: for every internal
2
node v other than the root,
key(v) key(parent(v))
5 6
• Complete Binary Tree: let h be
the height of the heap
• for i 0, … , h 1, there are 9 7
2i nodes of depth i
• at depth h 1, the internal
nodes are to the left of the leaf
nodes
last node
Height of a Heap
• Theorem: A heap storing n keys has height O(log n)
• Proof: (we apply the complete binary tree property)
• Let h be the height of a heap storing n keys
• Since there are 2i keys at depth i 0, … , h 2 and at least one key at
depth h 1, we have n 1 2 4 … 2h2 1
• Thus, n 2h1 , i.e., h log n 1
depth keys
0 1
1 2
h2 2h2
h1 1
Exercise: Heaps
• Where may an item with the largest key be stored
in a heap?
• True or False:
• A pre-order traversal of a heap will list out its keys in
sorted order. Prove it is true or provide a counter
example.
(2, Sue)
2 1
5 1 5 2
z z
9 7 6 9 7 6
Removal from a Heap
• Method removeMin of 2
the priority queue ADT
corresponds to the 5 6
removal of the root key w
from the heap 9 7
• The removal algorithm
consists of three steps last node
• Replace the root key
with the key of the last 7
node w
• Compress w and its 5
w
6
children into a leaf
9
• Restore the heap-order
property (discussed
next)
Downheap
• After replacing the root key with the key k of the last node, the heap-
order property may be violated
• Algorithm downheap restores the heap property by swapping key k with
the child with the smallest key along a downward path from the root
• Downheap terminates when key k reaches a leaf or a node whose
children have keys greater than or equal to k
• Since a heap has height O(log n), downheap runs in O(log n) time
7 5
5 6 7 6
w w
9 9
Updating the Last Node
• The insertion node can be found by traversing a path of O(log n)
nodes
• Go up until a left child or the root is reached
• If a left child is reached, go to the right child
• Go down left until a leaf is reached
• Similar algorithm for updating the last node after a removal
Heap-Sort
16 15 4 12 6 9 23 20
Example
25 5 11 27
16 15 4 12 6 9 23 20
Example
15 4 6 20
16 25 5 12 11 9 23 27
Example
7 8
15 4 6 20
16 25 5 12 11 9 23 27
Example
4 6
15 5 8 20
16 25 7 12 11 9 23 27
Example
10
4 6
15 5 8 20
16 25 7 12 11 9 23 27
Example
4
5 6
15 7 8 20
16 25 10 12 11 9 23 27
Analysis
• At each level we insert 2i nodes
• Each node can generate h-i swaps
Analysis
• At each level we insert 2i nodes
• Each node can generate h-i swaps
2i
Analysis
• At each level we insert 2i nodes
• Each node can generate h-i swaps
hi
Analysis
• At each level we insert 2i nodes
• Each node can generate h-i swaps
h 1
2 (h i )
i 0
i
Analysis
• At each level we insert 2i nodes
• Each node can generate h-i swaps
h 1
2 (h i ) 2
i 0
i h 1
(h 2)
Analysis
• At each level we insert 2i nodes
• Each node can generate h-i swaps
h 1
2 (h i) 2n (log(n) 2)
i 0
i
Analysis
• At each level we insert 2i nodes
• Each node can generate h-i swaps
• Thus, bottom-up heap construction runs in O(n) time
• Bottom-up heap construction is faster than n successive
insertions and speeds up the first phase of heap-sort
Exercise: Bottom-up Heap
1 g 4 e
Locators
• A locator identifies and tracks an item (key, element) within
a data structure
• A locator sticks with a specific item, even if that element
changes its position in the data structure
• Intuitive notion:
• claim check
• reservation number
• Methods of the locator ADT:
• key(): returns the key of the item associated with the locator
• element(): returns the element of the item associated with the
locator
Locator-based Methods
• Locator-based priority queue Locator-based dictionary
methods: methods:
• insert(k, o): inserts the item (k, • insert(k, o): inserts the item (k,
o) and returns a locator for it o) and returns its locator
• min(): returns the locator of an • find(k): if the dictionary contains
item with smallest key an item with key k, returns its
• remove(l): remove the item locator, else return a special null
with locator l locator
• replaceKey(l, k): replaces the • remove(l): removes the item
key of the item with locator l with locator l and returns its
• replaceElement(l, o): replaces element
with o the element of the item • locators(), replaceKey(l, k),
with locator l replaceElement(l, o)
• locators(): returns an iterator
over the locators of the items
in the priority queue
Possible Implementation
• The locator is an 6 d
object storing
• key 3 a 9 b
• element
• position (or rank) of
the item in the
underlying structure
• In turn, the position
(or array cell) stores
the locator
• Example:
• binary search tree
with locators
1 g 4 e 8 c
Positions vs. Locators
• Position • Locator
• represents a “place” in a data • identifies and tracks a (key,
structure element) item
• related to other positions in • unrelated to other locators in
the data structure (e.g., the data structure
previous/next or parent/child) • often implemented as an object
• often implemented as a storing the item and its position
pointer to a node or the index in the underlying structure
of an array cell • Key-based ADTs (e.g., priority
• Position-based ADTs (e.g., queue and dictionary) can be
sequence and tree) are augmented with locator-based
fundamental data storage methods
schemes