Lecture
24: Priority Queues
conceptual
picture:
operations:
·
initialize
- create an empty priority queue
·
insert a priority (perhaps with associated info)
·
remove & return the highest priority item (& assoc. data)
·
isEmpty
Example:
insert
1, 5, 10,
2, 6
then remove 5 times:
from
normal queue: 1, 5,
10, 2, 6
from
priority queue: 10, 6, 5, 2, 1
application:
event (or task) scheduling –
e.g., "To Do" list
To implement a priority queue: use a HEAP
·
a
balanced binary tree
height always O(log N) where N is the # of nodes
·
each
node has a Comparable key value
·
tree
has the following order and shape properties:
the order property:
for
every node n,
n's key is ³ all keys in its subtrees
the shape property
1.
all
leaves are at depty d or d-1 (for some
d)
2.
all
leaves at depth d are to the left of the leaves at depth d-1
3.
at most one node has just one child
that child is the left child of its parent
it is the rightmost leaf at depth d
Valid
heap: Valid heap shapes:
·
a
heap is not a BST!
Invalid heap shapes
no (leaves are at depth 2 and 4)
violates
shape property 1
no (leaf at depth 2 is to the left of leaves at
depth
3 – violates property 2)
no (more than one node has just one child)
violates property 3
no (one child node is the right child)
violates property 3
no (one
child is leftmost leaf at depth d)
violates property 3
You try: which of these are heaps?
(1)
(2)
(3) (4) (5)
(6) (7)
Solutions
yes: (2), (4), (5), (6)
no:
(1), (3), (7)
More
trees that have the shape property:
More
examples
valid doesn't have the order property
Note:
·
these
heaps (with max at the root) are sometimes called max-heaps
·
can
also have min-heap (value at n is
£
value of children)
To implement a heap, use an array
·
each
node corresponds to one position in the array
·
array[0]
is not used (empty or set to null)
·
the
root is in array[1]
·
simple
array indexing: for a node in array[k]
o
left
child is in array[2k]
o
right
child is in array[2k+1]
o
parent
is in array[k/2] - integer divide w/ truncation
Example
Note: shape property guarantees that there are no
"holes" in the array!
Priority Queue: insert(p)
need to insert a new item (priority) so that
·
heap
still has the shape and order properties
·
time
is reasonable – i.e., O(log N) where N = # of values in the queue
step 1: add new
value at the end of the array
old new
new rightmost leaf
at depth d
new leaf at depth d+1
step
2: compare new value with parent
if
wrong order (child > parent) then swap
repeat
up the tree until no further swaps are needed
Example:
insert 8
leave alone swap
You try: insert 20
2 6 7 8 9 5 20 3 0
1 2 3
4 5 6
7 8
…
9 7 8
2 6 3
5 20
solution:
Priority Queue: remove( )
·
highest
priority is always at array[1] (the
root)
·
save
array[1] and return it after removing the root
·
to
remove the root (while keeping order and shape):
step 1:
o
replace
root with value at the end of the array
(rightmost
leaf at depth d) –
o
remove
that leaf
step 2:
o
if
root <
a child then swap with the larger child
o
repeat
as needed down the tree
Example:
remove
( )
(2)
(1)
(3)
You try: remove again
Runtime efficiency for insert
and remove
insert:
·
add
a value at the end of the array: O(1)
·
swap
values up the tree: worst case is all
the way up
O(h) =
O(log N) where N is the # of values in heap
removeMax:
·
get
value from root: O(1)
·
replace
with value at the end of the array
worst case: swap with a
value at every level
O(h) = O(log N)
Note: efficiency of insert and remove for a heap
are the same as
for a priority queue implemented using a 2-3
tree,
but
·
less
space overhead
·
much
simpler to program