Heaps: A Complete Binary Tree Data Structure

undefined
 
Heaps
 
Yih-Kuen Tsay
Dept. of Information Management
National Taiwan University
 
Based on [Carrano and Henry 2013]
With help from Chien Chin Chen
 
 
1
Introduction
 
We are about to study a special kind of complete
binary tree, called heap.
A heap provides an efficient implementation of
the ADT priority queue.
It is also useful for sorting.
Do not confuse such a heap with the heap in the
execution environment of a program, which
contains the collection of memory cells available
for dynamic allocation.
Yih-Kuen Tsay
DS 2015: Heaps
2
The ADT Heap (1/6)
 
A 
heap
 is a 
complete binary tree
 that either is
empty
 or 
whose root
contains a value 
greater
 than or equal to the value in
each of its children, and
has heaps as its subtrees.
A heap so defined is often called a 
maxheap
, as
the root contains the item with the largest value.
If we would replace “greater” with “less” in the
definition, the root would contain the item with
the smallest value.
Such a heap is called a 
minheap
.
Yih-Kuen Tsay
DS 2015: Heaps
3
 
The ADT Heap (2/6)
 
 
Yih-Kuen Tsay
 
DS 2015: Heaps
 
4
 
Source: 
FIGURE 17-1 in [Carrano and Henry 2013].
 
(a) a maxheap; (b) a minheap
 
The ADT Heap (3/6)
 
 
Yih-Kuen Tsay
 
DS 2015: Heaps
 
5
 
Source: 
FIGURE 17-2 in [Carrano and Henry 2013].
 
A UML diagram for the class Heap
The ADT Heap (4/6)
 
Data
A finite number of objects in hierarchical order.
Operations
isEmpty()
Task: Determines whether this heap is empty.
Input: None.
Output: True if the heap is empty; false, otherwise.
getNumberOfNodes()
Task: Gets the number of nodes in this heap.
Input: None.
Output: The number of nodes in this heap.
Yih-Kuen Tsay
DS 2015: Heaps
6
The ADT Heap (5/6)
 
Operations (cont’d)
getHeigt()
Task: Gets the height of this heap.
Input: None.
Output: The height of this heap.
peekTop()
Task: Gets the data in the root (top) of this heap.
Input: None. Assumes the heap is not empty.
Output: The item in the root of the heap.
add(newData)
Task: Inserts 
newData
 
into this heap.
Input: 
newData
 is the data item to be inserted.
Output: True if the insertion is successful; false, otherwise
Yih-Kuen Tsay
DS 2015: Heaps
7
The ADT Heap (6/6)
 
Operations (cont’d)
remove()
Task: Removes the item in the root of this heap.
Input: None.
Output: 
 
True if the removal is successful; false, otherwise
clear()
Task: Removes all nodes from this heap.
Input: None.
Output: The heap is empty.
Yih-Kuen Tsay
DS 2015: Heaps
8
Heaps vs. Binary Search Trees
 
Both are binary trees.
While a binary search tree can be seen as sorted,
a heap is ordered in a much weaker sense (but
still very useful).
While binary search trees come in many different
shapes, heaps are always complete binary trees
(and hence balanced without overhead).
Yih-Kuen Tsay
DS 2015: Heaps
9
 
10
 
A C++ Interface for the ADT Heap (1/3)
 
Yih-Kuen Tsay
 
DS 2015: Heaps
 
11
 
A C++ Interface for the ADT Heap (2/3)
 
Yih-Kuen Tsay
 
DS 2015: Heaps
 
12
 
A C++ Interface for the ADT Heap (3/3)
 
Yih-Kuen Tsay
 
DS 2015: Heaps
 
Complete Binary Trees in an Array (1/2)
 
 
Yih-Kuen Tsay
 
DS 2015: Heaps
 
13
 
Source: 
FIGURE 17-3 in [Carrano and Henry 2013].
 
(a) level-by-level numbering; (b) an array-based implementation
Complete Binary Trees in an Array (2/2)
 
The tree nodes are numbered 0 through n level-
by-level, i.e., from top to bottom and left to right.
Place the tree nodes in an array according in
numeric order, i.e., 
items[i] 
contains node
numbered 
i
.
Given any node 
items[i]
, one can easily
locate both of its children and its parent:
Left child (if it exists): 
items[2*i+1]
Right child 
(if it exists)
: 
items[2*i+2]
Parent 
(if it exists)
: 
items[(i-1)/2]
Yih-Kuen Tsay
DS 2015: Heaps
14
An Array-Based Implementation (1/10)
 
Private data members:
items
: an array of heap items
itemcount
: the number of items in the heap
maxItems
: the maximum capacity of the heap
Operations
peektop()
return items[0]
 (if the heap is not empty)
remove()
removing the root of a heap would leave two disjoint heaps
replace the root with the last item, resulting in a 
semiheap
trickle the new root down the tree, getting a new heap
Yih-Kuen Tsay
DS 2015: Heaps
15
 
Converting a Semiheap into a Heap (1/9)
 
 
Yih-Kuen Tsay
 
DS 2015: Heaps
 
16
 
Source: 
FIGURE 17-4 in [Carrano and Henry 2013].
 
Disjoint heaps after a removal
 
Converting a Semiheap into a Heap (2/9)
 
 
Yih-Kuen Tsay
 
DS 2015: Heaps
 
17
 
Source: 
FIGURE 17-4 in [Carrano and Henry 2013].
 
A semiheap
 
Converting a Semiheap into a Heap (3/9)
 
 
Yih-Kuen Tsay
 
DS 2015: Heaps
 
18
 
Source: 
FIGURE 17-4 in [Carrano and Henry 2013].
 
The restored heap
 
19
 
Converting a Semiheap into a Heap (4/9)
 
Yih-Kuen Tsay
 
DS 2015: Heaps
 
20
 
Converting a Semiheap into a Heap (5/9)
 
Yih-Kuen Tsay
 
DS 2015: Heaps
 
Converting a Semiheap into a Heap (6/9)
 
Array representation of
a heap
 
 
Yih-Kuen Tsay
 
DS 2015: Heaps
 
21
 
Source: 
FIGURE 17-5 in [Carrano and Henry 2013].
 
Converting a Semiheap into a Heap (7/9)
 
Array representation of
a semiheap
 
 
Yih-Kuen Tsay
 
DS 2015: Heaps
 
22
 
Source: 
FIGURE 17-5 in [Carrano and Henry 2013].
 
Converting a Semiheap into a Heap (8/9)
 
Array representation of
a restored heap (from a
semiheap)
 
 
Yih-Kuen Tsay
 
DS 2015: Heaps
 
23
 
Source: 
FIGURE 17-5 in [Carrano and Henry 2013].
 
Converting a Semiheap into a Heap (9/9)
 
 
Yih-Kuen Tsay
 
DS 2015: Heaps
 
24
 
Source: 
FIGURE 17-6 in [Carrano and Henry 2013].
 
Recursive calls to heapRebuild
An Array-Based Implementation (2/10)
 
Complexity of 
remove()
Trickling down by one level takes constant time.
O(log 
n
)
Operations (cont’d)
add(newData)
It is the opposite of 
remove
.
Place the new entry as the new last item
Trickle the new last item up the tree
Yih-Kuen Tsay
DS 2015: Heaps
25
 
Insertion into a Heap (1/2)
 
 
Yih-Kuen Tsay
 
DS 2015: Heaps
 
26
 
Source: 
FIGURE 17-7 in [Carrano and Henry 2013].
 
Insertion into a heap
 
27
 
Insertion into a Heap (2/2)
 
Yih-Kuen Tsay
 
DS 2015: Heaps
 
28
 
An Array-Based Implementation (3/10)
 
Yih-Kuen Tsay
 
DS 2015: Heaps
 
29
 
An Array-Based Implementation (4/10)
 
Yih-Kuen Tsay
 
DS 2015: Heaps
 
30
 
An Array-Based Implementation (5/10)
 
Yih-Kuen Tsay
 
DS 2015: Heaps
 
31
 
An Array-Based Implementation (6/10)
 
Yih-Kuen Tsay
 
DS 2015: Heaps
 
An Array-Based Implementation (7/10)
 
 
Yih-Kuen Tsay
 
DS 2015: Heaps
 
32
 
Source: 
FIGURE 17-8 in [Carrano and Henry 2013].
 
(a) contents of an array; (b) the corresponding complete binary tree
 
An Array-Based Implementation (8/10)
 
 
Yih-Kuen Tsay
 
DS 2015: Heaps
 
33
 
Source: 
FIGURE 17-9 in [Carrano and Henry 2013].
 
Transforming an array into a heap
 
An Array-Based Implementation (9/10)
 
 
Yih-Kuen Tsay
 
DS 2015: Heaps
 
34
 
Source: 
FIGURE 17-9 in [Carrano and Henry 2013].
 
Transforming an array into a heap
 
35
 
An Array-Based Implementation (10/10)
 
Yih-Kuen Tsay
 
DS 2015: Heaps
 
36
 
Implementation of Priority Queue (1/5)
 
Yih-Kuen Tsay
 
DS 2015: Heaps
 
37
 
Implementation of Priority Queue (2/5)
 
Yih-Kuen Tsay
 
DS 2015: Heaps
 
38
 
Implementation of Priority Queue (3/5)
 
Yih-Kuen Tsay
 
DS 2015: Heaps
 
39
 
Implementation of Priority Queue (4/5)
 
Yih-Kuen Tsay
 
DS 2015: Heaps
Implementation of Priority Queue (5/5)
 
If the maximum number of items is known
, the
heap is better (than a binary search tree)
A heap is complete, and hence always balanced
An overhead is required to keep a search tree
balanced.
We will soon study how to keep a search tree
balanced.
When there are many items, but a few distinct
priority values,
Associate a queue with each priority value
Yih-Kuen Tsay
DS 2015: Heaps
40
 
Heap Sort (1/7)
 
 
Yih-Kuen Tsay
 
DS 2015: Heaps
 
41
 
Source: 
FIGURE 17-10 in [Carrano and Henry 2013].
 
Heap sort partitions an array into two regions
 
Heap Sort (2/7)
 
 
Yih-Kuen Tsay
 
DS 2015: Heaps
 
42
 
Source: 
FIGURE 17-11 in [Carrano and Henry 2013].
 
A trace of heap sort
 
Heap Sort (3/7)
 
 
Yih-Kuen Tsay
 
DS 2015: Heaps
 
43
 
Source: 
FIGURE 17-11 in [Carrano and Henry 2013].
 
A trace of heap sort
 
Heap Sort (4/7)
 
 
Yih-Kuen Tsay
 
DS 2015: Heaps
 
44
 
Source: 
FIGURE 17-11 in [Carrano and Henry 2013].
 
A trace of heap sort
 
Heap Sort (5/7)
 
 
Yih-Kuen Tsay
 
DS 2015: Heaps
 
45
 
Source: 
FIGURE 17-11 in [Carrano and Henry 2013].
 
A trace of heap sort
 
46
 
Heap Sort (6/7)
 
Yih-Kuen Tsay
 
DS 2015: Heaps
 
47
 
Heap Sort (7/7)
 
Yih-Kuen Tsay
 
DS 2015: Heaps
Slide Note
Embed
Share

Introduction to heaps, a special type of complete binary tree used for efficient priority queue implementation and sorting. Explains the concept of maxheap and minheap, along with operations like isEmpty, getNumberOfNodes, getHeight, peekTop, add, and remove. Includes visual aids and definitions to help grasp the fundamentals of heaps.

  • Binary Tree
  • Data Structure
  • Priority Queue
  • Heap
  • Complete Tree

Uploaded on Sep 10, 2024 | 5 Views


Download Presentation

Please find below an Image/Link to download the presentation.

The content on the website is provided AS IS for your information and personal use only. It may not be sold, licensed, or shared on other websites without obtaining consent from the author.If you encounter any issues during the download, it is possible that the publisher has removed the file from their server.

You are allowed to download the files provided on this website for personal or commercial use, subject to the condition that they are used lawfully. All files are the property of their respective owners.

The content on the website is provided AS IS for your information and personal use only. It may not be sold, licensed, or shared on other websites without obtaining consent from the author.

E N D

Presentation Transcript


  1. SVVRL @ IM.NTU Heaps Yih-Kuen Tsay Dept. of Information Management National Taiwan University Based on [Carrano and Henry 2013] With help from Chien Chin Chen 1 / 47

  2. SVVRL @ IM.NTU Introduction We are about to study a special kind of complete binary tree, called heap. A heap provides an efficient implementation of the ADT priority queue. It is also useful for sorting. Do not confuse such a heap with the heap in the execution environment of a program, which contains the collection of memory cells available for dynamic allocation. Yih-Kuen Tsay DS 2015: Heaps 2 / 47

  3. SVVRL @ IM.NTU The ADT Heap (1/6) A heap is a complete binary tree that either is empty or whose root contains a value greater than or equal to the value in each of its children, and has heaps as its subtrees. A heap so defined is often called a maxheap, as the root contains the item with the largest value. If we would replace greater with less in the definition, the root would contain the item with the smallest value. Such a heap is called a minheap. Yih-Kuen Tsay DS 2015: Heaps 3 / 47

  4. SVVRL @ IM.NTU The ADT Heap (2/6) (a) a maxheap; (b) a minheap Source: FIGURE 17-1 in [Carrano and Henry 2013]. Yih-Kuen Tsay DS 2015: Heaps 4 / 47

  5. SVVRL @ IM.NTU The ADT Heap (3/6) A UML diagram for the class Heap Source: FIGURE 17-2 in [Carrano and Henry 2013]. Yih-Kuen Tsay DS 2015: Heaps 5 / 47

  6. SVVRL @ IM.NTU The ADT Heap (4/6) Data A finite number of objects in hierarchical order. Operations isEmpty() Task: Determines whether this heap is empty. Input: None. Output: True if the heap is empty; false, otherwise. getNumberOfNodes() Task: Gets the number of nodes in this heap. Input: None. Output: The number of nodes in this heap. Yih-Kuen Tsay DS 2015: Heaps 6 / 47

  7. SVVRL @ IM.NTU The ADT Heap (5/6) Operations (cont d) getHeigt() Task: Gets the height of this heap. Input: None. Output: The height of this heap. peekTop() Task: Gets the data in the root (top) of this heap. Input: None. Assumes the heap is not empty. Output: The item in the root of the heap. add(newData) Task: Inserts newData into this heap. Input: newData is the data item to be inserted. Output: True if the insertion is successful; false, otherwise Yih-Kuen Tsay DS 2015: Heaps 7 / 47

  8. SVVRL @ IM.NTU The ADT Heap (6/6) Operations (cont d) remove() Task: Removes the item in the root of this heap. Input: None. Output: True if the removal is successful; false, otherwise clear() Task: Removes all nodes from this heap. Input: None. Output: The heap is empty. Yih-Kuen Tsay DS 2015: Heaps 8 / 47

  9. SVVRL @ IM.NTU Heaps vs. Binary Search Trees Both are binary trees. While a binary search tree can be seen as sorted, a heap is ordered in a much weaker sense (but still very useful). While binary search trees come in many different shapes, heaps are always complete binary trees (and hence balanced without overhead). Yih-Kuen Tsay DS 2015: Heaps 9 / 47

  10. SVVRL @ IM.NTU A C++ Interface for the ADT Heap (1/3) /** Interface for the ADT heap. @file HeapInterface.h */ #ifndef _HEAP_INTERFACE #define _HEAP_INTERFACE template<class ItemType> class HeapInterface { public: /** Sees whether this heap is empty. @return True if the heap is empty, or false if not. */ virtual bool isEmpty() const = 0; 10 Yih-Kuen Tsay DS 2015: Heaps / 47

  11. SVVRL @ IM.NTU A C++ Interface for the ADT Heap (2/3) /** Gets the number of nodes in this heap. @return The number of nodes in the heap. */ virtual int getNumberOfNodes() const = 0; /** Gets the height of this heap. @return The height of the heap. */ virtual int getHeight() const = 0; /** Gets the data that is in the root (top) of this heap. For a maxheap, the data is the largest value in the heap; for a minheap, the data is the smallest value in the heap. @pre The heap is not empty. @post The roots data has been returned, and the heap is unchanged. @return The data in the root of the heap. */ virtual ItemType peekTop() const = 0; 11 Yih-Kuen Tsay DS 2015: Heaps / 47

  12. SVVRL @ IM.NTU A C++ Interface for the ADT Heap (3/3) /** Adds a new node containing the given data to this heap. @param newData The data for the new node. @post The heap contains a new node. @return True if the addition is successful, or false if not. */ virtual bool add(const ItemType& newData) = 0; /** Removes the root node from this heap. @return True if the removal is successful, or false if not. */ virtual bool remove() = 0; /** Removes all nodes from this heap. */ virtual void clear() = 0; }; // end HeapInterface #endif 12 Yih-Kuen Tsay DS 2015: Heaps / 47

  13. SVVRL @ IM.NTU Complete Binary Trees in an Array (1/2) (a) level-by-level numbering; (b) an array-based implementation Source: FIGURE 17-3 in [Carrano and Henry 2013]. Yih-Kuen Tsay DS 2015: Heaps 13 / 47

  14. SVVRL @ IM.NTU Complete Binary Trees in an Array (2/2) The tree nodes are numbered 0 through n level- by-level, i.e., from top to bottom and left to right. Place the tree nodes in an array according in numeric order, i.e., items[i] contains node numbered i. Given any node items[i], one can easily locate both of its children and its parent: Left child (if it exists): items[2*i+1] Right child (if it exists): items[2*i+2] Parent (if it exists): items[(i-1)/2] Yih-Kuen Tsay DS 2015: Heaps 14 / 47

  15. SVVRL @ IM.NTU An Array-Based Implementation (1/10) Private data members: items: an array of heap items itemcount: the number of items in the heap maxItems: the maximum capacity of the heap Operations peektop() return items[0] (if the heap is not empty) remove() removing the root of a heap would leave two disjoint heaps replace the root with the last item, resulting in a semiheap trickle the new root down the tree, getting a new heap Yih-Kuen Tsay DS 2015: Heaps 15 / 47

  16. SVVRL @ IM.NTU Converting a Semiheap into a Heap (1/9) Disjoint heaps after a removal Source: FIGURE 17-4 in [Carrano and Henry 2013]. Yih-Kuen Tsay DS 2015: Heaps 16 / 47

  17. SVVRL @ IM.NTU Converting a Semiheap into a Heap (2/9) A semiheap Source: FIGURE 17-4 in [Carrano and Henry 2013]. Yih-Kuen Tsay DS 2015: Heaps 17 / 47

  18. SVVRL @ IM.NTU Converting a Semiheap into a Heap (3/9) The restored heap Source: FIGURE 17-4 in [Carrano and Henry 2013]. Yih-Kuen Tsay DS 2015: Heaps 18 / 47

  19. SVVRL @ IM.NTU Converting a Semiheap into a Heap (4/9) // Converts a semiheap rooted at index root into a heap. heapRebuild(root: integer, items: ArrayType, itemCount: integer) // Recursively trickle the item at index root down to // its proper position by swapping it with its larger child, // if the child is larger than the item. // If the item is at a leaf, nothing needs to be done. if (root is not a leaf) { // root must have a left child; assume it is // the larger child largerChildIndex = 2 * rootIndex + 1 // Left child index if (root has a right child) { rightChildIndex = largerChildIndex + 1 // Right child index if (items[rightChildIndex] > items[largerChildIndex]) largerChildIndex = rightChildIndex // Larger child index } 19 Yih-Kuen Tsay DS 2015: Heaps / 47

  20. SVVRL @ IM.NTU Converting a Semiheap into a Heap (5/9) // If the item in root is smaller than the item // in the larger child, swap items if (items[rootIndex] < items[largerChildIndex]) { Swap items[rootIndex] and items[largerChildIndex] // Transform the semiheap rooted at largerChildIndex // into a heap heapRebuild(largerChildIndex, items, itemCount)} } // Else root is a leaf, so you are done 20 Yih-Kuen Tsay DS 2015: Heaps / 47

  21. SVVRL @ IM.NTU Converting a Semiheap into a Heap (6/9) Array representation of a heap Source: FIGURE 17-5 in [Carrano and Henry 2013]. Yih-Kuen Tsay DS 2015: Heaps 21 / 47

  22. SVVRL @ IM.NTU Converting a Semiheap into a Heap (7/9) Array representation of a semiheap Source: FIGURE 17-5 in [Carrano and Henry 2013]. Yih-Kuen Tsay DS 2015: Heaps 22 / 47

  23. SVVRL @ IM.NTU Converting a Semiheap into a Heap (8/9) Array representation of a restored heap (from a semiheap) Source: FIGURE 17-5 in [Carrano and Henry 2013]. Yih-Kuen Tsay DS 2015: Heaps 23 / 47

  24. SVVRL @ IM.NTU Converting a Semiheap into a Heap (9/9) Recursive calls to heapRebuild Source: FIGURE 17-6 in [Carrano and Henry 2013]. Yih-Kuen Tsay DS 2015: Heaps 24 / 47

  25. SVVRL @ IM.NTU An Array-Based Implementation (2/10) Complexity of remove() Trickling down by one level takes constant time. O(log n) Operations (cont d) add(newData) It is the opposite of remove. Place the new entry as the new last item Trickle the new last item up the tree Yih-Kuen Tsay DS 2015: Heaps 25 / 47

  26. SVVRL @ IM.NTU Insertion into a Heap (1/2) Insertion into a heap Source: FIGURE 17-7 in [Carrano and Henry 2013]. Yih-Kuen Tsay DS 2015: Heaps 26 / 47

  27. SVVRL @ IM.NTU Insertion into a Heap (2/2) // Insert newData into the bottom of the tree items[itemCount] = newData // Trickle new item up to the appropriate spot in the tree newDataIndex = itemCount inPlace = false while ((newDataIndex >= 0) and !inPlace) { parentIndex = (newDataIndex 1) / 2 if (items[newDataIndex] < items[parentIndex]) inPlace = true else { Swap items[newDataIndex] and items[parentIndex] newDataIndex = parentIndex } } itemCount++ 27 Yih-Kuen Tsay DS 2015: Heaps / 47

  28. SVVRL @ IM.NTU An Array-Based Implementation (3/10) /** Array-based implementation of the ADT heap. @file ArrayMaxHeap.h */ #ifndef _ARRAY_MAX_HEAP #define _ARRAY_MAX_HEAP #include "HeapInterface.h" #include "PrecondViolatedExcep.h" template<class ItemType> class ArrayMaxHeap: public HeapInterface<ItemType> { private: static const int ROOT_INDEX = 0; // Helps with readability static const int DEFAULT_CAPACITY = 21; // Small capacity // to test for a full heap ItemType* items; // Array of heap items int itemCount; // Current count of heap items int maxItems; // Maximum capacity of the heap 28 Yih-Kuen Tsay DS 2015: Heaps / 47

  29. SVVRL @ IM.NTU An Array-Based Implementation (4/10) // -------------------------------------------------------- // Most of the private utility methods use an array index // as a parameter and in calculations. This should be safe, // even though the array is an implementation detail, since // the methods are private. // -------------------------------------------------------- // Returns the array index of the left child (if it exists). int getLeftChildIndex(const int nodeIndex) const; // Returns the array index of the right child (if it // exists). int getRightChildIndex(int nodeIndex) const; // Returns the array index of the parent node. int getParentIndex(int nodeIndex) const; // Tests whether this node is a leaf. bool isLeaf(int nodeIndex) const; // Converts a semiheap to a heap. void heapRebuild(int subTreeRootIndex); // Creates a heap from an unordered array. void heapCreate(); 29 Yih-Kuen Tsay DS 2015: Heaps / 47

  30. SVVRL @ IM.NTU An Array-Based Implementation (5/10) public: ArrayMaxHeap(); ArrayMaxHeap(const ItemType someArray[], const int arraySize); virtual ~ArrayMaxHeap(); // HeapInterface Public Methods: bool isEmpty() const; int getNumberOfNodes() const; int getHeight() const; ItemType peekTop() const throw(PrecondViolatedExcep); bool add(const ItemType& newData); bool remove(); void clear(); }; // end ArrayMaxHeap #include "ArrayMaxHeap.cpp" #endif 30 Yih-Kuen Tsay DS 2015: Heaps / 47

  31. SVVRL @ IM.NTU An Array-Based Implementation (6/10) template<class ItemType> ArrayMaxHeap<ItemType>:: ArrayMaxHeap(const ItemType someArray[], const int arraySize): itemCount(arraySize), maxItems(2*arraySize) { // Allocate the array items = new ItemType[2*arraySize] // Copy given values into the array for (int i = 0; i < itemCount; i++) items[i] = someArray[i]; // Reorganize the array into a heap heapCreate(); } // end constructor 31 Yih-Kuen Tsay DS 2015: Heaps / 47

  32. SVVRL @ IM.NTU An Array-Based Implementation (7/10) (a) contents of an array; (b) the corresponding complete binary tree Source: FIGURE 17-8 in [Carrano and Henry 2013]. Yih-Kuen Tsay DS 2015: Heaps 32 / 47

  33. SVVRL @ IM.NTU An Array-Based Implementation (8/10) Transforming an array into a heap Source: FIGURE 17-9 in [Carrano and Henry 2013]. Yih-Kuen Tsay DS 2015: Heaps 33 / 47

  34. SVVRL @ IM.NTU An Array-Based Implementation (9/10) Transforming an array into a heap Source: FIGURE 17-9 in [Carrano and Henry 2013]. Yih-Kuen Tsay DS 2015: Heaps 34 / 47

  35. SVVRL @ IM.NTU An Array-Based Implementation (10/10) template<class ItemType> void ArrayMaxHeap<ItemType>::heapCreate() { for (int index = itemCount / 2; index >= 0; index--) heapebuild(index); } // end heapCreate 35 Yih-Kuen Tsay DS 2015: Heaps / 47

  36. SVVRL @ IM.NTU Implementation of Priority Queue (1/5) /** ADT priority queue: Heap-based implementation. @file Heap_PriorityQueue.h */ #ifndef _HEAP_PRIORITY_QUEUE #define _HEAP_PRIORITY_QUEUE #include "ArrayMaxHeap.h" #include "PriorityQueueInterface.h" template<class ItemType> class Heap_PriorityQueue: public PriorityQueueInterface<ItemType>, private ArrayMaxHeap<ItemType> { 36 Yih-Kuen Tsay DS 2015: Heaps / 47

  37. SVVRL @ IM.NTU Implementation of Priority Queue (2/5) public: Heap_PriorityQueue(); bool isEmpty() const; bool add(const ItemType& newEntry); bool remove(); /** @pre The priority queue is not empty. */ ItemType peek() const throw(PrecondViolatedExcep); }; // end Heap_PriorityQueue #include "Heap_PriorityQueue.cpp" #endif 37 Yih-Kuen Tsay DS 2015: Heaps / 47

  38. SVVRL @ IM.NTU Implementation of Priority Queue (3/5) /** Heap-based implementation of the ADT priority queue. @file Heap_PriorityQueue.cpp */ #include "Heap_PriorityQueue.h" template<class ItemType> Heap_PriorityQueue<ItemType>::Heap_PriorityQueue() { { ArrayMaxHeap<ItemType>(); } // end constructor template<class ItemType> bool Heap_PriorityQueue<ItemType>::isEmpty() const { return ArrayMaxHeap<ItemType>::isEmpty(); } // end isEmpty template<class ItemType> bool Heap_PriorityQueue<ItemType>::add(const ItemType& newEntry) { return ArrayMaxHeap<ItemType>::add(newEntry); } // end add 38 Yih-Kuen Tsay DS 2015: Heaps / 47

  39. SVVRL @ IM.NTU Implementation of Priority Queue (4/5) template<class ItemType> bool Heap_PriorityQueue<ItemType>::remove() { return ArrayMaxHeap<ItemType>::remove(); } // end remove template<class ItemType> ItemType Heap_PriorityQueue<ItemType>::peek() const throw (PrecondViolatedExcep) { try { return ArrayMaxHeap<ItemType>::peekTop(); } catch(PrecondViolatedExcep e) { throw PrecondViolatedExcep("Attempted peek into an empty priority queue."); } // end try/catch } // end peek 39 Yih-Kuen Tsay DS 2015: Heaps / 47

  40. SVVRL @ IM.NTU Implementation of Priority Queue (5/5) If the maximum number of items is known, the heap is better (than a binary search tree) A heap is complete, and hence always balanced An overhead is required to keep a search tree balanced. We will soon study how to keep a search tree balanced. When there are many items, but a few distinct priority values, Associate a queue with each priority value Yih-Kuen Tsay DS 2015: Heaps 40 / 47

  41. SVVRL @ IM.NTU Heap Sort (1/7) Heap sort partitions an array into two regions Source: FIGURE 17-10 in [Carrano and Henry 2013]. Yih-Kuen Tsay DS 2015: Heaps 41 / 47

  42. SVVRL @ IM.NTU Heap Sort (2/7) A trace of heap sort Source: FIGURE 17-11 in [Carrano and Henry 2013]. Yih-Kuen Tsay DS 2015: Heaps 42 / 47

  43. SVVRL @ IM.NTU Heap Sort (3/7) A trace of heap sort Source: FIGURE 17-11 in [Carrano and Henry 2013]. Yih-Kuen Tsay DS 2015: Heaps 43 / 47

  44. SVVRL @ IM.NTU Heap Sort (4/7) A trace of heap sort Source: FIGURE 17-11 in [Carrano and Henry 2013]. Yih-Kuen Tsay DS 2015: Heaps 44 / 47

  45. SVVRL @ IM.NTU Heap Sort (5/7) A trace of heap sort Source: FIGURE 17-11 in [Carrano and Henry 2013]. Yih-Kuen Tsay DS 2015: Heaps 45 / 47

  46. SVVRL @ IM.NTU Heap Sort (6/7) // Sorts anArray[0..n-1]. heapSort(anArray: ArrayType, n:integer) // Build initial heap for (index = n / 2 down to 0) { // Assertion: The tree rooted at index is a semiheap heapRebuild(index, anArray, n) // Assertion: The tree rooted at index is a heap } // Assertion: anArray[0] is the largest item in // heap anArray[0..n-1] 46 Yih-Kuen Tsay DS 2015: Heaps / 47

  47. SVVRL @ IM.NTU Heap Sort (7/7) // Move the largest item in the Heap region--the root // anArray[0]--to the beginning of the Sorted region by // swapping items and adjusting the size of the regions Swap anArray[0] and anArray[n - 1] heapSize = n - 1 // Decrease the size of the Heap region, // expand the Sorted region while (heapSize > 1) { // Make the Heap region a heap again heapRebuild(0, anArray, heapSize) // Move the largest item in the Heap region--the root // anArray[0]--to the beginning of the Sorted region by // swapping items and adjusting the size of the regions Swap anArray[0] and anArray[heapSize - 1] heapSize-- // Decrease the size of the Heap region, // expand the Sorted region } 47 Yih-Kuen Tsay DS 2015: Heaps / 47

More Related Content

giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#