Lecture 15
Minimum Spanning Trees
Lecture 15 Minimum Spanning Trees Announcements HW5 due Friday - - PowerPoint PPT Presentation
Lecture 15 Minimum Spanning Trees Announcements HW5 due Friday HW6 released Friday Last time Greedy algorithms Make a series of choices. Choose this activity, then that one, .. Never backtrack. Show that, at each step,
Minimum Spanning Trees
success.
the choices we’ve made so far.
Say we have an undirected weighted graph
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4 A spanning tree is a tree that connects all of the vertices.
A tree is a connected graph with no cycles!
Say we have an undirected weighted graph
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4 A spanning tree is a tree that connects all of the vertices.
A tree is a connected graph with no cycles!
This is a spanning tree. The cost of a spanning tree is the sum of the weights on the edges. This tree has cost 67
Say we have an undirected weighted graph
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4 A spanning tree is a tree that connects all of the vertices.
A tree is a connected graph with no cycles!
This is also a spanning tree. It has cost 37
Say we have an undirected weighted graph
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4 A spanning tree is a tree that connects all of the vertices. minimum
Say we have an undirected weighted graph
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4 A spanning tree is a tree that connects all of the vertices.
This is a minimum spanning tree. It has cost 37
minimum
Figure 2: Fully parsimonious minimal spanning tree of 933 SNPs for 282 isolates of Y. pestis colored by location.
Morelli et al. Nature genetics 2010
need to show something like: Suppose that our choices so far haven’t ruled out success. Then the next greedy choice that we make also won’t rule out success.
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
for a discussion of cuts in graphs!
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
This is the cut “{A,B,D,E} and {C,I,H,G,F}”
smallest weight of any edge crossing the cut.
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
A is the thick orange edges
smallest weight of any edge crossing the cut.
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
A is the thick orange edges This edge is light
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
A is the thick orange edges This edge is light
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
A is the thick orange edges We can safely add this edge to the tree This is precisely the sort of statement we need for a greedy algorithm: If we haven’t ruled
success so far, then adding a light edge still won’t rule it out.
y x u v b a
y x u v b a
will make a cycle.
y x u v b a Claim: Adding any additional edge to a spanning tree will create a cycle. Proof: Both endpoints are already in the tree and connected to each other.
will make a cycle.
crossing the cut.
y x u v b a Claim: Adding any additional edge to a spanning tree will create a cycle. Proof: Both endpoints are already in the tree and connected to each other.
y x u v b a
y x u v b a
containing (u,v).
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
A is the thick orange edges This edge is light
Back to MSTs!
Start growing a tree, greedily add the shortest edge we can to grow the tree.
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
Start growing a tree, greedily add the shortest edge we can to grow the tree.
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
Start growing a tree, greedily add the shortest edge we can to grow the tree.
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
Start growing a tree, greedily add the shortest edge we can to grow the tree.
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
Start growing a tree, greedily add the shortest edge we can to grow the tree.
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
Start growing a tree, greedily add the shortest edge we can to grow the tree.
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
Start growing a tree, greedily add the shortest edge we can to grow the tree.
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
Start growing a tree, greedily add the shortest edge we can to grow the tree.
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
Start growing a tree, greedily add the shortest edge we can to grow the tree.
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
Naively, the running time is O(nm):
n iterations of this while loop. Maybe take time m to go through all the edges and find the lightest.
rule out success.
have added so far.
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
A is the thick orange edges This edge is light
7 8
D C B A H G F I E
9 10 14 4 2 2 1 7 6 8 11 4
A is the set of edges selected so far.
7 8
D C B A H G F I E
9 10 14 4 2 2 1 7 6 8 11 4
A is the set of edges selected so far.
this edge is safe.
rule out success.
add this one next
induction) to guarantee correctness of Prim’s algorithm.
edges added so far.
edges added so far. YEP.
are safe), then it holds for t+1 (aka, the next edge we add is safe).
edges added so far.
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
I’m 7 away. C is the closest. I can’t get to the tree in one edge if you can get there in one edge.
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
I’m 7 away. C is the closest. I can’t get to the tree in one edge if you can get there in one edge.
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
I’m 7 away. C is the closest. I can’t get to the tree in one edge if you can get there in one edge.
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
I’m 7 away. C is the closest. I’m 10 away. F is the closest. if you can get there in one edge.
Every vertex has a key and a parent
∞ ∞ D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
∞ ∞ ∞ ∞ ∞ k[x] x
k[x] is the distance of x from the growing tree
Can’t reach x yet x is “active” Can reach x a b
p[b] = a, meaning that a was the vertex that k[b] comes from.
Until all the vertices are reached: ∞ x x
Every vertex has a key and a parent
∞ ∞ D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
∞ ∞ ∞ ∞ ∞ k[x] x
k[x] is the distance of x from the growing tree
Can’t reach x yet
x x is “active” x Can reach x a b
p[b] = a, meaning that a was the vertex that k[b] comes from.
Until all the vertices are reached: ∞
Every vertex has a key and a parent
∞ 8 D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
∞ ∞ ∞ ∞ 4 k[x] x
k[x] is the distance of x from the growing tree
Can’t reach x yet
x is “active” Can reach x a b
p[b] = a, meaning that a was the vertex that k[b] comes from.
Until all the vertices are reached: ∞ x x
Every vertex has a key and a parent
∞ 8 D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
∞ ∞ ∞ ∞ 4 k[x] x
k[x] is the distance of x from the growing tree
Can’t reach x yet
x is “active” Can reach x a b
p[b] = a, meaning that a was the vertex that k[b] comes from.
Until all the vertices are reached: ∞ x x
Every vertex has a key and a parent
∞ 8 D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
∞ ∞ ∞ ∞ 4 k[x] x
k[x] is the distance of x from the growing tree
Can’t reach x yet
x is “active” Can reach x a b
p[b] = a, meaning that a was the vertex that k[b] comes from.
Until all the vertices are reached: ∞ x x
Every vertex has a key and a parent
∞ 8 D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
∞ ∞ ∞ 8 4 k[x] x
k[x] is the distance of x from the growing tree
Can’t reach x yet
x is “active” Can reach x a b
p[b] = a, meaning that a was the vertex that k[b] comes from.
Until all the vertices are reached: ∞ x x
Every vertex has a key and a parent
∞ 8 D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
∞ ∞ ∞ 8 4 k[x] x
k[x] is the distance of x from the growing tree
Can’t reach x yet
x is “active” Can reach x a b
p[b] = a, meaning that a was the vertex that k[b] comes from.
Until all the vertices are reached: ∞ x x
Every vertex has a key and a parent
∞ 8 D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
∞ ∞ ∞ 8 4 k[x] x
k[x] is the distance of x from the growing tree
Can’t reach x yet
x is “active” Can reach x a b
p[b] = a, meaning that a was the vertex that k[b] comes from.
Until all the vertices are reached: ∞ x x
Every vertex has a key and a parent
∞ 8 D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
7 ∞ 4 8 4 k[x] x
k[x] is the distance of x from the growing tree
Can’t reach x yet
x is “active” Can reach x a b
p[b] = a, meaning that a was the vertex that k[b] comes from.
Until all the vertices are reached: 2 x x
Every vertex has a key and a parent
∞ 8 D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
7 ∞ 4 8 4 k[x] x
k[x] is the distance of x from the growing tree
Can’t reach x yet
x is “active” Can reach x a b
p[b] = a, meaning that a was the vertex that k[b] comes from.
Until all the vertices are reached: 2 x x
Every vertex has a key and a parent
∞ 8 D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
7 ∞ 4 8 4 k[x] x
k[x] is the distance of x from the growing tree
Can’t reach x yet
x is “active” Can reach x a b
p[b] = a, meaning that a was the vertex that k[b] comes from.
Until all the vertices are reached: 2 x x
Every vertex has a key and a parent
6 7 D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
7 ∞ 4 8 4 k[x] x
k[x] is the distance of x from the growing tree
Can’t reach x yet
x is “active” Can reach x a b
p[b] = a, meaning that a was the vertex that k[b] comes from.
Until all the vertices are reached: 2 x x
Every vertex has a key and a parent
6 7 D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
7 ∞ 4 8 4 k[x] x
k[x] is the distance of x from the growing tree
Can’t reach x yet
x x is “active” x Can reach x a b
p[b] = a, meaning that a was the vertex that k[b] comes from.
Until all the vertices are reached: 2
Every vertex has a key and a parent
6 7 D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
7 ∞ 4 8 4 k[x] x
k[x] is the distance of x from the growing tree
Can’t reach x yet
x x is “active” x Can reach x a b
p[b] = a, meaning that a was the vertex that k[b] comes from.
Until all the vertices are reached: 2
Every vertex has a key and a parent
2 7 D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
7 10 4 8 4 k[x] x
k[x] is the distance of x from the growing tree
Can’t reach x yet
x x is “active” x Can reach x a b
p[b] = a, meaning that a was the vertex that k[b] comes from.
Until all the vertices are reached: 2
Every vertex has a key and a parent
2 7 D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
7 10 4 8 4 k[x] x
k[x] is the distance of x from the growing tree
Can’t reach x yet
x x is “active” x Can reach x a b
p[b] = a, meaning that a was the vertex that k[b] comes from.
Until all the vertices are reached: 2
Every vertex has a key and a parent
2 7 D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
7 10 4 8 4 k[x] x
k[x] is the distance of x from the growing tree
Can’t reach x yet
x x is “active” x Can reach x a b
p[b] = a, meaning that a was the vertex that k[b] comes from.
Until all the vertices are reached: 2
we keep k[v] which we update by
U S T
3 2 2
One thing that is similar:
*See CS166
we’d implement Dijkstra!
greedy algorithms we saw last time.
what if we just always take the cheapest edge? whether or not it’s connected to what we have so far?
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
what if we just always take the cheapest edge? whether or not it’s connected to what we have so far?
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
what if we just always take the cheapest edge? whether or not it’s connected to what we have so far?
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
what if we just always take the cheapest edge? whether or not it’s connected to what we have so far?
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
what if we just always take the cheapest edge? whether or not it’s connected to what we have so far?
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
what if we just always take the cheapest edge? whether or not it’s connected to what we have so far?
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
what if we just always take the cheapest edge? whether or not it’s connected to what we have so far?
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4 That won’t cause a cycle
what if we just always take the cheapest edge? whether or not it’s connected to what we have so far?
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4 That won’t cause a cycle
what if we just always take the cheapest edge? whether or not it’s connected to what we have so far?
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4 That won’t cause a cycle
what if we just always take the cheapest edge? whether or not it’s connected to what we have so far?
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4 That won’t cause a cycle
what if we just always take the cheapest edge? whether or not it’s connected to what we have so far?
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4 That won’t cause a cycle
Naively, the running time is ???:
m iterations through this loop How do we check this?
How would you figure out if added e would make a cycle in this algorithm?
Let’s do this
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
A forest is a collection of disjoint trees
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
A forest is a collection of disjoint trees
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
A forest is a collection of disjoint trees
When we add an edge, we merge two trees:
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
A forest is a collection of disjoint trees
When we add an edge, we merge two trees:
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
A forest is a collection of disjoint trees
When we add an edge, we merge two trees:
We never add an edge within a tree since that would create a cycle.
“treehouse”?
makeSet(x) makeSet(y) makeSet(z) union(x,y)
x y z
makeSet(x) makeSet(y) makeSet(z) union(x,y)
x y z
makeSet(x) makeSet(y) makeSet(z) union(x,y) find(x)
x y z
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
To start, every vertex is in it’s own tree.
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
Then start merging.
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
Then start merging.
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
Then start merging.
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
Then start merging.
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
Then start merging.
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
Then start merging.
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
Then start merging.
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
Then start merging.
Stop when we have one big tree!
radixSort and take time O(m)
In practice, each of makeSet, find, and union run in constant time* *technically, they run in amortized time O(𝛽(𝑜)), where 𝛽(𝑜) is the inverse Ackerman function. 𝛽 𝑜 ≤ 4 provided that n is smaller than the number of atoms in the universe.
union-find data structure.
Now that we understand this “tree-merging” view, let’s do this one.
rule out success.
have added so far.
again!
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
A is the thick orange edges This edge is light
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
A is the set of edges selected so far.
A is the set of edges selected so far. D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
This is the next edge T2 T1
A is the set of edges selected so far. D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
This is the next edge T2 T1
this edge is safe.
rule out success.
induction) to guarantee correctness of Kruskal’s algorithm.
edges added so far.
edges added so far. YEP.
are safe), then it holds for t+1 (aka, the next edge we add is safe).
edges added so far.
This is exactly the same slide that we had for Prim’s algorithm.
Ackerman function, basically O(m) in practice.
greedy algorithms we saw last time.
crossing the cut.
D C B A H G F I E
7 9 10 14 4 2 2 1 7 6 8 11 8 4
A is the thick orange edges This edge is light
State-of-the-art MST on connected undirected graphs
time deterministic algorithm The optimal number of comparisons N*(n,m) you need to solve the problem, whatever that is…
success.
you must be successful.