CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting...

47
Dynamic Programming Chapter 15

Transcript of CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting...

Page 1: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Dynamic

ProgrammingChapter 15

Page 2: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Dictionary Definition

Program (noun) \ ˈprō-ˌgram , -grəm \

a sequence of coded instructions that can be

inserted into a mechanism (such as a computer)

Programming (noun) \ ˈprō-ˌgra-miŋ , -grə-\

a plan of action to accomplish a specified end

Synonyms

progressing, plan out, arrange

Page 3: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Rod Cutting Problem

$13.10/ft $14.93/ft $21.10/ft $21.47/ft

Page 4: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Rod Cutting Problem

Given a rod of length 𝑛 inches and a table of

prices 𝑝𝑖 for 𝑖 = 1,2, … , 𝑛, determine the

maximum revenue 𝑟𝑛 obtainable by cutting up

the rod and selling the pieces.

Naïve solution?

Try all possibilities. Exponential!

Page 5: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Recursive Solution

Define 𝑟𝑖 as the maximum possible revenue

you can get for a rod of length 𝑖

We can express 𝑟𝑖 as follows

𝑟𝑖 = ൞

0 𝑖 = 0

max ൝𝑝𝑖

max1≤𝑗<𝑖

𝑟𝑗 + 𝑟𝑖−𝑗 𝑖 > 0

Final answer is 𝑟𝑛

The value of the

rod without

cutting

Trying all

possible cuts

Page 6: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Optimal Substructure

The problem is to find the optimal cut for a

rod of length 𝑛

Assuming that we cut 𝑛 at position 𝑖

This leads to two subproblem, cutting two

rods of lengths 𝑖 and 𝑛 − 𝑖

The optimal solution when 𝑛 is cut at position

𝑖 must include the optimal cuts of rods of

lengths 𝑖 and 𝑛 − 𝑖

Proof by contradiction

Page 7: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Recursive Solution (ruby)

def rodcut(i,p)

return 0 if i == 0

best_cut = p[i]

for j in (1..i-1)

value = rodcut(j,p) + rodcut(i-j,p)

best_cut = [best_cut, value].max

end

return best_cut

end

Page 8: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Execution Recurrence Tree

𝑛5

𝑛4 𝑛3 𝑛2 𝑛1

𝑛3 𝑛2 𝑛1 𝑛2 𝑛1 𝑛1

𝑛1𝑛2 𝑛1

𝑛1

Page 9: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Memoized Recursive Solution@best_cuts = []

def rodcut_memoized(i,p)

return 0 if i == 0

return @best_cuts[i] if @best_cuts[i]

best_cut = p[i]

for j in (1..i-1)

value = rodcut_memoized(j,p) +rodcut_memoized(i-j,p)

best_cut = [best_cut, value].max

end

return @best_cuts[i] = best_cut

end

Page 10: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Iterative Bottom-up Solution

def rodcut_bottomup(n,p)

best_cuts = []

for i in (1..n)

best_cuts[i] = p[i]

for j in (1..i-1)

value = best_cuts[j] + best_cuts[i-j]

best_cuts[i] = [best_cuts[i], value].max

end

end

return best_cuts[n]

end

Page 11: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Dynamic Programming

You have a big problem

You can break it down into smaller

subproblems

You don’t know the best way to split it

So, you try all possibilities

Identify similar subproblems that are solved

many times

Devise a better (polynomial) algorithm

Page 12: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Matrix Chain

Multiplication

Page 13: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Example

A110

100

A2100

5

A3

50

5Z10

50

𝐴1𝐴2𝐴3 = 𝐴1𝐴2 𝐴3

𝐴1𝐴2𝐴3 = 𝐴1 𝐴2𝐴3Cost?

Page 14: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Matrix Multiplication

def multiply(a, b)raise "Incompatible sizes" if a.columns != b.rowsc = Matrix.new(a.rows, b.columns)for i in (1..a.rows)for j in (1..b.columns)

c[i][j] = 0for k in (1..a.columns)c[i][j] += a[i][k] * b[k][j]

endend

endend

Page 15: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Example

A110

100

A2100

5

A3

50

5Z10

50

𝐶𝑜𝑠𝑡 𝐴1𝐴2 𝐴3 = 10 ∙ 100 ∙ 5 + 10 ∙ 5 ∙ 50 = 7,500

𝐶𝑜𝑠𝑡 𝐴1 𝐴2𝐴3 = 10 ∙ 100 ∙ 50 + 100 ∙ 5 ∙ 50 = 75,000

Page 16: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Problem

Given a sequence of (not necessarily square)

matrices 𝐴1, 𝐴2, … , 𝐴𝑛 where the dimensions

of matrix 𝐴𝑖 is 𝑝𝑖−1 × 𝑝𝑖. We want to find the

order of matrix multiplication operations to

compute the product 𝐴1 ∙ 𝐴2 ∙ ⋯ ∙ 𝐴𝑛 while

minimizing the number of scalar multiplication

operations.

Hint: Number of scalar multiplication operations

to computer 𝑋 ∙ 𝑌 with dimensions 𝑝 × 𝑞 and

𝑞 × 𝑟, respectively, is 𝑝 ∙ 𝑞 ∙ 𝑟

Page 17: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Recursive Implementation

def matrix_chain_multiplication(p, i, j)return 0 if i == j # No cost for one matrixmin_cost = Float::INFINITYfor k in (i..j-1)# Cost of left chaincost = matrix_chain_multiplication(p, i, k)) + # Cost of right chain

matrix_chain_multiplication(p, k+1, j) +# Cost of the final multiplication

p[i-1] * p[k] * p[j]min_cost = [min_cost, cost].min

endreturn min_cost

end

Page 18: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

With Memoization

@table = {}def matrix_chain_multiplication(p, i, j)

return 0 if i == j # No cost for one matrixreturn @table[range] if @table[range]min_cost = Float::INFINITYfor k in (i..j-1)# Cost of left chaincost = matrix_chain_multiplication(p, i, k)) + # Cost of right chain

matrix_chain_multiplication(p, k+1, j) +# Cost of the final multiplication

p[i-1] * p[k] * p[j]min_cost = [min_cost, cost].min

end@table[range] = min_costreturn min_cost

end

Page 19: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Recurrence Relation

𝑚[𝑖, 𝑗]: Minimum cost for multiplying matrices 𝑖 through 𝑗; 1 ≤ 𝑖 ≤ 𝑗 ≤ 𝑛

𝑚 𝑖, 𝑗 =

ቐ0 𝑖 = 𝑗

min𝑖≤𝑘<𝑗

𝑚 𝑖, 𝑘 + 𝑚 𝑘 + 1, 𝑗 + 𝑝𝑖−1𝑝𝑘𝑝𝑗 𝑖 < 𝑗

Page 20: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Bottom-up Solution

def matrix_chain_multiplication_botoom_up(p)m = {}; n = p.size# Initialize the diagonal (bottom level) with zerosfor i in (1..n)m[i..i] = 0

endfor l in (2..n) # Level or chain Lengthfor i in (1..(n-l+1))

j = i + l - 1m[i..j] = Float::INFINITYfor k in (i..(j-1))q = m[i..k] + m[(k+1)..j] + p[i-1]*p[k]*p[j]m[i..j] = q if q < m[i..j]

endend

endreturn m[range]

end

Page 21: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Bottom-up Approach

𝐴1 𝐴2 … 𝐴𝑛

Cost[𝐴𝑖 .. 𝐴𝑗]

0 0 0 0 0 0

𝑗 𝑖

Final answer

Page 22: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Longest Common

Subsequence

Page 23: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Definitions

Sequence A C C G G T C G A G

Subsequence A C G A A

Sequence G T C G T C G G A A T G C

Subsequence G C T A A T

Page 24: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Definitions

Sequence A C C G G T C G A G

Sequence G T C G T C G G A A T G C

Common subsequence G G T C

Page 25: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Definitions

Sequence A C C G G T C G A G

Sequence G T C G T C G G A A T G C

Common subsequence G G T C

Longer Common subsequence G G T C A G

Page 26: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Definitions

Sequence A C C G G T C G A G

Sequence G T C G T C G G A A T G C

Common subsequence G G T C

Longer Common subsequence G G T C A G

Longest Common subsequence G G T C G A G

Page 27: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Problem Definition

Given two sequences 𝑋 and 𝑌, we say that a

sequence 𝑍 is a common subsequence of

𝑋 and 𝑌 if it is a subsequence of both 𝑋 and

𝑌. For example, if 𝑋 = 𝐴, 𝐵, 𝐶, 𝐵, 𝐷, 𝐴, 𝐵 and

𝑌 = 𝐵,𝐷, 𝐶, 𝐴, 𝐵, 𝐴 , the sequence 𝐵, 𝐶, 𝐴 is

a common subsequence of 𝑋 and 𝑌; not a

longest one though. The problem is to find a

longest common subsequence of 𝑋 and 𝑌.

Page 28: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Optimal Substructure

Let 𝑥𝑚 and 𝑦𝑛 bet the last two characters in

the two sequences and 𝑧𝑘 be the last

character in the longest common

subsequence

𝑥𝑚 = 𝑦𝑛𝑥𝑚 ≠ 𝑦𝑛𝑧𝑘 = 𝑥𝑚?

𝑧𝑘 = 𝑦𝑛?

Page 29: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Recursive Algorithm

LCS(X, Y)

if X[m] == Y[n]

return LCS(X[1..m-1], Y[1..n-1]) + 1

if X[m] != Y[n]

return MAX(LCS(X[1..m], Y[1..n-1]), LCS(X[1..m-1],

Y[1..n])

Page 30: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Bottom-up Algorithm

j

i 0

B

1

D

2

C

3

A

4

B

5

A

6

0 0 0 0 0 0 0 0

A 1 0 0 0

B 2 0

C 3 0

B 4 0

D 5 0

A 6 0

B 7 0

Page 31: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Bottom-up Algorithm

j

i 0

B

1

D

2

C

3

A

4

B

5

A

6

0 0 0 0 0 0 0 0

A 1 0 0 0

B 2 0

C 3 0

B 4 0

D 5 0

A 6 0

B 7 0

Page 32: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Bottom-up Algorithm

j

i 0

B

1

D

2

C

3

A

4

B

5

A

6

0 0 0 0 0 0 0 0

A 1 0 0 0 0 1

B 2 0

C 3 0

B 4 0

D 5 0

A 6 0

B 7 0

Page 33: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Bottom-up Algorithm

j

i 0

B

1

D

2

C

3

A

4

B

5

A

6

0 0 0 0 0 0 0 0

A 1 0 0 0 0 1 1 1

B 2 0 1 1 1 1 2 2

C 3 0 1 1 2 2 2 2

B 4 0 1 1 2 2 3 3

D 5 0 1 2 2 2 3 3

A 6 0 1 2 2 3 3 4

B 7 0 1 2 2 3 4 4

Page 34: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Bottom-up Algorithm

j

i 0

B

1

D

2

C

3

A

4

B

5

A

6

0 0 0 0 0 0 0 0

A 1 0 0 0 0 1 1 1

B 2 0 1 1 1 1 2 2

C 3 0 1 1 2 2 2 2

B 4 0 1 1 2 2 3 3

D 5 0 1 2 2 2 3 3

A 6 0 1 2 2 3 3 4

B 7 0 1 2 2 3 4 4

Page 35: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Bottom-up Algorithm

j

i 0

B

1

D

2

C

3

A

4

B

5

A

6

0 0 0 0 0 0 0 0

A 1 0 0 0 0 1 1 1

B 2 0 1 1 1 1 2 2

C 3 0 1 1 2 2 2 2

B 4 0 1 1 2 2 3 3

D 5 0 1 2 2 2 3 3

A 6 0 1 2 2 3 3 4

B 7 0 1 2 2 3 4 4

Page 36: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Construction Algorithm

Page 37: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Print-LCS

Page 38: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Edit Distance

Page 39: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Minimum Edit Distance

How to measure the similarity of words or

strings?

Auto corrections: “rationg” -> {“rating”,

“ration”}

Alignment of DNA sequences

Page 40: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Edit Distance

Defined as the number of edit operations

from string 𝑋 to a string 𝑌.

The edit operations are:

Insertion: “ratio” → “ration”

Deletion: “rationg” → “rationg”

Substitution: “rationg” → “rations”

Example:

Edit distance of “Mickey” and “Mikey” is one

deletion operation

Page 41: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Minimum Edit Distance

Given two strings 𝑋 and 𝑌, find the minimum

edit distance between them. That is, find the

minimum number of edit operations that can

be applied on 𝑋 to transform it to 𝑌. Also, find

this sequence of operations.

Page 42: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Subproblem Formulation

G O B L I N

G O L D E N

Page 43: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Subproblem Formulation

G O B L I N

G O L D E N

If the last character in both strings is the same,

then we know that the optimal solution can copy

this value. Why?

The subproblem is formulated by removing the

last character of both

Page 44: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Subproblem Formulation

G O B L I

G O L D E

If the last character is different, then we do not

really know what would be the optimal edit

If we do not know the optimal edit, the next best

thing is to try everything

Page 45: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Subproblem Formulation

G O B L I

G O L D E

𝑃

G O B L I

G O L D

𝑋

𝑌

G O B L

G O L D E

G O B L

G O L D

𝑃1𝑋[1. . 𝑛]

𝑌[1. .𝑚 − 1]

Insert last

character in 𝑌

𝑃2𝑋[1. . 𝑛 − 1]

𝑌[1. .𝑚]

Delete last

character in 𝑋

𝑃3𝑋[1. . 𝑛 − 1]

𝑌[1. .𝑚 − 1]

Substitute the

last characters

Page 46: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Recurrence Relation

𝐷𝑖,𝑗: The cost of transforming 𝑋[1. . 𝑖] to

𝑌[1. . 𝑗]

𝐷𝑖𝑗 =

max 𝑖, 𝑗 ; 𝑖 = 0 ∨ 𝑗 = 0𝐷𝑖−1,𝑗−1 ; 𝑖 > 0 ∧ 𝑗 > 0 ∧ 𝑥𝑖 = 𝑦𝑗

min

𝐷𝑖,𝑗−1 + 𝑖𝑛𝑠𝑒𝑟𝑡𝑖𝑜𝑛 𝑐𝑜𝑠𝑡 𝑦𝑗𝐷𝑖−1,𝑗 + 𝑑𝑒𝑙𝑒𝑡𝑖𝑜𝑛 𝑐𝑜𝑠𝑡 𝑥𝑖

𝐷𝑖−1,𝑗−1 + 𝑠𝑢𝑏𝑠𝑡𝑖𝑡𝑢𝑡𝑖𝑜𝑛 𝑐𝑜𝑠𝑡 𝑥𝑖 , 𝑦𝑗

; 𝑖 > 0 ∧ 𝑗 > 0 ∧ 𝑥𝑖 ≠ 𝑥𝑗

𝑠𝑢𝑏𝑠𝑡𝑖𝑡𝑢𝑡𝑖𝑜𝑛 𝑐𝑜𝑠𝑡 𝑎, 𝑏 = ቊ0 ; 𝑎 = 𝑏1 ; 𝑎 ≠ 𝑏

𝐷𝑖,𝑗 =

max 𝑖, 𝑗 ; 𝑖 = 0 ∨ 𝑗 = 0

min

𝐷𝑖,𝑗−1 + 𝑖𝑛𝑠𝑒𝑟𝑡𝑖𝑜𝑛 𝑐𝑜𝑠𝑡 𝑦𝑗𝐷𝑖−1,𝑗 + 𝑑𝑒𝑙𝑒𝑡𝑖𝑜𝑛 𝑐𝑜𝑠𝑡 𝑥𝑖

𝐷𝑖−1,𝑗−1 + 𝑠𝑢𝑏𝑠𝑡𝑖𝑡𝑢𝑡𝑖𝑜𝑛 𝑐𝑜𝑠𝑡 𝑥𝑖 , 𝑦𝑗

; 𝑖 > 0 ∧ 𝑗 > 0

Page 47: CS141: Intermediate Data Structures and Algorithmseldawy/20WCS141/slides/CS141-5... · Rod Cutting Problem Given a rod of length inches and a table of prices for =1,2,…, , determine

Bottom-up Algorithm

j

i 0

G

1

O

2

L

3

D

4

E

5

N

6

0

G 1

O 2

B 3

L 4

I 5

N 6