Greedy Algos
Greedy Algos
Greedy Algorithms
Greedy Algorithms
• A greedy algorithm always makes the choice that looks best
at the moment
• My everyday examples
• Playing cards
• Invest on stocks
• Choose a university
• The hope
• A locally optimal choice will lead to a globally optimal solution
Introduction
• An example:
• A cappuccino at Starbucks is$1.50
• Plus tax it is: 1.5*1.08 = $1.62
• Often, we give the cashier 2 $1 notes
• She need to give back, 38 cents as change
• Generally, you never see she gives you 38 pennies.
• What is algorithm here?
Coin changing problem
If n is large, in most of the subproblems it chooses quarter, so it is much faster than dynamic
programming and in DP
Coin changing problem
• Optimal substructure
• After the greedy choice, assuming the greedy choice is correct, can we get
the optimal solution from sub optimal result?
• 38 cents
• Assuming we have to choose 25
• Is a quarter + optimal coin(38-25) the optimal solution of 38 cents?
• Greedy choice property
• If we do not choose the largest coin, is there a better solution?
Coin changing problem
• 1. Prove that with coin denominations of “5, 1”, it has the greedy
choice property
• Proof:
Apply greedy choice: n = 5 + 5c + d
In a optimal solution if there is a nickel, the proof is done
If there is no nickel: n = d’=5 + d’’
Need to prove that: 1+d’’ <= d’
d’=5+d’’ > 1+d’’
• For “5, 1”, it has greedy choice property, greedy algorithm works
Coin changing problem
• 2. Prove that with coin denominations of “10, 5, 1”, it has the greedy
choice property
• Proof:
Apply greedy choice: n = 10 + 10b + 5c + d
• In a optimal solution if there is a dime, the proof is done
• If there is no dime : n = 5c’ + d’
• Since 5c’ + d’>=10
• with the conclusion of the previous slide, c’>=2
• 5c’ + d’ = 10 + 5(c’-2) + d’ and c’+d’ > 1+c’-2+d’
• it cannot be a optimal solution
• For “10, 5, 1”, it has greedy choice property, greedy algorithm works
Coin changing problem
• 3. Prove that with coin denominations of “25, 10, 5, 1”, it has the
greedy choice property
• Proof:
Apply greedy choice: n = 25 + 25a + 10b + 5c + d
• In a optimal solution if there is a quarter, the proof is done
• If there is no quarter : n = 10b’+5c’+d’
• Since 10b’+5c’+d’ >= 25
• if 25<=n<30, with the conclusion of previous slide, b’>=2, c’>=1
• 10b’+5c’+d’ = 25 + 10(b’-2) + 5(c’-1) + d’ and b’+c’+d’>1+b’-2+c’-1+d’
• it cannot be a optimal solution
• if n>=30, with the conclusion of previous slide, b’>=3
• 10b’+5c’+d’ = 25 + 10(b’-3) + 5(c’+1) + d’ and b’+c’+d’>1+b’-3+c’+1+d’
• it cannot be a optimal solution
For “25, 10, 5, 1”, it has greedy choice property, greedy algorithm works
Greedy versus dynamic programming
• Model as a graph:
» Undirected graph G = (V, E)
» Weight w(u, v) on each edge (u, v) ∈ E
» Find T ⊆ E such that
• T connects all vertices
• (T is a spanning tree)
• w(T ) = ∑ w(u, v) is minimized ( u ,v )∈T
Minimum Spanning Tree
• A spanning tree whose weight is minimum over all spanning trees is called
a
Minimum Spanning Tree, or MST
• Example:
•Which edges form the Minimum Spanning Tree (MST) of the below
graph?
A
6 4
5 9
H B C
14 2
10
15
G E D
3 8
F
Minimum Spanning Tree
Except for the dashed edge (u, v), all edges shown are
in T. A is some subset of
the edges of T, but A cannot contain any edges that
cross the cut (S, V − S), since
this cut respects A. Shaded edges are the path p.
Proof of theorem (1)
So, in GENERIC-MST:
• A is a forest containing connected components. Initially, each
component is a single vertex.
• Any safe edge merges two of these components into one. Each
component is a tree.
• Since an MST has exactly |V| − 1 edges, the for loop iterates |V| − 1
times. Equivalently, after adding |V|−1 safe edges, we.re down to just
one component.
Corollary
If C = (VC, EC) is a connected component in the forest GA = (V, A) and (u,
v) is a light edge connecting C to some other component in GA (i.e., (u,
v) is a light edge crossing the cut (VC, V − VC)), then (u, v) is safe for A.
Proof Set S = VC in the theorem.
Growing An MST
• Some properties of an MST:
It has |V| -1 edges
It has no cycles
It might not be unique
• Building up the solution
» We will build a set A of
edges
» Initially, A has no edges
» As we add edges to A,
maintain a loop invariant:
• Loop invariant: A is a
subset of some MST
» Add only edges that
maintain the invariant
If A is a subset of some
MST, an edge (u, v) is
safe for A
Growing An MST
Kruskal’s Algorithm
Run the algorithm:
Kruskal() 2 19
{ 9
14 17
T = ∅; 8 25
5
for each v ∈
V MakeSet(v); 21 13 1
• MST-Prim(G, w, 6 ∞ 4
5 9
r) Q = V[G]; ∞ ∞ ∞
• for each u ∈ Q
14 2
• key[u] = ∞; 10
• key[r] = 0; 15
∞ ∞ ∞
• П[r] = NULL;
3 ∞ 8
• while (Q not
empty) Run on example graph
•u = ExtractMin(Q); key[v])
• П[v] = u;
• key[v] =
w(u,v);
Prim’s Algorithm
• MST-Prim(G, w, 6 ∞ 4
5 9
r) Q = V[G]; ∞ ∞ ∞
• for each u ∈ Q
14 2
• key[u] = ∞; 10
• key[r] = 0; 15
r 0 ∞ ∞
• П[r] = NULL;
3 ∞ 8
• while (Q not
empty) Pick a start vertex r
•u = ExtractMin(Q); key[v])
• key[v] =
w(u,v);
Prim’s Algorithm
MST-Prim(G, w, r) 6 ∞ 4
Q = V[G]; 5 9
for each u ∈ Q
∞ ∞ ∞
key[u] = ∞; 14 2
key[r] = 0; 10
15
П[r] = NULL; u 0 ∞ ∞
while (Q not empty)
3 ∞ 8
u = ExtractMin(Q);
for each v ∈ Black vertices have been removed from Q
Adj[u]
if (v ∈ Q and w(u,v) <
key[v])
П[v] = u;
key[v] = w(u,v);
Prim’s Algorithm
• MST-Prim(G, w, 6 ∞ 4
5 9
r) Q = V[G]; ∞ ∞ ∞
• for each u ∈ Q
14 2
• key[u] = ∞; 10
• key[r] = 0; 15
u 0 ∞ ∞
• П[r] = NULL;
3 3 8
• while (Q not
empty) Black arrows indicate parent
•u = ExtractMin(Q); pointers
for each v ∈ Adj[u] key[v])
• if (v ∈ Q and
w(u,v) <
• П[v] = u;
• key[v] =
w(u,v);
Prim’s Algorithm
MST-Prim(G, w, r) 6 ∞ 4
Q = V[G]; 5 9
14 ∞ ∞
for each u ∈ Q
key[u] = ∞; 14 2
key[r] = 0; 10
15
П[r] = NULL; u 0 ∞ ∞
while (Q not empty)
3 3 8
u = ExtractMin(Q);
for each v ∈ Adj[u]
if (v ∈ Q and w(u,v) key[v])
<
П[v] = u;
key[v] = w(u,v);
Prim’s Algorithm
MST-Prim(G, w, r) 6 ∞ 4
Q = V[G]; 5 9
14 ∞ ∞
for each u ∈ Q
key[u] = ∞; 14 2
key[r] = 0; 10
15
П[r] = NULL; 0 ∞ ∞
while (Q not empty)
3 3 8
u = ExtractMin(Q); u
for each v ∈
if (v ∈ Q and w(u,v)
Adj[u] key[v])
<
П[v] = u;
key[v] = w(u,v);
Prim’s Algorithm
MST-Prim(G, w, r) 6 ∞ 4
Q = V[G]; 5 9
14 ∞ ∞
for each u ∈ Q
key[u] = ∞; 14 2
key[r] = 0; 10
15
П[r] = NULL; 0 8 ∞
while (Q not empty)
3 3 8
u = ExtractMin(Q); u
for each v ∈
if (v ∈ Q and w(u,v)
Adj[u] key[v])
<
П[v] = u;
key[v] = w(u,v);
Prim’s Algorithm
MST-Prim(G, w, r) 6 ∞ 4
Q = V[G]; 5 9
10 ∞ ∞
for each u ∈ Q
key[u] = ∞; 14 2
key[r] = 0; 10
15
П[r] = NULL; 0 8 ∞
while (Q not empty)
3 3 8
u = ExtractMin(Q); u
for each v ∈
if (v ∈ Q and w(u,v)
Adj[u] key[v])
<
П[v] = u;
key[v] = w(u,v);
Prim’s Algorithm
MST-Prim(G, w, r) 6 ∞ 4
Q = V[G]; 5 9
10 ∞ ∞
for each u ∈ Q
key[u] = ∞; 14 2
key[r] = 0; 10
15
П[r] = NULL; 0 8 ∞
while (Q not empty)
3 3 8
u = ExtractMin(Q); u
for each v ∈
if (v ∈ Q and w(u,v)
Adj[u] key[v])
<
П[v] = u;
key[v] = w(u,v);
Prim’s Algorithm
MST-Prim(G, w, r) 6 ∞ 4
Q = V[G]; 5 9
10 2 ∞
for each u ∈ Q
key[u] = ∞; 14 2
key[r] = 0; 10
15
П[r] = NULL; 0 8 ∞
while (Q not empty)
3 3 8
u = ExtractMin(Q); u
for each v ∈
if (v ∈ Q and w(u,v)
Adj[u] key[v])
<
П[v] = u;
key[v] = w(u,v);
Prim’s Algorithm
MST-Prim(G, w, r) 6 ∞ 4
Q = V[G]; 5 9
10 2 ∞
for each u ∈ Q
key[u] = ∞; 14 2
key[r] = 0; 10
15
П[r] = NULL; 0 8 15
while (Q not empty)
3 3 8
u = ExtractMin(Q); u
for each v ∈
if (v ∈ Q and w(u,v)
Adj[u] key[v])
<
П[v] = u;
key[v] = w(u,v);
Prim’s Algorithm
MST-Prim(G, w, r) ∞ u
6 4
Q = V[G]; 5 9
10 2 ∞
for each u ∈ Q
key[u] = ∞; 14 2
key[r] = 0; 10
15
П[r] = NULL; 0 8 15
while (Q not empty)
3 3 8
u = ExtractMin(Q);
for each v ∈
if (v ∈ Q and w(u,v)
Adj[u] key[v])
<
П[v] = u;
key[v] = w(u,v);
Prim’s Algorithm
MST-Prim(G, w, r) ∞ u
6 4
Q = V[G]; 5 9
10 2 9
for each u ∈ Q
key[u] = ∞; 14 2
key[r] = 0; 10
15
П[r] = NULL; 0 8 15
while (Q not empty)
3 3 8
u = ExtractMin(Q);
for each v ∈
if (v ∈ Q and w(u,v)
Adj[u] key[v])
<
П[v] = u;
key[v] = w(u,v);
Prim’s Algorithm
MST-Prim(G, w, r) 4 u
6 4
Q = V[G]; 5 9
10 2 9
for each u ∈ Q
key[u] = ∞; 14 2
key[r] = 0; 10
15
П[r] = NULL; 0 8 15
while (Q not empty)
3 3 8
u = ExtractMin(Q);
for each v ∈
if (v ∈ Q and w(u,v)
Adj[u] key[v])
<
П[v] = u;
key[v] = w(u,v);
Prim’s Algorithm
MST-Prim(G, w, r) 4 u
6 4
Q = V[G]; 5 9
5 2 9
for each u ∈ Q
key[u] = ∞; 14 2
key[r] = 0; 10
15
П[r] = NULL; 0 8 15
while (Q not empty)
3 3 8
u = ExtractMin(Q);
for each v ∈
if (v ∈ Q and w(u,v)
Adj[u] key[v])
<
П[v] = u;
key[v] = w(u,v);
Prim’s Algorithm
u
MST-Prim(G, w, r) 6 4 4
Q = V[G]; 5 9
5 2 9
for each u ∈ Q
key[u] = ∞; 14 2
key[r] = 0; 10
15
П[r] = NULL; 0 8 15
while (Q not empty)
3 3 8
u = ExtractMin(Q);
for each v ∈
if (v ∈ Q and w(u,v)
Adj[u] key[v])
<
П[v] = u;
key[v] = w(u,v);
Prim’s Algorithm
MST-Prim(G, w, r) u 4
6 4
Q = V[G]; 5 9
5 2 9
for each u ∈ Q
key[u] = ∞; 14 2
key[r] = 0; 10
15
П[r] = NULL; 0 8 15
while (Q not empty)
3 3 8
u = ExtractMin(Q);
for each v ∈
if (v ∈ Q and w(u,v)
Adj[u] key[v])
<
П[v] = u;
key[v] = w(u,v);
Prim’s Algorithm
u
MST-Prim(G, w, r) 6 4 4
Q = V[G]; 5 9
5 2 9
for each u ∈ Q
key[u] = ∞; 14 2
key[r] = 0; 10
15
П[r] = NULL; 0 8 15
while (Q not empty)
3 3 8
u = ExtractMin(Q);
for each v ∈
if (v ∈ Q and w(u,v)
Adj[u] key[v])
<
П[v] = u;
key[v] = w(u,v);
Prim’s Algorithm
MST-Prim(G, w, r) 6 4 4
Q = V[G]; 5 9
5 2 9
for each u ∈ Q
key[u] = ∞; 14 u
2
key[r] = 0; 10
15
П[r] = NULL; 0 8 15
while (Q not empty)
3 3 8
u = ExtractMin(Q);
for each v ∈
if (v ∈ Q and w(u,v)
Adj[u] key[v])
<
П[v] = u;
key[v] = w(u,v);
Prim’s Algorithm
We consider here only codes in which no codeword is also a prefix of some other codeword. Such
codes are called prefix codes.
Huffman codes
81
Char Freq
E 125
T 93
Huffman Code Construction A
O
80
76
I 73
N 71
S 65
R 61
H 55
L 41
D 40
C 31
U 27
C U
31 27
82
Char Freq
E 125
T 93
Huffman Code Construction A
O
80
76
I 73
N 71
S 65
R 61
58
H 55
L 41
D 40
C 31
U 27
58
C U
31 27
83
Char Freq
E 125
T 93
Huffman Code Construction A
81
80
O 76
I 73
N 71
S 65
R 61
58
H 55
L 41
D 40
81
D L
40 41 58
C U
31 27
84
Char Freq
E 125
113
Huffman Code Construction T 93
81
A 80
O 76
I 73
N 71
S 65
R 61
58
H 55
81 113
D L H
40 41 58 55
C U
31 27
85
Char Freq
126
E 125
Huffman Code Construction T
113
93
81
A 80
O 76
I 73
N 71
S 65
R 61
81 126 113
D L R S H
40 41 61 65 58 55
C U
31 27
86
Char Freq
144
126
Huffman Code Construction E 125
113
T 93
81
A 80
O 76
I 73
N 71
D L R S N I H
40 41 61 65 71 73 58 55
C U
31 27
87
Char Freq
156
144
Huffman Code Construction 126
E 125
113
T 93
81
A 80
O 76
156
A O
D L R S N I H
40 41 61 65 71 73 58 55
C U
31 27
88
Char Freq
174
156
Huffman Code Construction 144
126
E 125
113
T 93
81
156 174
A O T
D L R S N I H
40 41 61 65 71 73 58 55
C U
31 27
89
Char Freq
238
174
Huffman Code Construction 156
144
126
E 125
113
156 174
238
A O T E
D L R S N I H
40 41 61 65 71 73 58 55
C U
31 27
90
Char Freq
270
238
Huffman Code Construction 174
156
144
126
D L R S N I H
40 41 61 65 71 73 58 55
C U
31 27
91
Char Freq
330
270
Huffman Code Construction 238
174
156
330
D L R S N I H
40 41 61 65 71 73 58 55
C U
31 27
92
Char Freq
508
330
Huffman Code Construction
270
238
330 508
D L R S N I H
40 41 61 65 71 73 58 55
C U
31 27
93
Char Freq
838
838
330 508
D L R S N I H
40 41 61 65 71 73 58 55
C U
31 27
94
Huffman Code Construction
0 Char Freq Fixed Huff
1
E 125 0000 110
T 93 0001 011
0 1 A 0 80 0010 1 000
O 76 0011 001
I 73 0100 1011
0 1 0 1 0 N 1 71 0101 0 1010 1
S 65 0110 1001
A O T E
R 61 0111 1000
0 1 0 1 0 1 0 1
H 55 1000 1111
L 41 1001 0101
D L R S N I H
D 40 1010 0100
0 1
C 31 1011 11100
U 27 1100 11101
C U
Total 838 4.00 3.62
95
Correctness of Huffman’s algorithm
Proof Idea
• Step 1: Show that this problem satisfies the greedy choice property, that is, if
a greedy choice is made by Huffman's algorithm, an optimal solution remains
possible.
• Step 2: Show that this problem has an optimal substructure property, that is,
an optimal solution to Huffman's algorithm contains optimal solution to
subproblems.
• Step 3: Conclude correctness of Huffman's algorithm using step 1 and step 2.
Greedy Choice Property