Listing 15.2

Chapter 15
Heaps
Chapter Objectives
• Define a heap abstract data structure
• Demonstrate how a heap can be used
to solve problems
• Examine various heap impmentations
• Compare heap implementations
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-2
Heaps
• A heap is a binary tree with two added
properties:
– It is a complete tree
– For each node, the node is less than or
equal to both the left child and the right
child
• This definition described a minheap
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-3
Heaps
• In addition to the operations inherited
from a binary tree, a heap has the
following additional operations:
– addElement
– removeMin
– findMin
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-4
FIGURE 15.1
The operations on a heap
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-5
Listing 15.1
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-6
FIGURE 15.2 UML description
of the HeapADT
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-7
The addElement Operation
• The addElement method adds a given
element to the appropriate location in
the heap
• A binary tree is considered complete if
all of the leaves are level h or h-1
where h = log2n and n is the number of
elements in the tree
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-8
The addElement Operation
• Since a heap is a complete tree, there
is only one correct location for the
insertion of a new node
– Either the next open position from the left
at level h
– Or the first position in level h+1 if level h is
full
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-9
The addElement Operation
• Once we have located the new node in the
proper position, then we must account for
the ordering property
• We simply compare the new node to its
parent value and swap the values if
necessary
• We continue this process up the tree until
either the new value is greater than its
parent or the new value becomes the root of
the heap
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-10
FIGURE 15.3 Two minheaps
containing the same data
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-11
FIGURE 15.4
Insertion points for a heap
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-12
FIGURE 15.5
Insertion and reordering in a heap
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-13
The removeMin Operation
• The removeMin method removes the
minimum element from the heap
• The minimum element is always stored
at the root
• Thus we have to return the root
element and replace it with another
element
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-14
The removeMin Operation
• The replacement element is always the
last leaf
• The last leaf is always the last element
at level h
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-15
FIGURE 15.6
Examples of the last leaf in a heap
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-16
The removeMin Operation
• Once the element stored in the last leaf has
been moved to the root, the heap will have
to reordered
• This is accomplished by comparing the new
root element to the smaller of its children
and the swapping them if necessary
• This process is repeated down the tree until
the element is either in a leaf or is less than
both of its children
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-17
FIGURE 15.7
Removal and reordering in a heap
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-18
Using Heaps: Heap Sort
• Given the ordering property of a heap,
it is natural to think of using a heap to
sort a list of objects
• One approach would be to simply add
all of the objects to a heap and then
remove them one at a time in
ascending order
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-19
Using Heaps: Heap Sort
• Insertion into a heap is O(log n) for any
given node and thus would O(n log n) for n
nodes to build the heap
• However, it is also possible to build a heap in
place using an array
• Since we know the relative position of each
parent and its children in the array, we
simply start with the first non-leaf node in the
array, compare it to its children and swap if
necessary
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-20
Using Heaps: Heap Sort
• However, it is also possible to build a heap in
place using an array
• Since we know the relative position of each
parent and its children in the array, we
simply start with the first non-leaf node in the
array, compare it to its children and swap if
necessary
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-21
Using Heaps: Heap Sort
• We then work backward in the array until we
reach the root
• Since at most, this will require us to make
two comparisons for each non-leaf node, this
approach is O(n) to build the heap
• We will revisit the analysis of HeapSort at
the end of the chapter
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-22
Using Heaps: Priority Queue
• A priority queue is a collection that follows
two ordering rules:
– Items which have higher priority go first
– Items with the same priority use a first in, first out
method to determine their ordering
• A priority queue could be implemented using
a list of queues where each queue
represents items of a given priority
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-23
Using Heaps: Priority Queue
• Another solution is to use a minheap
• Sorting the heap by priority accomplishes
the first ordering
• However, the first in, first out ordering for
items with the same priority has to be
manipulated
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-24
Using Heaps: Priority Queue
• The solution is to create a PriorityQueueNode object
that stores the element to be placed on the queue,
the priority of the element and the arrival order of the
element
• Then we simply define a compareTo method for the
PriorityQueueNode class that first compares priority
then arrival time
• The PriorityQueue class then extends the Heap
class and stores PriorityQueueNodes
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-25
Listing 15.2
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-26
Listing 15.2 (cont.)
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-27
Listing 15.2 (cont.)
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-28
Listing 15.2 (cont.)
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-29
Listing 15.3
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-30
Listing 15.3 (cont.)
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-31
Listing 15.3 (cont.)
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-32
Implementing Heaps with Links
• A linked implementation of a minheap
would simply be an extension of our
LinkedBinaryTree class
• However, since we need each node to
have a parent pointer, we will create a
HeapNode class to extend our
BinaryTreeNode class we used earlier
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-33
Listing 15.4
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-34
Implementing Heaps with Links
• The addElement method must
accomplish three tasks:
– Add the new node at the appropriate
location
– Reorder the heap
– Reset the lastNode pointer to point to the
new last node
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-35
LinkedHeap - the addElement
Operation
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-36
LinkedHeap - the addElement
Operation
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-37
LinkedHeap - the addElement
Operation
• The addElement operation makes use
of two private methods:
– getNextParentAdd that returns a
reference to the node that will be the
parent of the new node
– heapifyAdd that reorders the heap after
the insertion
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-38
LinkedHeap - the addElement
Operation
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-39
LinkedHeap - the addElement
Operation
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-40
LinkedHeap - the removeMin
Operation
• The removeMin operation must
accomplish three tasks:
– Replace the element stored in the root
with the element stored in the last leaf
– Reorder the heap if necessary
– Return the original root element
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-41
LinkedHeap - the removeMin
Operation
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-42
LinkedHeap - the removeMin
Operation
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-43
LinkedHeap - the removeMin
Operation
• Like the addElement operation, the
removeMin operation makes use of two
private methods
– getNewLastNode that returns a reference
to the new last node in the heap
– heapifyRemove that reorders the heap
after the removal
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-44
LinkedHeap - the removeMin
Operation
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-45
LinkedHeap - the removeMin
Operation
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-46
LinkedHeap - the removeMin
Operation
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-47
Implementing Heaps with Arrays
• An array implementation of a heap may
provide a simpler alternative
• In an array implementation, the location of
parent and child can always be calculated
• Given that the root is in postion 0, then for
any given node stored in position n of the
array, its left child is in position 2n + 1 and its
right child is in position 2(n+1)
• This means that its parent is in position (n1)/2
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-48
Implementing Heaps with Arrays
• Like the linked version, the addElement
operation for an array implementation of a
heap must accomplish three tasks:
– Add the new node,
– Reorder the heap,
– Increment the count by one
• The ArrayHeap version of this method only
requires one private method, heapifyAdd
which reorders the heap after the insertion
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-49
ArrayHeap - the addElement
Operation
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-50
ArrayHeap - the addElement
Operation
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-51
ArrayHeap - the removeMin
Operation
• The removeMin operation must accomplish
three tasks:
– Replace the element stored at the root with the
element stored in the last leaf
– Reorder the heap as necessary
– Return the original root element
• Like the addElement operation, the
removeMin operation makes use of a private
method, heapifyRemove to reorder the heap
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-52
ArrayHeap - the removeMin
Operation
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-53
ArrayHeap - the removeMin
Operation
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-54
ArrayHeap - the removeMin
Operation
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-55
Analysis of Heap
Implementations
• The addElement operation is O(log n)
for both implementations
• The removeMin operation is O(log n)
for both implementations
• The findMin operation is O(1) for both
implementations
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-56
Analysis of Heap
Implementations
• One might conclude then that
HeapSort is O(log n) since both adding
and removing elements is O(log n)
• Keep in mind that for HeapSort, we
must perform both operations for each
of n elements
• Thus the time complexity of HeapSort
is 2*n*log n or O(n log n)
Copyright © 2005 Pearson Addison-Wesley. All rights reserved.
15-57