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
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
Heaps In addition to the operations inherited from a binary tree, a heap has the following additional operations: addElement  removeMin findMin
FIGURE 15.1   The operations on a heap
Listing 15.1
FIGURE 15.2   UML description  of the HeapADT
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 = log 2 n and n is the number of elements in the tree
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
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
FIGURE 15.3  Two minheaps containing the same data
FIGURE 15.4   Insertion points for a heap
FIGURE 15.5   Insertion and reordering in a heap
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
The removeMin Operation The replacement element is always the last leaf The last leaf is always the last element at level h
FIGURE 15.6   Examples of the last leaf in a heap
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
FIGURE 15.7   Removal and reordering in a heap
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
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
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
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
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
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
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
Listing 15.2
Listing 15.2  (cont.)
Listing 15.2  (cont.)
Listing 15.2  (cont.)
Listing 15.3
Listing 15.3  (cont.)
Listing 15.3  (cont.)
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
Listing 15.4
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
LinkedHeap - the addElement Operation
LinkedHeap - the addElement Operation
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
LinkedHeap - the addElement Operation
LinkedHeap - the addElement Operation
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
LinkedHeap - the removeMin Operation
LinkedHeap - the removeMin Operation
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
LinkedHeap - the removeMin Operation
LinkedHeap - the removeMin Operation
LinkedHeap - the removeMin Operation
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 (n-1)/2
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
ArrayHeap - the addElement Operation
ArrayHeap - the addElement Operation
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
ArrayHeap - the removeMin Operation
ArrayHeap - the removeMin Operation
ArrayHeap - the removeMin Operation
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
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)

Ch15 Heap

  • 1.
  • 2.
    Chapter Objectives Definea heap abstract data structure Demonstrate how a heap can be used to solve problems Examine various heap impmentations Compare heap implementations
  • 3.
    Heaps A heapis 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
  • 4.
    Heaps In additionto the operations inherited from a binary tree, a heap has the following additional operations: addElement removeMin findMin
  • 5.
    FIGURE 15.1 The operations on a heap
  • 6.
  • 7.
    FIGURE 15.2 UML description of the HeapADT
  • 8.
    The addElement OperationThe 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 = log 2 n and n is the number of elements in the tree
  • 9.
    The addElement OperationSince 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
  • 10.
    The addElement OperationOnce 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
  • 11.
    FIGURE 15.3 Two minheaps containing the same data
  • 12.
    FIGURE 15.4 Insertion points for a heap
  • 13.
    FIGURE 15.5 Insertion and reordering in a heap
  • 14.
    The removeMin OperationThe 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
  • 15.
    The removeMin OperationThe replacement element is always the last leaf The last leaf is always the last element at level h
  • 16.
    FIGURE 15.6 Examples of the last leaf in a heap
  • 17.
    The removeMin OperationOnce 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
  • 18.
    FIGURE 15.7 Removal and reordering in a heap
  • 19.
    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
  • 20.
    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
  • 21.
    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
  • 22.
    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
  • 23.
    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
  • 24.
    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
  • 25.
    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
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
    Implementing Heaps withLinks 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
  • 34.
  • 35.
    Implementing Heaps withLinks 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
  • 36.
    LinkedHeap - theaddElement Operation
  • 37.
    LinkedHeap - theaddElement Operation
  • 38.
    LinkedHeap - theaddElement 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
  • 39.
    LinkedHeap - theaddElement Operation
  • 40.
    LinkedHeap - theaddElement Operation
  • 41.
    LinkedHeap - theremoveMin 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
  • 42.
    LinkedHeap - theremoveMin Operation
  • 43.
    LinkedHeap - theremoveMin Operation
  • 44.
    LinkedHeap - theremoveMin 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
  • 45.
    LinkedHeap - theremoveMin Operation
  • 46.
    LinkedHeap - theremoveMin Operation
  • 47.
    LinkedHeap - theremoveMin Operation
  • 48.
    Implementing Heaps withArrays 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 (n-1)/2
  • 49.
    Implementing Heaps withArrays 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
  • 50.
    ArrayHeap - theaddElement Operation
  • 51.
    ArrayHeap - theaddElement Operation
  • 52.
    ArrayHeap - theremoveMin 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
  • 53.
    ArrayHeap - theremoveMin Operation
  • 54.
    ArrayHeap - theremoveMin Operation
  • 55.
    ArrayHeap - theremoveMin Operation
  • 56.
    Analysis of HeapImplementations 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
  • 57.
    Analysis of HeapImplementations 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)