Title: Priority Queues and Heaps
1Priority Queues and Heaps
2Priority Queues
- We already know a standard queue
- Elements can only be added to the start of the
queue - Elements can only be removed from the end of the
queue - Order of removal is FIFO (first in, first out)
3Priority Queues
- In a Priority Queue, each element is assigned a
priority as well - A priority is a numeric value the lower the
number, the higher the priority - Elements are removed in order of their priority
no longer FIFO - Can still add elements in any order
4Priority Queues
- public interface PriorityQueueltTgt
-
- void add(T element)
- T remove()
- T peek()
5Priority Queues
- The interface to a priority queue is almost the
same as to a regular queue - However, elements in the queue must now be of the
type Comparable (i.e. implement the interface) - The remove method always returns the element with
highest priority (lowest numeric value)
6Priority Queues
- A Priority Queue is an abstract data structure,
which can be implemented in various ways - Linked list, removal will be O(n)
- Binary search tree, removal will usually be
O(log(n)), but not always - Heap, removal will always be O(log(n))
7Heaps
- A Heap is a Binary Tree, but not a Binary Search
Tree - In order for a Binary Tree to be a Heap, two
conditions must be fulfilled - A heap is almost complete only nodes missing in
bottom layer - All nodes store values which are at most as large
as the values stored in any descendant
8Heaps
9Heaps
- On a heap, only two operations are of interest
- Insert a new element
- Remove the element with lowest value, i.e. the
root element - However, both of these operations must preserve
the heap property of the tree
10Heaps - insertion
23
32
29
42
56
37
Find an empty slot in the tree
11Heaps - insertion
23
32
29
42
If the value in the parent is larger than the new
value, swap the parent and the new slot (repeat
this)
56
37
12Heaps - insertion
23
32
29
32
56
37
42
Now insert the new value
13Heaps - insertion
- Since the heap is almost complete, the number
of layers in a tree with n nodes is at most
(log(n) 1) - Each swap operation can be done in constant time,
so insertion of an element has the run-time
complexity O(log(n))
14Heaps - removal
Remove the root node (always smallest)
23
29
32
56
37
42
15Heaps - removal
29
32
Move the last element into the root position
56
37
42
16Heaps - removal
If any child has a lower value, swap position
with child with lowest value (repeat this)
42
29
32
56
37
17Heaps - removal
If any child has a lower value, swap position
with child with lowest value (repeat this)
29
42
32
56
37
18Heaps - removal
The heap property has now been reestablished This
is known as fixing the heap
29
37
32
56
42
19Heaps - removal
- Since the heap is almost complete, the number
of layers in a tree with n nodes is at most
(log(n) 1) - Each swap operation can be done in constant time,
so deletion of an element has the run-time
complexity O(log(n))
20Heaps - removal
- The important point is that for a heap, we are
guaranteed O(log(n)) run time for insertion and
deletion - This cannot be guaranteed for a binary search
tree - A binary search tree can degenerate into a
linked list a heap cannot
21Heaps - representation
- Due to the regularity of a heap, it can
efficiently be stored in an array - Root node is stored in position 1 (not 0)
- A node in position i has its children stored in
position 2i and (2i 1) - A node in position i has its parent stored in
position i/2 (integer division) - When running out of space, double the size
22Heapsort
- A heap can be used for a quite efficient way of
sorting an array of n objects - Run-time complexity of O(nlog(n))
- Does not use extra space
- Main steps
- Turn the array into a heap
- Repeatedly remove the root element (which has the
smallest value)
23Heapsort
- In order to turn the array into a heap, we could
just insert all the elements into a new heap - However, we can do this without using an extra
heap! - We use the fix heap procedure from the bottom
in the tree and upwards
24Heapsort
- Why will this work?
- Remember that the fix heap procedure takes two
subheaps as input, plus a root node with a
wrong value - If we work from the bottom and up, the input will
always be like above
25Heapsort
Fix heap here
Fix heaps here
Fix heaps here
Trivially a heap
26Heapsort
- Now the tree is a heap
- Repeatedly remove the root from the heap, and fix
the remaining heap - We remove the root by placing it at the end of
the array, beyond the last element in the
remaining heap
27Heapsort
23
29
32
56
37
42
23
29
32
37
56
42
28Heapsort
29
32
56
37
42
29
32
37
56
42
23
29Heapsort
29
37
32
56
42
29
37
32
42
56
23
30Heapsort
37
32
56
42
37
32
42
56
29
23
31Heapsort
32
37
56
42
32
37
56
42
29
23
32Heapsort
37
56
42
37
56
42
32
29
23
33Heapsort
37
42
56
37
42
56
32
29
23
34Heapsort
42
56
42
56
37
32
29
23
35Heapsort
42
56
42
56
37
32
29
23
36Heapsort
56
56
42
37
32
29
23
37Heapsort
56
56
42
37
32
29
23
38Heapsort
56
42
37
32
29
23
39Heapsort
- One minor issue numbers are sorted in wrong
order - Could just reverse order, takes O(n)
- Or use max-heap
- Min-heap All nodes store values at most as large
as the values stored in any descendant - Max-heap All nodes store values at least as
large as the values stored in any descendant