Class No.26 Data Structures http://ecomputernotes.com
Heap code in C++ template <class eType> void Heap<eType>::deleteMin( eType & minItem ) { if( isEmpty( ) ) { cout << "heap is empty.â&#x20AC;&#x153; << endl; return; } minItem = array[ 1 ]; array[ 1 ] = array[ currentSize-- ]; percolateDown( 1 ); }
http://ecomputernotes.com
Heap code in C++ // hole is the index at which the percolate begins. template <class eType> void Heap<eType>::percolateDown( int hole ) { int child; eType tmp = array[ hole ]; for( ; hole * 2 <= currentSize; hole = child ) { child = hole * 2; if( child != currentSize && array[child+1] < array[ child ] ) child++; // right child is smaller if( array[ child ] < tmp ) array[ hole ] = array[ child ]; else break; } array[ hole ] = tmp; }
http://ecomputernotes.com
Heap code in C++ template <class eType> const eType& Heap<eType>::getMin( ) { if( !isEmpty( ) ) return array[ 1 ]; } template <class eType> void Heap<eType>::buildHeap(eType* anArray, int n ) { for(int i = 1; i <= n; i++) array[i] = anArray[i-1]; currentSize = n; for( int i = currentSize / 2; i > 0; i-- ) percolateDown( i ); }
http://ecomputernotes.com
Heap code in C++ template <class eType> bool Heap<eType>::isEmpty( ) { return currentSize == 0; } template <class eType> bool Heap<eType>::isFull( ) { return currentSize == capacity; } template <class eType> int Heap<eType>::getSize( ) { return currentSize; }
http://ecomputernotes.com
BuildHeap in Linear Time How is buildHeap a linear time algorithm? I.e., better than Nlog2N? We need to show that the sum of heights is a linear function of N (number of nodes). Theorem: For a perfect binary tree of height h containing 2h +1 – 1 nodes, the sum of the heights of nodes is 2h +1 – 1 – (h +1), or Nh1.
http://ecomputernotes.com
BuildHeap in Linear Time
It is easy to see that this tree consists of (20) node at height h, 21 nodes at height h –1, 22 at h2 and, in general, 2i nodes at h – i.
http://ecomputernotes.com
Complete Binary Tree
A
h : 20 nodes
B
C
D
H
E
I
J
h -1: 21 nodes
F
K
L
G
M
N
h -2: 22 nodes
O
http://ecomputernotes.com
h -3: 23 nodes
BuildHeap in Linear Time The sum of the heights of all the nodes is then S =
2 (h – i), for i = 0 to h1 i
= h + 2(h1) + 4(h2) + 8(h3)+ ….. + 2h1 (1)
Multiplying by 2 gives the equation 2S = 2h + 4(h1) + 8(h2) + 16(h3)+ ….. + 2h (2)
Subtract the two equations to get S = -h + 2 + 4 + 8 + 16+ ….. + 2h1 +2h = (2h+1 – 1) (h+1)
Which proves the theorem. http://ecomputernotes.com
BuildHeap in Linear Time Since a complete binary tree has between 2h and 2h+1 nodes S = (2h+1 – 1) (h+1) N - log2(N+1) Clearly, as N gets larger, the log2(N +1) term becomes insignificant and S becomes a function of N. http://ecomputernotes.com
BuildHeap in Linear Time Another way to prove the theorem. The height of a node in the tree = the number of edges on the longest downward path to a leaf The height of a tree = the height of its root For any node in the tree that has some height h, darken h tree edges – Go down tree by traversing left edge then only right edges There are N – 1 tree edges, and h edges on right path, so number of darkened edges is N – 1 – h, which proves the theorem.
http://ecomputernotes.com
Height 1 Nodes
Marking the left edges for height 1 nodes
http://ecomputernotes.com
Height 2 Nodes
Marking the first left edge and the subsequent right edge for height 2 nodes
http://ecomputernotes.com
Height 3 Nodes
Marking the first left edge and the subsequent two right edges for height 3 nodes
http://ecomputernotes.com
Height 4 Nodes
Marking the first left edge and the subsequent three right edges for height 4 nodes
http://ecomputernotes.com
Theorem
N=31, treeEdges=30, H=4, dottedEdges=4 (H). Darkened Edges = 26 = N-H-1 (31-4-1)
http://ecomputernotes.com