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
© Copyright 2026 Paperzz