Transcript Document
Heaps and the Disjoint Sets Data
Structures
• Reading Material: Chapter 4 from the text
book.
• Background Material (Chapter 3): Please
refer to Online Lectures 13 and 14 for the
review material for Chapter 3.
Heaps
• Heaps are used to efficiently implement
two operations:
– Insert
– Find Max
• Definition: A Heap is a complete binary
tree with each node satisfying the heap
property:
– Max-heap: The key stored in the node is greater than
or equal to both keys stored in its children, if any.
– Min-heap: The key stored in the node is less than or
equal to both keys stored in its children, if any.
Example of a Min-Heap and Its
Implementation
2
4
10
6
22
5
7
14
11
9
13
18 12
2 4 10 6 5 11 13 22 7 14 9 18 12
Heap Operations
• The heap data structure supports the
following operations
–
–
–
–
delete_max[H] (or delete_min[H]):
insert[H,x]:
delete[H,i]:
makeheap[A]:
• Implementation of the above operations
necessitates the introduction of two
subprograms, viz. sift-up and sift-down.
– We restrict our discussion to max-heaps.
Sift Up
• In a max-heap, if the value at a node, other
than the root, becomes greater than its
parent, the heap property can be restored by
swapping the current node and its parent,
repeating this process for the parent if
necessary, until
– the key at the node is less than or equal to that
of the parent.
– we reach the root.
Sift Up Algorithm
Procedure Sift-Up
Input: H[1..n], i where 1 i n.
Output: H, where no node is greater than its
parent on the path from node i to the root.
done := false;
if i = 1 then exit; /* Node i is the root */
repeat
if key(H[i]) > key(H[i/2]) then
swap(H[i],H[i/2]);
else
done := true;
end if;
i := i/2;
until i=1 or done;
Example
Sift-Down
• In a max-heap, if the value at a node
becomes less than the key of any of its
children, the heap property can be restored
by swapping the current node and the child
with maximum key value, repeating this
process if necessary until
– the key at the node is greater than or equal to
the keys of both children.
– we reach a leaf.
Sift-Down Algorithm
Procedure Sift-Down
Input: H[1..n], i where 1 i n.
Output: H[i] is percolated down, if needed, so
that it’s not smaller than its children.
done := false;
if (2*i) > n then exit; { is a leaf node }
repeat
i = 2*i;
if (i+1) n and key(H[i+1]) > key(H[i]) then
i := i+1;
if key(H[i/2]) < key(H[i]) then
swap(H[i],H[i/2]);
else
done := true;
end if;
until 2*i > n or done;
Example
Insertion into a Heap
• To insert an element x into a heap:
– Increase the size of the heap by 1
– Append x to the end of the heap
– Run the Sift-Up algorithm on x.
Algorithm insert
Input: A heap H[1..n] & a heap element x.
Output: A new heap H[1..n+1] with x
being one of its elements.
1. n := n + 1;
2. H[n] := x;
3. Sift-Up(H, n);
• The cost of this operation in the worst case is:
Deletion from a Heap
Algorithm Delete
Input: A nonempty heap H[1..n] and i where
1 i n.
Output: H[1..n-1] after H[i] is removed.
1. x := H[i]; y := H[n];
2. n := n – 1;
3. if i = n+1 then exit
4. H[i] := y;
5. if key(y) key(x) then
6
Sift-Up(H, i)
7. else Sift-Down(H, i)
end if
• The cost of deletion, in the worst case, is:
Delete-Max
• What is the algorithm for deleting the
maximum element?
Make-Heap Algorithm
• Work from high end of array to low end.
• Call SiftDown for each item.
• Don’t need to call SiftDown on leaf nodes.
Algorithm Make-Heap
Input: Array A[1..n] of n elements
Output: Max-heap A[1..n]
for i= n/2 downto 1
SiftDown(A,i);
end for;
Make-Heap Cost
• Cost for heap construction:
Heap-Sort
• Using previous operations, one can develop
a sorting algorithm for an array of n
elements.
• What is the cost of this sorting technique?
Disjoint Sets Data Structures
• Objective
Study a data structure that can represent disjoint
sets and support operations related to the
manipulation of disjoint sets in an efficient
manner.
– Disjoint-Sets Representation: Parent-Pointer
Implementation
– Disjoint-Sets Operations:
Union/Find
Parent Pointer Implementation For Forests
A
E
B
C
F
D
H
G
I
Index
1
Node
A B C D E F G H
Parent 0
2
1
3
1
4
3
5
6
7
8
J
K
L
9 10 11 12
I
J
K
L
Equivalence Class Problem
• The parent pointer representation is good for:
Find – Answering Q: “Do these two elements belong to the
–
•
same equivalence class?”
Efficiently compute the union of two
equivalence classes
Union
Hence, the parent pointer implementation
supports the above two important functionalities
for disjoint sets efficiently.
Union/Find
int FIND(int curr)
{ while (parent[curr]!= 0)
curr = parent[curr];
return curr; // At root
}
void UNION(int a, int b) {
int root1 = FIND(a);
// Find root for a
int root2 = FIND(b); // Find root for b
if (root1 != root2)
parent[root1] = root2;
}
Example 1
• Carry out the Union-Find algorithm for the
following set of equivalences assuming there are
8 objects indexed by the values 1 through 8.
(1,2) , (1,3) , (2,4) , (4,5) , (6,7) , (8,7)
• What do you notice regarding the number of
comparisons for carrying out the Union-Find
operations?
Improving Union-Find Algorithms
• Union-By-Rank Heuristic
• Path Compression
Union by Rank Heuristic
• Objective: Want to keep the depth small.
• Procedure: To carry out the union of the two
trees rooted at x and y, respectively, make
the root node of the tree with higher rank
the root of the Union tree with one of its
children being the root node of the other
tree.
– The rank of a node is the height of that node in the tree
– When the ranks of the two root nodes are equal, make
the root of the second tree the parent of the root of the
first tree.
Path Compression
• In order to reduce the height of the tree further, during the
FIND(x) operation, we can make each node on the path
from x up to the child of the root all point to the root. This
is called path compression
int FIND(int curr)
{
if (parent[curr] == 0)
return curr;
return parent[curr]=FIND(parent[curr]);
}
Example 2
•
Using the union-by-rank heuristic and path
compression, show the result from the following
series of equivalences on a set of objects indexed by
the values 1 through 16, assuming initially that each
element in the set is in an equivalence class
containing it alone. When the ranks of the two trees
are equal, make the root of the tree containing the
second object to be the root of the tree:
(1,3) (2,3) (4,5) (4,2) (10,12) (13,15) (13,10) (7,8)
(9,11) (8,15) (11, 2) (4,7) (9,13)
Analysis of Union and Find Using
Union By Rank Heuristic
• Theorem: rank(parent(x)) rank(x) + 1.
• Proof:
• Theorem: The value of rank(x) is initially zero and
increases in subsequent union operations until x is no
longer a root. Once x becomes a child of another node, its
rank never changes.
• Proof:
• Lemma: The number of nodes in a tree with root x is at
least 2rank(x) .
• Proof:
• Theorem: A sequence of m interspersed union-by-rank
and find operations costs O(m log n )
• Proof:
Time Complexity of Union and Find
Using Union By Rank and Path
Compression Heuristics
• Theorem: A sequence of m interspersed
union-by-rank and find operations using
path compression costs O(m log* n)
operations, where
log* n = min {i | log log …log n 1} for n > 1
= 0
for n=0,1
i times
• Proof: Out of the scope of an undergraduate course!