Sunteți pe pagina 1din 64

Weight-biased Leftist Heaps

Rabea Aden

NUCES-FAST • Advanced Data Structures • Spring 2007


Weight-biased Leftist Tree
• Invented by Seonghun Cho and Sartaj Sahni

• A Weight-biased Leftist Tree is a priority queue

• An alternative to Height-biased Leftist Trees

• It satisfies the leftist structural property

For any node X Є Weight-biased Leftist Tree,


Rightmost path is the Shortest

NUCES-FAST • Advanced Data Structures • Spring 2007


Weight
• denoted by w(X)
• Number of internal nodes in subtree with root X

w(NULL) = 0

w(X) = 1 + w(leftChild(X)) + w(rightChild(X))

NUCES-FAST • Advanced Data Structures • Spring 2007


Weight
8

4 3

2 1 2 0
Null
1 0 0 0 1 0
Null Null Null Null w(NULL) = 0
0 0 0 0
Null Null Null Null

w(X) = 1 + w( leftChild(X) ), w( rightChild(X) )

NUCES-FAST • Advanced Data Structures • Spring 2007


Structural Property
• Weight-biased Leftist Property

∀ X ∈ WBLT w(LeftChild(X)) ≥ w(RightChild(X))

• Tree is unbalanced
• Biased towards left
• Left paths are long, giving the name Leftist Heap
• Rightmost path is the shortest

NUCES-FAST • Advanced Data Structures • Spring 2007


Structural Property
T1 T2
8 9

4 3 4 4*
Leftist Heap Property Violated
w(Left Child) < w(Right Child)

2 1 1 1 2 1 1 2

1 1 1

Weights: T1 is a Weight-biased Leftist Tree, T2 is not

NUCES-FAST • Advanced Data Structures • Spring 2007


Weight-biased Leftist Heap
• A Heap-ordered Weight-biased Leftist
Tree

NUCES-FAST • Advanced Data Structures • Spring 2007


Heap-order Property
• Min Leftist Heap

∀ X ∈ Heap key(X) ≥ key(Parent(X))

• Max Leftist Heap

∀ X ∈ Heap key(X) ≤ key(Parent(X))

If X is root
Parent (X) = root

NUCES-FAST • Advanced Data Structures • Spring 2007


Binary Heap vs.
Weight-biased Leftist Heap
Binary Heap Weight-biased Leftist Heap
— Perfectly balanced — Very unbalanced

Operations Binary Heap Weight-biased


Leftist Heap
BuildHeap O(N) O(N)
FindMin O(1) O(1)
Merge Θ(N) O(log N)
Insert O(log N) O(log N)
DeleteMin O(log N) O(log N)

NUCES-FAST • Advanced Data Structures • Spring 2007


Binary Heap vs.
Weight-biased Leftist Heap
Binary Heap Weight-biased Leftist Heap
— Perfectly balanced — Very unbalanced

Operations Binary Heap Weight-biased


Leftist Heap
BuildHeap O(N) O(N)
FindMin O(1) O(1)
Merge Θ(N) O(log N)
Insert O(log N) O(log N)
DeleteMin O(log N) O(log N)

Merge is expensive in ordinary Heaps

NUCES-FAST • Advanced Data Structures • Spring 2007


Theorem
In a weight-biased leftist tree, the
number of nodes N on the rightmost path
of any node x is ≤ log2 (w(x) + 1)

Proof is by Induction

NUCES-FAST • Advanced Data Structures • Spring 2007


Structure of a Node

Left Right
Lsize Data Rsize
Pointer Pointer

Apart from data, left and right pointers,


each node also contains Lsize and Rsize — the number
of nodes in left and right subtrees, respectively

NUCES-FAST • Advanced Data Structures • Spring 2007


Design
• A Weight-biased Leftist Tree is a priority queue

• A header node points to the root of the weight-


biased leftist tree with data = -∞ and left pointer
pointing to itself

• A bottom node acts as a common NULL node


with data = ∞

NUCES-FAST • Advanced Data Structures • Spring 2007


Structure of Header & Bottom Nodes

Header Node +∞ -∞ 0

Bottom Node ∞

Figure Empty min WBLT


NUCES-FAST • Advanced Data Structures • Spring 2007
Structure of Header & Bottom Nodes
Header Node +∞ -∞ 4

4
2 3 1
2 1
1 7 0 0 5 0
1
0 9 0

Bottom Node ∞

Figure min WBLT


NUCES-FAST • Advanced Data Structures • Spring 2007
Operations
• BuildHeap O(N)
• FindMin O(1)
• Merge O(log N)
• Insert O(log N)
• DeleteMin O(log N)

NUCES-FAST • Advanced Data Structures • Spring 2007


General Idea
• All insertions and merges are performed on the
rightmost path containing at most  log2 (n + 1)
nodes

• This may violate Weight-biased Leftist Heap


Property
• Weight-biased Leftist Heap Property can be
easily restored

NUCES-FAST • Advanced Data Structures • Spring 2007


Merge
• O(log N) time

• It is a fundamental operation
– Both Insert and DeleteMin are based on Merge
– Insert:
• The key to be inserted is a node
• Merge this node with the given min leftist heap
– DeleteMin
• Delete root, left and right child of root are two min leftist heaps
• Merge the two min leftist heaps

NUCES-FAST • Advanced Data Structures • Spring 2007


Insert
Existing min leftist heap — H1
The key to be inserted is a node — Y, where data(Y) = key
X = header node
While data( rightChild(X) ) < key
Increment Rsize(X) by 1
If Lsize(X) < Rsize(X) then swap children of X and X = leftChild(X)
Otherwise X = rightChild(X)
leftChild(Y) = rightChild(X) and rightChild(Y) = bottom node
Lsize(Y) = Rsize(X) and Rsize(Y) = 0
If Lsize(X) = Rsize(x) then
 rightChild(X) = leftChild(X)
 leftChild(X) = Y
 Increment Lsize(X) by 1
Otherwise
 rightChild(X) = Y
 Inrement Rsize(X) by 1
NUCES-FAST • Advanced Data Structures • Spring 2007
Insert 3
Header
HeaderNode
Node ∞ -∞ 99
X = header node Header Node
Header Node ∞ -∞
-∞ 8 0 3 0

Since data(rightChild(X)) '5' > key '3' 99


8
88 33 00
4 5 3
leftChild('3') = rightChild(X) '5' 4
8
3
rightChild(Y) = bottom node 4 5 3
2 11 1 1 13 1
4 3
2 1 1 1
Lsize('3') = Rsize(X) 1 20 02 11 1
0 23 0 0 19 0
1 13 1
0 17 0
'8' 1
2 1 1 1

Rsize('3') = 0 0 29 01 20 0 0 23 0 0 19 0 0 17 0
0 29
1 0
1
0 29
1 0

Since Lsize(X) ≠ Rsize(X) BottomNode


Bottom Node ∞
rightChild(X) = '3'
Bottom Node ∞
Increment Rsize(X)
by 1 '9'
NUCES-FAST • Advanced Data Structures • Spring 2007
Time Complexity of Insert
• O(log n)

• Create a one-node heap — O(1)


• As only shortest path is traversed — O(log n)

NUCES-FAST • Advanced Data Structures • Spring 2007


Merge Algorithm
Merge(H1, H2)
If both heaps are Leftist
If one heap is NULL then return the other
while H1 ≠ NULL
If Lsize(H1) < Rsize(H1) + w(H2) then work on leftChild(H1)
rightChild(H1) = leftChild(H1), Rsize(H1) = Lsize(H1), Lsize(H1) = Rsize(H1) + w(H2)
If data(H1) > data(H2) then leftChild(H1) = H2, H1 moves to its leftChild and H2
moves to H1's rightChild
Otherwise leftChild(H1) = rightChild(H1) and H1 moves to its rightChild
Otherwise work on rightChild(H1) (Symmetric case)
Move to rightChild(H1)
If Leftist Heap Property is violated i.e
If w(leftChild(H1)) < w( rightChild(H1)) then
swap children and weights of H1, leftChild(H1) = H2 & Lsize(H1) = w(H2)
Otherwise rightChild(H1) = H2 & Rsize = w(H2)
NUCES-FAST • Advanced Data Structures • Spring 2007
Merge
Header Node ∞ -∞ 3

2 2

1 18 1 1 9 1
1 1 1 1

0 29 0 0 25 0 0 14 0 0 12 0

Bottom Node ∞

Merge the two min weight-biased leftist heaps

NUCES-FAST • Advanced Data Structures • Spring 2007


Merge
Header Node ∞ -∞ 3

2 2
1 18 1 1 9 1
1 1 1 1
0 29 0 0 25 0 0 14 0 0 12 0

Bottom Node ∞

Since data(H1) '18' > data(H2) '19'


Swap the two
NUCES-FAST • Advanced Data Structures • Spring 2007
Merge
Header Node ∞ -∞ 7

2 2
1 9 1 1 18 1
1 1 1 1
0 14 0 0 12 0 0 29 0 0 25 0

Bottom Node ∞

Merge the two min weight-biased leftist heaps

NUCES-FAST • Advanced Data Structures • Spring 2007


Merge
Header Node ∞ -∞ 3

2 2
1 9 1 1 18 1
1 1 1 1
0 14 0 0 12 0 0 29 0 0 25 0

Bottom Node ∞

H1 '9' now becomes rightChild of Header node


Rsize(Header Node) = '3'
NUCES-FAST • Advanced Data Structures • Spring 2007
Merge

Header Node ∞ -∞ 3

2 2
1 9 1 1 18 1
1 1 1 1
0 14 0 0 12 0 0 29 0 0 25 0

Bottom Node ∞

H1 '9' now becomes rightChild of Header node


Rsize(Header Node) = '3'
NUCES-FAST • Advanced Data Structures • Spring 2007
Merge

Header Node ∞ -∞ 3

2 2
1 9 1 1 18 1
1 1 1 1
0 14 0 0 12 0 0 29 0 0 25 0

Bottom Node ∞

Since data(H2) '18' > data(H1) '9' and w(H2) + Rsize(Header) = 6

NUCES-FAST • Advanced Data Structures • Spring 2007


Merge

Header Node ∞ -∞ 6

2 2
4 9 1 1 18 1
1 1 1 1
0 14 0 0 12 0 0 29 0 0 25 0

Bottom Node ∞

Rsize(Header Node) = '6'

NUCES-FAST • Advanced Data Structures • Spring 2007


Merge

Header Node ∞ -∞ 6

2 2

1+3=4 4 9 1 1 18 1
1 1 1 1
0 14 0 0 12 0 0 29 0 0 25 0

Bottom Node ∞

Since Lsize(H1) '1' < Rsize(H1) + w(H2) '4' Leftist Property is violated

NUCES-FAST • Advanced Data Structures • Spring 2007


Merge

Header Node ∞ -∞ 7

2 2
4 9 1 1 18 1
1 1 1 1
0 14 0 0 12 0 0 29 0 0 25 0

Bottom Node ∞

Swap children of H1

NUCES-FAST • Advanced Data Structures • Spring 2007


Merge

Header Node ∞ -∞ 6

2 2
4 9 1 1 18 1
1 1 1 1
0 12 0 0 14 0 0 29 0 0 25 0

Bottom Node ∞

Swap children of H1

NUCES-FAST • Advanced Data Structures • Spring 2007


Merge

Header Node ∞ -∞ 7

2 2
4 9 1 1 18 1
1 1 1 1
0 12 0 0 14 0 0 29 0 0 25 0

Bottom Node ∞

Work on left of H1 — Compare data(H1) '12' and data(H2) '18'


Since data(H1) < data(H2) — H1 moves to its rightChild 'NULL'
NUCES-FAST • Advanced Data Structures • Spring 2007
Merge

Header Node ∞ -∞ 6

2 2
4 9 1 1 18 1
1 1 1 1

0+3=3 3 12 0 0 14 0 0 29 0 0 25 0

Bottom Node ∞

Since rightChild(H1) is 'NULL' and attaching H2 to right of H1 violates Leftist


Property — Lsize(H1) = 3
NUCES-FAST • Advanced Data Structures • Spring 2007
Merge

Header Node ∞ -∞ 6

2 2
4 9 1 1 18 1
4 1 1 1

0+3=3 3 12 0 0 14 0 0 29 0 0 25 0

Bottom Node ∞

w(rightChild(H1)) = '4'
NUCES-FAST • Advanced Data Structures • Spring 2007
Merge

Header Node ∞ -∞ 6

2 2
4 9 1 1 18 1
4 1 1 1
3 12 0 0 14 0 0 29 0 0 25 0

Bottom Node ∞

w(rightChild(H1)) = '4'
NUCES-FAST • Advanced Data Structures • Spring 2007
Merge

Header Node ∞ -∞ 6

2 2
4 9 1 1 18 1
4 1 1 1
3 12 0 0 14 0 0 29 0 0 25 0

Bottom Node ∞

H2 becomes leftChild(H1)
NUCES-FAST • Advanced Data Structures • Spring 2007
Merge

Header Node ∞ -∞ 6

2 2
4 9 1 1 18 1
4 1 1 1
3 12 0 0 14 0 0 29 0 0 25 0

Bottom Node ∞

H2 becomes leftChild(H1)
NUCES-FAST • Advanced Data Structures • Spring 2007
Merge
Header Node ∞ -∞ 6

2
4 9 1
1 1
3 12 0 0 14 0
2
1 18 1

1 1
0 29 0 0 25 0

Bottom Node ∞

H2 becomes leftChild(H1)
NUCES-FAST • Advanced Data Structures • Spring 2007
Merge
Header Node ∞ -∞ 6

2
4 9 1
1 1
3 12 0 0 14 0
2
1 18 1

1 1
0 29
1 0 0 25
1 0

Bottom Node ∞

NUCES-FAST • Advanced Data Structures • Spring 2007


Time Complexity of Merge
• O(log n)

• As only shortest path is traversed

NUCES-FAST • Advanced Data Structures • Spring 2007


DeleteMin
• O(log N) time

DeleteMin is based on Merge


 Delete root — (minimum value is in root)
 Left and right children of root are two min
leftist heaps — H1 and H2 respectively
 Merge the two min leftist heaps H1 and H2

NUCES-FAST • Advanced Data Structures • Spring 2007


DeleteMin
Header Node ∞ -∞ 7

7
3 7 3
3 3
1 18 1 1 9 1
1 1 1 1
0 29 0 0 25 0 0 14 0 0 12 0

Bottom Node ∞

NUCES-FAST • Advanced Data Structures • Spring 2007


DeleteMin
Header Node ∞ -∞ 7

3
3 7 3
2 2
1 18 1 1 9 1
1 1 1 1
0 29 0 0 25 0 0 14 0 0 12 0

Bottom Node ∞

Delete '7'

NUCES-FAST • Advanced Data Structures • Spring 2007


DeleteMin
Header Node ∞ -∞ 3

2 2
1 18 1 1 9 1
1 1 1 1
0 29 0 0 25 0 0 14 0 0 12 0

Bottom Node ∞

Since data(H1) '18' > data(H2) '19'


Swap the two
NUCES-FAST • Advanced Data Structures • Spring 2007
DeleteMin
Header Node ∞ -∞ 3

2 2
1 18 1 1 9 1
1 1 1 1
0 29 0 0 25 0 0 14 0 0 12 0

Bottom Node ∞

Merge the two min weight-biased leftist heaps

NUCES-FAST • Advanced Data Structures • Spring 2007


DeleteMin
Header Node ∞ -∞ 7

2 2
1 9 1 1 18 1
1 1 1 1
0 14 0 0 12 0 0 29 0 0 25 0

Bottom Node ∞

H1 '9' now becomes rightChild of Header node


Rsize(Header Node) = '3'
NUCES-FAST • Advanced Data Structures • Spring 2007
DeleteMin
Header Node ∞ -∞ 3

2 2
1 9 1 1 18 1
1 1 1 1
0 14 0 0 12 0 0 29 0 0 25 0

Bottom Node ∞

H1 '9' now becomes rightChild of Header node


Rsize(Header Node) = '3'
NUCES-FAST • Advanced Data Structures • Spring 2007
DeleteMin

Header Node ∞ -∞ 3

2 2
1 9 1 1 18 1
1 1 1 1
0 14 0 0 12 0 0 29 0 0 25 0

Bottom Node ∞

Since data(H2) '18' > data(H1) '9' and w(H2) + Rsize(Header) = 6

NUCES-FAST • Advanced Data Structures • Spring 2007


DeleteMin

Header Node ∞ -∞ 3

2 2
1 9 1 1 18 1
1 1 1 1
0 14 0 0 12 0 0 29 0 0 25 0

Bottom Node ∞

Rsize(Header Node) = '6'

NUCES-FAST • Advanced Data Structures • Spring 2007


DeleteMin

Header Node ∞ -∞ 6

2 2
4 9 1 1 18 1
1 1 1 1
0 14 0 0 12 0 0 29 0 0 25 0

Bottom Node ∞

Since Lsize(H1) '1' < Rsize(H1) + w(H2) '4' Leftist Property is violated

NUCES-FAST • Advanced Data Structures • Spring 2007


DeleteMin

Header Node ∞ -∞ 6

2 2

1+3=4 4 9 1 1 18 1
1 1 1 1
0 14 0 0 12 0 0 29 0 0 25 0

Bottom Node ∞

NUCES-FAST • Advanced Data Structures • Spring 2007


DeleteMin

Header Node ∞ -∞ 7

2 2
4 9 1 1 18 1
1 1 1 1
0 14 0 0 12 0 0 29 0 0 25 0

Bottom Node ∞

Swap children of H1

NUCES-FAST • Advanced Data Structures • Spring 2007


DeleteMin

Header Node ∞ -∞ 6

2 2
4 9 1 1 18 1
1 1 1 1
0 12 0 0 14 0 0 29 0 0 25 0

Bottom Node ∞

Swap children of H1

NUCES-FAST • Advanced Data Structures • Spring 2007


DeleteMin

Header Node ∞ -∞ 7

2 2
4 9 1 1 18 1
1 1 1 1
0 12 0 0 14 0 0 29 0 0 25 0

Bottom Node ∞

Work on left of H1 — Compare data(H1) '12' and data(H2) '18'


Since data(H1) < data(H2) — H1 moves to its rightChild 'NULL'
NUCES-FAST • Advanced Data Structures • Spring 2007
DeleteMin

Header Node ∞ -∞ 6

2 2
4 9 1 1 18 1
1 1 1 1

0+3=3 3 12 0 0 14 0 0 29 0 0 25 0

Bottom Node ∞

Since rightChild(H1) is 'NULL' and attaching H2 to right of H1 violates Leftist


Property — Lsize(H1) = '3'
NUCES-FAST • Advanced Data Structures • Spring 2007
DeleteMin

Header Node ∞ -∞ 6

2 2
4 9 1 1 18 1
4 1 1 1

0+3=3 3 12 0 0 14 0 0 29 0 0 25 0

Bottom Node ∞

w(rightChild(H1)) = '4'
NUCES-FAST • Advanced Data Structures • Spring 2007
DeleteMin

Header Node ∞ -∞ 6

2 2
4 9 1 1 18 1
4 1 1 1
3 12 0 0 14 0 0 29 0 0 25 0

Bottom Node ∞

w(rightChild(H1)) = '4'
NUCES-FAST • Advanced Data Structures • Spring 2007
DeleteMin

Header Node ∞ -∞ 6

2 2
4 9 1 1 18 1
4 1 1 1
3 12 0 0 14 0 0 29 0 0 25 0

Bottom Node ∞

H2 becomes leftChild(H1)
NUCES-FAST • Advanced Data Structures • Spring 2007
DeleteMin

Header Node ∞ -∞ 6

2 2
4 9 1 1 18 1
4 1 1 1
3 12 0 0 14 0 0 29 0 0 25 0

Bottom Node ∞

H2 becomes leftChild(H1)
NUCES-FAST • Advanced Data Structures • Spring 2007
DeleteMin
Header Node ∞ -∞ 6

2
4 9 1
1 1
3 12 0 0 14 0
2
1 18 1

1 1
0 29 0 0 25 0

Bottom Node ∞

H2 becomes leftChild(H1)
NUCES-FAST • Advanced Data Structures • Spring 2007
DeleteMin
Header Node ∞ -∞ 6

2
4 9 1
1 1
3 12 0 0 14 0
2
1 18 1

1 1
0 29
1 0 0 25
1 0

Bottom Node ∞

NUCES-FAST • Advanced Data Structures • Spring 2007


Time Complexity of DeleteMin
• O(log n)

• Delete root — O(1)


• Initialize H1 with left child of root — O(1)
• Initialize H2 with right child of root — O(1)
• Merge — O(log n)
– As only shortest path is traversed

NUCES-FAST • Advanced Data Structures • Spring 2007


Height-Biased vs. Weight-Biased
Leftist Heaps
• Insert and Delete • Insert and Delete
• 2 passes: • Single pass
– top-down & – Top-down
– bottom-up (to adjust
npl)

NUCES-FAST • Advanced Data Structures • Spring 2007