leftist heaps
DESCRIPTION
Leftist heaps. Background. A binary min-heap allows the operations of push and pop to occur in an average case of Q (1) and Q ( ln ( n )) time, respectively Merging two binary min-heaps, however, is an Q ( n ) operation - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: Leftist heaps](https://reader033.vdocuments.us/reader033/viewer/2022061608/568164c8550346895dd6e19e/html5/thumbnails/1.jpg)
ECE 250 Algorithms and Data Structures
Douglas Wilhelm Harder, M.Math. LELDepartment of Electrical and Computer EngineeringUniversity of WaterlooWaterloo, Ontario, Canada
© 20143 by Douglas Wilhelm Harder. Some rights reserved.
Leftist heaps
![Page 2: Leftist heaps](https://reader033.vdocuments.us/reader033/viewer/2022061608/568164c8550346895dd6e19e/html5/thumbnails/2.jpg)
2Leftist heaps
Background
A binary min-heap allows the operations of push and pop to occur in an average case of Q(1) and Q(ln(n)) time, respectively
Merging two binary min-heaps, however, is an Q(n) operation
Are there efficient heap structures that allow merging in Q(ln(n)) time?
![Page 3: Leftist heaps](https://reader033.vdocuments.us/reader033/viewer/2022061608/568164c8550346895dd6e19e/html5/thumbnails/3.jpg)
3Leftist heaps
An Idea
A leftist heap is a node-based binary tree
New objects can be placed into a tree at any node which is not full– If we are to merge two heaps, one strategy would be to merge the heap
with a sub-tree that has a non-full node close to its root
– How do you measure how close a non-full node is to the root?
![Page 4: Leftist heaps](https://reader033.vdocuments.us/reader033/viewer/2022061608/568164c8550346895dd6e19e/html5/thumbnails/4.jpg)
4Leftist heaps
Minimum null-path length
We will define a null path as any path from the root node to a node that is not full– The length of that path is the null-path length (npl)
The minimum null-path length (min-npl) of a tree is the shortest distance from the root node to a non-full node
Like height,– The min-npl of a single node is 0 – The min-npl of an empty tree defined as –1
![Page 5: Leftist heaps](https://reader033.vdocuments.us/reader033/viewer/2022061608/568164c8550346895dd6e19e/html5/thumbnails/5.jpg)
5Leftist heaps
Minimum null-path length
A few observations:– A binary tree with min-npl of m contains a perfect tree of height m – Therefore, a binary tree with a min-npl of m has at least 2m + 1 – 1 nodes– If a binary tree has to sub-trees with min-npls of m1 and m2, then the
min-npl of the tree is 1 + min(m1, m1)
// recursive definition--any real implementation would use// member variables to store the minimum null-path lengthtemplate <typename Type>int Binary_tree<Type>::min_null_path_length() const { return empty() ? -1 : 1 + std::min( left() ->min_null_path_length(), right()->min_null_path_length() );}
![Page 6: Leftist heaps](https://reader033.vdocuments.us/reader033/viewer/2022061608/568164c8550346895dd6e19e/html5/thumbnails/6.jpg)
6Leftist heaps
Minimum null-path length
A leftist heap is a heap where the min-npl of the left sub-tree is always greater than or equal to the min-npl of the right sub-tree and both sub-trees are leftist heaps
The term leftist is results from the treebeing heavier in the left rather thanthe right sub-tree
![Page 7: Leftist heaps](https://reader033.vdocuments.us/reader033/viewer/2022061608/568164c8550346895dd6e19e/html5/thumbnails/7.jpg)
7Leftist heaps
Merging
We will demonstrate an algorithm for merging two leftist heaps
Once we have a merging algorithm, we can implement push and pop in terms of merges:– Push is implemented as merging the leftist heap with a node being
inserted treated as a trivial leftist heap– Pop is implemented by removing the root node and then merging the
two sub-heaps
![Page 8: Leftist heaps](https://reader033.vdocuments.us/reader033/viewer/2022061608/568164c8550346895dd6e19e/html5/thumbnails/8.jpg)
8Leftist heaps
Merging
Merging two leftist heaps uses the following rules:– Given two leftist heaps, choose that heap that has the smaller root to be
the leftist heap and:• If the right sub-heap is not empty, merge the other heap with the right sub-
heap of the selected root• If the right sub-heap is empty, attach the other heap as the right sub-heap of
the selected root
![Page 9: Leftist heaps](https://reader033.vdocuments.us/reader033/viewer/2022061608/568164c8550346895dd6e19e/html5/thumbnails/9.jpg)
9Leftist heaps
Merging
Suppose we are merging these two leftist heaps:– We compare the roots and note A ≤ B– Therefore, we merge the leftist heap B with the left sub-heap A2
![Page 10: Leftist heaps](https://reader033.vdocuments.us/reader033/viewer/2022061608/568164c8550346895dd6e19e/html5/thumbnails/10.jpg)
10Leftist heaps
Merging
We will now repeat the merging procedure
![Page 11: Leftist heaps](https://reader033.vdocuments.us/reader033/viewer/2022061608/568164c8550346895dd6e19e/html5/thumbnails/11.jpg)
11Leftist heaps
Merging
In the special case that the right sub-heap of A is empty, we attach the leftist heap B as the right sub-heap of A
![Page 12: Leftist heaps](https://reader033.vdocuments.us/reader033/viewer/2022061608/568164c8550346895dd6e19e/html5/thumbnails/12.jpg)
12Leftist heaps
Merging
If, however, A2 is not empty, we must merge these two recursively:– Either A2 ≤ B or A2 > B
![Page 13: Leftist heaps](https://reader033.vdocuments.us/reader033/viewer/2022061608/568164c8550346895dd6e19e/html5/thumbnails/13.jpg)
13Leftist heaps
Merging
If A2 ≤ B, we repeat the process and merge the leftist heap B with the right sub-heap A22
![Page 14: Leftist heaps](https://reader033.vdocuments.us/reader033/viewer/2022061608/568164c8550346895dd6e19e/html5/thumbnails/14.jpg)
14Leftist heaps
Merging
If B < A2, B becomes the right sub-heap of A and we now merge the right sub-heap of B with the sub-heap A2
![Page 15: Leftist heaps](https://reader033.vdocuments.us/reader033/viewer/2022061608/568164c8550346895dd6e19e/html5/thumbnails/15.jpg)
15Leftist heaps
Merging
The three cases for merging heaps A2 and B
A2 is empty A2 ≤ B B < A2
![Page 16: Leftist heaps](https://reader033.vdocuments.us/reader033/viewer/2022061608/568164c8550346895dd6e19e/html5/thumbnails/16.jpg)
16Leftist heaps
Merging
Implementation:
template <typename Type>int Binary_tree<Type>::leftist_merge( Binary_tree<Type> *tree, Binary_tree<Type> *&ptr_to_this ) { // Perform the merge if ( empty() ) { ptr_to_this = tree; } else if ( retrieve() < tree->retrieve() ) { right()->leftist_merge( tree, right_tree ); } else { ptr_to_this = tree; tree->right()->leftist_merge( this, tree->right_tree ); }
// Corrections to maintain leftist property...}
![Page 17: Leftist heaps](https://reader033.vdocuments.us/reader033/viewer/2022061608/568164c8550346895dd6e19e/html5/thumbnails/17.jpg)
17Leftist heaps
Merging
This procedure is repeated until the right sub-heap of tree is empty and the heap being merged is attached
Once we have finished the merging process, we have a heap; however, it may no longer be leftist– As we traverse back to the root, compare the min-npls of the two sub-
heaps and swap them if the right min-npl is greater than the left min-npl– Recall that heaps are not ordered trees
![Page 18: Leftist heaps](https://reader033.vdocuments.us/reader033/viewer/2022061608/568164c8550346895dd6e19e/html5/thumbnails/18.jpg)
18Leftist heaps
Merging
Consider merging these two leftist heaps
![Page 19: Leftist heaps](https://reader033.vdocuments.us/reader033/viewer/2022061608/568164c8550346895dd6e19e/html5/thumbnails/19.jpg)
19Leftist heaps
Merging
Comparing the root nodes, 1 < 3 and thus we must merge the first leftist heap with the right sub-heap of the first heap
![Page 20: Leftist heaps](https://reader033.vdocuments.us/reader033/viewer/2022061608/568164c8550346895dd6e19e/html5/thumbnails/20.jpg)
20Leftist heaps
Merging
Comparing 3 and 4, 4 > 3 so we exchange the two heaps and merge the detached sub-heap with the right sub-heap of 3
![Page 21: Leftist heaps](https://reader033.vdocuments.us/reader033/viewer/2022061608/568164c8550346895dd6e19e/html5/thumbnails/21.jpg)
21Leftist heaps
Merging
Comparing 4 and 5, we exchange the two heaps and merge the detached sub-heap with the right sub-heap of 4
![Page 22: Leftist heaps](https://reader033.vdocuments.us/reader033/viewer/2022061608/568164c8550346895dd6e19e/html5/thumbnails/22.jpg)
22Leftist heaps
Merging
The right sub-heap of 4 is empty, and therefore we attach the heap with root 5
![Page 23: Leftist heaps](https://reader033.vdocuments.us/reader033/viewer/2022061608/568164c8550346895dd6e19e/html5/thumbnails/23.jpg)
23Leftist heaps
Merging
The heaps are merged, but the result is not a leftist heap
We must recurs to the root and swap sub-heaps where necessary
![Page 24: Leftist heaps](https://reader033.vdocuments.us/reader033/viewer/2022061608/568164c8550346895dd6e19e/html5/thumbnails/24.jpg)
24Leftist heaps
Merging
Node 3 is not a leftist heap and therefore we swap the two nodes
![Page 25: Leftist heaps](https://reader033.vdocuments.us/reader033/viewer/2022061608/568164c8550346895dd6e19e/html5/thumbnails/25.jpg)
25Leftist heaps
Merging
The root continues to have the leftist property and therefore we have merged the two leftist heaps
![Page 26: Leftist heaps](https://reader033.vdocuments.us/reader033/viewer/2022061608/568164c8550346895dd6e19e/html5/thumbnails/26.jpg)
26Leftist heaps
Merging
Implementation:
template <typename Type>int Binary_tree<Type>::leftist_merge( Binary_tree<Type> *tree, Binary_tree<Type> *&ptr_to_this ) { // Perform the merge
// Corrections to maintain leftist property
if ( left()->min_null_path_length() < right()->min_null_path_length() ) {
std::swap( left_tree, right_tree ); }}
![Page 27: Leftist heaps](https://reader033.vdocuments.us/reader033/viewer/2022061608/568164c8550346895dd6e19e/html5/thumbnails/27.jpg)
27Leftist heaps
Leftist Heaps
Why the leftist property?– The leftist property causes an imbalance towards the left– Insertions and merges are always performed to the right– This results in a balancing effect
A push or insertion is simply the merging of an existing leftist heap and a trivial heap of size 1
![Page 28: Leftist heaps](https://reader033.vdocuments.us/reader033/viewer/2022061608/568164c8550346895dd6e19e/html5/thumbnails/28.jpg)
28Leftist heaps
Pop
We will demonstrate a pop from a leftist heap
![Page 29: Leftist heaps](https://reader033.vdocuments.us/reader033/viewer/2022061608/568164c8550346895dd6e19e/html5/thumbnails/29.jpg)
29Leftist heaps
Pop
Removing the minimum node results in two sub-heaps which we must merge
![Page 30: Leftist heaps](https://reader033.vdocuments.us/reader033/viewer/2022061608/568164c8550346895dd6e19e/html5/thumbnails/30.jpg)
30Leftist heaps
Pop
Comparing the two root nodes, we must merge the 2nd heap with the right sub-heap of the first:
![Page 31: Leftist heaps](https://reader033.vdocuments.us/reader033/viewer/2022061608/568164c8550346895dd6e19e/html5/thumbnails/31.jpg)
31Leftist heaps
Pop
Comparing 6 and 3, we exchange the two heaps and merge the detached sub-heap with the right sub-heap of 3
![Page 32: Leftist heaps](https://reader033.vdocuments.us/reader033/viewer/2022061608/568164c8550346895dd6e19e/html5/thumbnails/32.jpg)
32Leftist heaps
Pop
Comparing 7 and 6, we exchange the two heaps and merge the detached sub-heap with the right sub-heap of 6
![Page 33: Leftist heaps](https://reader033.vdocuments.us/reader033/viewer/2022061608/568164c8550346895dd6e19e/html5/thumbnails/33.jpg)
33Leftist heaps
Pop
The right sub-heap of 4 is empty, and therefore we attach the heap with root 5
![Page 34: Leftist heaps](https://reader033.vdocuments.us/reader033/viewer/2022061608/568164c8550346895dd6e19e/html5/thumbnails/34.jpg)
34Leftist heaps
Pop
As before, the heaps are merged, but the result is not a leftist heap– We must recurs back to the root and swap where necessary
![Page 35: Leftist heaps](https://reader033.vdocuments.us/reader033/viewer/2022061608/568164c8550346895dd6e19e/html5/thumbnails/35.jpg)
35Leftist heaps
Pop
Node 6 is not a leftist heap and therefore we move the right sub-heap
![Page 36: Leftist heaps](https://reader033.vdocuments.us/reader033/viewer/2022061608/568164c8550346895dd6e19e/html5/thumbnails/36.jpg)
36Leftist heaps
Pop
The root is not a leftist heap and therefore we swap the two sub-heaps
![Page 37: Leftist heaps](https://reader033.vdocuments.us/reader033/viewer/2022061608/568164c8550346895dd6e19e/html5/thumbnails/37.jpg)
37Leftist heaps
Pop
The result is a leftist heap
![Page 38: Leftist heaps](https://reader033.vdocuments.us/reader033/viewer/2022061608/568164c8550346895dd6e19e/html5/thumbnails/38.jpg)
38Leftist heaps
Implementation
An implementation of a leftist heap data structure is available athttp://ece.uwaterloo.ca/~dwharder/aads/Algorithms/Leftist_heaps/
![Page 39: Leftist heaps](https://reader033.vdocuments.us/reader033/viewer/2022061608/568164c8550346895dd6e19e/html5/thumbnails/39.jpg)
39Leftist heaps
Summary
This topic has covered leftist heaps:– Allow an average-time O(ln(n)) merging of two heaps– Unlike a binary min-heap, this uses linked allocation
![Page 40: Leftist heaps](https://reader033.vdocuments.us/reader033/viewer/2022061608/568164c8550346895dd6e19e/html5/thumbnails/40.jpg)
40Leftist heaps
References
[1] Cormen, Leiserson, and Rivest, Introduction to Algorithms, MIT Press, 1990, §7.1-3, p.152.
[2] Weiss, Data Structures and Algorithm Analysis in C++, 3rd Ed., Addison Wesley, §6.5-6, p.215-25.
![Page 41: Leftist heaps](https://reader033.vdocuments.us/reader033/viewer/2022061608/568164c8550346895dd6e19e/html5/thumbnails/41.jpg)
41Leftist heaps
Usage Notes
• These slides are made publicly available on the web for anyone to use
• If you choose to use them, or a part thereof, for a course at another institution, I ask only three things:– that you inform me that you are using the slides,– that you acknowledge my work, and– that you alert me of any mistakes which I made or changes which you
make, and allow me the option of incorporating such changes (with an acknowledgment) in my set of slides
Sincerely,Douglas Wilhelm Harder, [email protected]