Knuth-Morris-Pratt - Princeton University · 2010. 12. 2. · Knuth-Morris-Pratt construction...

20
Algorithms, 4 th Edition · Robert Sedgewick and Kevin Wayne · Copyright © 2002–2010 · December 1, 2010 10:58:30 PM Knuth-Morris-Pratt

Transcript of Knuth-Morris-Pratt - Princeton University · 2010. 12. 2. · Knuth-Morris-Pratt construction...

Page 1: Knuth-Morris-Pratt - Princeton University · 2010. 12. 2. · Knuth-Morris-Pratt construction Constructing the DFA for KMP substring search for A B A B A C 5 0 A1 B 2 3 4 5 6 C B,C

Algorithms, 4th Edition · Robert Sedgewick and Kevin Wayne · Copyright © 2002–2010 · December 1, 2010 10:58:30 PM

Knuth-Morris-Pratt

Page 2: Knuth-Morris-Pratt - Princeton University · 2010. 12. 2. · Knuth-Morris-Pratt construction Constructing the DFA for KMP substring search for A B A B A C 5 0 A1 B 2 3 4 5 6 C B,C

Include one state for each character in pattern (plus accept state).

Knuth-Morris-Pratt construction

2

Constructing the DFA for KMP substring search for A B A B A C

0 1 2 3 4 5 6A B A A

B,C

A

CB,CC

B

AB,C A

B C

0 1 2 3 4 5 A B A B A C 1 1 3 1 5 1 0 2 0 4 0 4 0 0 0 0 0 6

dfa[][j]

pat[j]j

ABC

X

X j

X

X

X

X

j

j

j

j

j

0 1 2 3 4 5A B A A

B,C

A

CB,CC

B,C A

B

0 1 2 3 4 A B A B A 1 1 3 1 5 0 2 0 4 0 0 0 0 0 0

dfa[][j]

pat[j]j

ABC

X

0 1 2 3 4A B A

A

CB,CC

B,C A

B

0 1 2 3 A B A B 1 1 3 1 0 2 0 4 0 0 0 0

dfa[][j]

pat[j]j

ABC

X

0 1 2 3A B A

B,CC

B,C A

0 1 2 A B A 1 1 3 0 2 0 0 0 0

dfa[][j]

pat[j]j

ABC

X

0 1 2A BC

B,C A 0 1 A B 1 1 0 2 0 0

dfa[][j]

pat[j]j

ABC

X

0 1A

B,C 0 A 1 0 0

dfa[][j]

pat[j]j

ABC

copy dfa[][X] to dfa[][j]

dfa[pat[j]][j] = j+1;

X = dfa[pat[j]][X]];

Constructing the DFA for KMP substring search for A B A B A C

0 1 2 3 4 5 6

0 1 2 3 4 5 A B A B A C

dfa[][j]ABC

pat.charAt(j)j

X

Page 3: Knuth-Morris-Pratt - Princeton University · 2010. 12. 2. · Knuth-Morris-Pratt construction Constructing the DFA for KMP substring search for A B A B A C 5 0 A1 B 2 3 4 5 6 C B,C

Match transition: advance to next state if c == pat.charAt(j).

Knuth-Morris-Pratt construction

3

Constructing the DFA for KMP substring search for A B A B A C

0 1 2 3 4 5 6A B A A

B,C

A

CB,CC

B

AB,C A

B C

0 1 2 3 4 5 A B A B A C 1 1 3 1 5 1 0 2 0 4 0 4 0 0 0 0 0 6

dfa[][j]

pat[j]j

ABC

X

X j

X

X

X

X

j

j

j

j

j

0 1 2 3 4 5A B A A

B,C

A

CB,CC

B,C A

B

0 1 2 3 4 A B A B A 1 1 3 1 5 0 2 0 4 0 0 0 0 0 0

dfa[][j]

pat[j]j

ABC

X

0 1 2 3 4A B A

A

CB,CC

B,C A

B

0 1 2 3 A B A B 1 1 3 1 0 2 0 4 0 0 0 0

dfa[][j]

pat[j]j

ABC

X

0 1 2 3A B A

B,CC

B,C A

0 1 2 A B A 1 1 3 0 2 0 0 0 0

dfa[][j]

pat[j]j

ABC

X

0 1 2A BC

B,C A 0 1 A B 1 1 0 2 0 0

dfa[][j]

pat[j]j

ABC

X

0 1A

B,C 0 A 1 0 0

dfa[][j]

pat[j]j

ABC

copy dfa[][X] to dfa[][j]

dfa[pat[j]][j] = j+1;

X = dfa[pat[j]][X]];

Constructing the DFA for KMP substring search for A B A B A C

0 1 2 3 4 5 6A B A AB C

0 1 2 3 4 5 A B A B A C 1 3 5 2 4 6

dfa[][j]ABC

pat.charAt(j)j

X

Page 4: Knuth-Morris-Pratt - Princeton University · 2010. 12. 2. · Knuth-Morris-Pratt construction Constructing the DFA for KMP substring search for A B A B A C 5 0 A1 B 2 3 4 5 6 C B,C

Mismatch transition: back up if c != pat.charAt(j).

Knuth-Morris-Pratt construction

4Constructing the DFA for KMP substring search for A B A B A C

0 1 2 3 4 5 6A B A A

B,C

B C

0 1 2 3 4 5 A B A B A C 1 3 5 0 2 4 0 6

dfa[][j]ABC

j

pat.charAt(j)j

X

Constructing the DFA for KMP substring search for A B A B A C

0 1 2 3 4 5 6A B A A

B,C

A

CB,CC

B

AB,C A

B C

0 1 2 3 4 5 A B A B A C 1 1 3 1 5 1 0 2 0 4 0 4 0 0 0 0 0 6

dfa[][j]

pat[j]j

ABC

X

X j

X

X

X

X

j

j

j

j

j

0 1 2 3 4 5A B A A

B,C

A

CB,CC

B,C A

B

0 1 2 3 4 A B A B A 1 1 3 1 5 0 2 0 4 0 0 0 0 0 0

dfa[][j]

pat[j]j

ABC

X

0 1 2 3 4A B A

A

CB,CC

B,C A

B

0 1 2 3 A B A B 1 1 3 1 0 2 0 4 0 0 0 0

dfa[][j]

pat[j]j

ABC

X

0 1 2 3A B A

B,CC

B,C A

0 1 2 A B A 1 1 3 0 2 0 0 0 0

dfa[][j]

pat[j]j

ABC

X

0 1 2A BC

B,C A 0 1 A B 1 1 0 2 0 0

dfa[][j]

pat[j]j

ABC

X

0 1A

B,C 0 A 1 0 0

dfa[][j]

pat[j]j

ABC

copy dfa[][X] to dfa[][j]

dfa[pat[j]][j] = j+1;

X = dfa[pat[j]][X]];

Page 5: Knuth-Morris-Pratt - Princeton University · 2010. 12. 2. · Knuth-Morris-Pratt construction Constructing the DFA for KMP substring search for A B A B A C 5 0 A1 B 2 3 4 5 6 C B,C

Mismatch transition: back up if c != pat.charAt(j).

Knuth-Morris-Pratt construction

5Constructing the DFA for KMP substring search for A B A B A C

0 1 2 3 4 5 6A B A AC

B,C A

B C

0 1 2 3 4 5 A B A B A C 1 1 3 5 0 2 4 0 0 6

dfa[][j]ABC

X

X

j

pat.charAt(j)j

Constructing the DFA for KMP substring search for A B A B A C

0 1 2 3 4 5 6A B A A

B,C

A

CB,CC

B

AB,C A

B C

0 1 2 3 4 5 A B A B A C 1 1 3 1 5 1 0 2 0 4 0 4 0 0 0 0 0 6

dfa[][j]

pat[j]j

ABC

X

X j

X

X

X

X

j

j

j

j

j

0 1 2 3 4 5A B A A

B,C

A

CB,CC

B,C A

B

0 1 2 3 4 A B A B A 1 1 3 1 5 0 2 0 4 0 0 0 0 0 0

dfa[][j]

pat[j]j

ABC

X

0 1 2 3 4A B A

A

CB,CC

B,C A

B

0 1 2 3 A B A B 1 1 3 1 0 2 0 4 0 0 0 0

dfa[][j]

pat[j]j

ABC

X

0 1 2 3A B A

B,CC

B,C A

0 1 2 A B A 1 1 3 0 2 0 0 0 0

dfa[][j]

pat[j]j

ABC

X

0 1 2A BC

B,C A 0 1 A B 1 1 0 2 0 0

dfa[][j]

pat[j]j

ABC

X

0 1A

B,C 0 A 1 0 0

dfa[][j]

pat[j]j

ABC

copy dfa[][X] to dfa[][j]

dfa[pat[j]][j] = j+1;

X = dfa[pat[j]][X]];

Page 6: Knuth-Morris-Pratt - Princeton University · 2010. 12. 2. · Knuth-Morris-Pratt construction Constructing the DFA for KMP substring search for A B A B A C 5 0 A1 B 2 3 4 5 6 C B,C

Mismatch transition: back up if c != pat.charAt(j).

Knuth-Morris-Pratt construction

6Constructing the DFA for KMP substring search for A B A B A C

0 1 2 3 4 5 6A B A A

B,CC

B,C A

B C

0 1 2 3 4 5 A B A B A C 1 1 3 5 0 2 0 4 0 0 0 6

dfa[][j]ABC

X

X

j

pat.charAt(j)j

Constructing the DFA for KMP substring search for A B A B A C

0 1 2 3 4 5 6A B A A

B,C

A

CB,CC

B

AB,C A

B C

0 1 2 3 4 5 A B A B A C 1 1 3 1 5 1 0 2 0 4 0 4 0 0 0 0 0 6

dfa[][j]

pat[j]j

ABC

X

X j

X

X

X

X

j

j

j

j

j

0 1 2 3 4 5A B A A

B,C

A

CB,CC

B,C A

B

0 1 2 3 4 A B A B A 1 1 3 1 5 0 2 0 4 0 0 0 0 0 0

dfa[][j]

pat[j]j

ABC

X

0 1 2 3 4A B A

A

CB,CC

B,C A

B

0 1 2 3 A B A B 1 1 3 1 0 2 0 4 0 0 0 0

dfa[][j]

pat[j]j

ABC

X

0 1 2 3A B A

B,CC

B,C A

0 1 2 A B A 1 1 3 0 2 0 0 0 0

dfa[][j]

pat[j]j

ABC

X

0 1 2A BC

B,C A 0 1 A B 1 1 0 2 0 0

dfa[][j]

pat[j]j

ABC

X

0 1A

B,C 0 A 1 0 0

dfa[][j]

pat[j]j

ABC

copy dfa[][X] to dfa[][j]

dfa[pat[j]][j] = j+1;

X = dfa[pat[j]][X]];

Page 7: Knuth-Morris-Pratt - Princeton University · 2010. 12. 2. · Knuth-Morris-Pratt construction Constructing the DFA for KMP substring search for A B A B A C 5 0 A1 B 2 3 4 5 6 C B,C

Mismatch transition: back up if c != pat.charAt(j).

Knuth-Morris-Pratt construction

7Constructing the DFA for KMP substring search for A B A B A C

0 1 2 3 4 5 6A B A A

A

CB,CC

B,C A

B C

0 1 2 3 4 5 A B A B A C 1 1 3 1 5 0 2 0 4 0 0 0 0 6

dfa[][j]ABC

X

X

j

pat.charAt(j)j

Constructing the DFA for KMP substring search for A B A B A C

0 1 2 3 4 5 6A B A A

B,C

A

CB,CC

B

AB,C A

B C

0 1 2 3 4 5 A B A B A C 1 1 3 1 5 1 0 2 0 4 0 4 0 0 0 0 0 6

dfa[][j]

pat[j]j

ABC

X

X j

X

X

X

X

j

j

j

j

j

0 1 2 3 4 5A B A A

B,C

A

CB,CC

B,C A

B

0 1 2 3 4 A B A B A 1 1 3 1 5 0 2 0 4 0 0 0 0 0 0

dfa[][j]

pat[j]j

ABC

X

0 1 2 3 4A B A

A

CB,CC

B,C A

B

0 1 2 3 A B A B 1 1 3 1 0 2 0 4 0 0 0 0

dfa[][j]

pat[j]j

ABC

X

0 1 2 3A B A

B,CC

B,C A

0 1 2 A B A 1 1 3 0 2 0 0 0 0

dfa[][j]

pat[j]j

ABC

X

0 1 2A BC

B,C A 0 1 A B 1 1 0 2 0 0

dfa[][j]

pat[j]j

ABC

X

0 1A

B,C 0 A 1 0 0

dfa[][j]

pat[j]j

ABC

copy dfa[][X] to dfa[][j]

dfa[pat[j]][j] = j+1;

X = dfa[pat[j]][X]];

Page 8: Knuth-Morris-Pratt - Princeton University · 2010. 12. 2. · Knuth-Morris-Pratt construction Constructing the DFA for KMP substring search for A B A B A C 5 0 A1 B 2 3 4 5 6 C B,C

Mismatch transition: back up if c != pat.charAt(j).

Knuth-Morris-Pratt construction

8Constructing the DFA for KMP substring search for A B A B A C

0 1 2 3 4 5 6A B A A

B,C

A

CB,CC

B,C A

B C

0 1 2 3 4 5 A B A B A C 1 1 3 1 5 0 2 0 4 0 0 0 0 0 0 6

dfa[][j]ABC

X

X j

pat.charAt(j)j

Page 9: Knuth-Morris-Pratt - Princeton University · 2010. 12. 2. · Knuth-Morris-Pratt construction Constructing the DFA for KMP substring search for A B A B A C 5 0 A1 B 2 3 4 5 6 C B,C

Mismatch transition: back up if c != pat.charAt(j).

Knuth-Morris-Pratt construction

9Constructing the DFA for KMP substring search for A B A B A C

0 1 2 3 4 5 6A B A A

B,C

A

CB,CC

B

AB,C A

C

0 1 2 3 4 5 A B A B A C 1 1 3 1 5 1 0 2 0 4 0 4 0 0 0 0 0 6

dfa[][j]ABC

X

pat.charAt(j)j

B

jX

Page 10: Knuth-Morris-Pratt - Princeton University · 2010. 12. 2. · Knuth-Morris-Pratt construction Constructing the DFA for KMP substring search for A B A B A C 5 0 A1 B 2 3 4 5 6 C B,C

Knuth-Morris-Pratt construction

10Constructing the DFA for KMP substring search for A B A B A C

0 1 2 3 4 5 6A B A A

B,C

A

CB,CC

B

AB,C A

C

0 1 2 3 4 5 A B A B A C 1 1 3 1 5 1 0 2 0 4 0 4 0 0 0 0 0 6

dfa[][j]ABC

X

pat.charAt(j)j

B

Page 11: Knuth-Morris-Pratt - Princeton University · 2010. 12. 2. · Knuth-Morris-Pratt construction Constructing the DFA for KMP substring search for A B A B A C 5 0 A1 B 2 3 4 5 6 C B,C

Algorithms, 4th Edition · Robert Sedgewick and Kevin Wayne · Copyright © 2002–2010 · December 1, 2010 10:58:30 PM

Knuth-Morris-Pratt

Page 12: Knuth-Morris-Pratt - Princeton University · 2010. 12. 2. · Knuth-Morris-Pratt construction Constructing the DFA for KMP substring search for A B A B A C 5 0 A1 B 2 3 4 5 6 C B,C

Include one state for each character in pattern (plus accept state).

Knuth-Morris-Pratt construction

12

Constructing the DFA for KMP substring search for A B A B A C

0 1 2 3 4 5 6A B A A

B,C

A

CB,CC

B

AB,C A

B C

0 1 2 3 4 5 A B A B A C 1 1 3 1 5 1 0 2 0 4 0 4 0 0 0 0 0 6

dfa[][j]

pat[j]j

ABC

X

X j

X

X

X

X

j

j

j

j

j

0 1 2 3 4 5A B A A

B,C

A

CB,CC

B,C A

B

0 1 2 3 4 A B A B A 1 1 3 1 5 0 2 0 4 0 0 0 0 0 0

dfa[][j]

pat[j]j

ABC

X

0 1 2 3 4A B A

A

CB,CC

B,C A

B

0 1 2 3 A B A B 1 1 3 1 0 2 0 4 0 0 0 0

dfa[][j]

pat[j]j

ABC

X

0 1 2 3A B A

B,CC

B,C A

0 1 2 A B A 1 1 3 0 2 0 0 0 0

dfa[][j]

pat[j]j

ABC

X

0 1 2A BC

B,C A 0 1 A B 1 1 0 2 0 0

dfa[][j]

pat[j]j

ABC

X

0 1A

B,C 0 A 1 0 0

dfa[][j]

pat[j]j

ABC

copy dfa[][X] to dfa[][j]

dfa[pat[j]][j] = j+1;

X = dfa[pat[j]][X]];

Constructing the DFA for KMP substring search for A B A B A C

0 1 2 3 4 5 6

0 1 2 3 4 5 A B A B A C

dfa[][j]ABC

pat.charAt(j)j

X

Page 13: Knuth-Morris-Pratt - Princeton University · 2010. 12. 2. · Knuth-Morris-Pratt construction Constructing the DFA for KMP substring search for A B A B A C 5 0 A1 B 2 3 4 5 6 C B,C

Match transition. For each state j, dfa[pat.charAt(j)][j] = j+1.

Knuth-Morris-Pratt construction

13

Constructing the DFA for KMP substring search for A B A B A C

0 1 2 3 4 5 6A B A A

B,C

A

CB,CC

B

AB,C A

B C

0 1 2 3 4 5 A B A B A C 1 1 3 1 5 1 0 2 0 4 0 4 0 0 0 0 0 6

dfa[][j]

pat[j]j

ABC

X

X j

X

X

X

X

j

j

j

j

j

0 1 2 3 4 5A B A A

B,C

A

CB,CC

B,C A

B

0 1 2 3 4 A B A B A 1 1 3 1 5 0 2 0 4 0 0 0 0 0 0

dfa[][j]

pat[j]j

ABC

X

0 1 2 3 4A B A

A

CB,CC

B,C A

B

0 1 2 3 A B A B 1 1 3 1 0 2 0 4 0 0 0 0

dfa[][j]

pat[j]j

ABC

X

0 1 2 3A B A

B,CC

B,C A

0 1 2 A B A 1 1 3 0 2 0 0 0 0

dfa[][j]

pat[j]j

ABC

X

0 1 2A BC

B,C A 0 1 A B 1 1 0 2 0 0

dfa[][j]

pat[j]j

ABC

X

0 1A

B,C 0 A 1 0 0

dfa[][j]

pat[j]j

ABC

copy dfa[][X] to dfa[][j]

dfa[pat[j]][j] = j+1;

X = dfa[pat[j]][X]];

Constructing the DFA for KMP substring search for A B A B A C

0 1 2 3 4 5 6A B A AB C

0 1 2 3 4 5 A B A B A C 1 3 5 2 4 6

dfa[][j]ABC

pat.charAt(j)j

X

first j characters of patternhave already been matched

now first j+1 characters ofpattern have been matched

Page 14: Knuth-Morris-Pratt - Princeton University · 2010. 12. 2. · Knuth-Morris-Pratt construction Constructing the DFA for KMP substring search for A B A B A C 5 0 A1 B 2 3 4 5 6 C B,C

Mismatch transition.

Knuth-Morris-Pratt construction

14Constructing the DFA for KMP substring search for A B A B A C

0 1 2 3 4 5 6A B A A

B,C

B C

0 1 2 3 4 5 A B A B A C 1 3 5 0 2 4 0 6

dfa[][j]ABC

j

pat.charAt(j)j

X

Constructing the DFA for KMP substring search for A B A B A C

0 1 2 3 4 5 6A B A A

B,C

A

CB,CC

B

AB,C A

B C

0 1 2 3 4 5 A B A B A C 1 1 3 1 5 1 0 2 0 4 0 4 0 0 0 0 0 6

dfa[][j]

pat[j]j

ABC

X

X j

X

X

X

X

j

j

j

j

j

0 1 2 3 4 5A B A A

B,C

A

CB,CC

B,C A

B

0 1 2 3 4 A B A B A 1 1 3 1 5 0 2 0 4 0 0 0 0 0 0

dfa[][j]

pat[j]j

ABC

X

0 1 2 3 4A B A

A

CB,CC

B,C A

B

0 1 2 3 A B A B 1 1 3 1 0 2 0 4 0 0 0 0

dfa[][j]

pat[j]j

ABC

X

0 1 2 3A B A

B,CC

B,C A

0 1 2 A B A 1 1 3 0 2 0 0 0 0

dfa[][j]

pat[j]j

ABC

X

0 1 2A BC

B,C A 0 1 A B 1 1 0 2 0 0

dfa[][j]

pat[j]j

ABC

X

0 1A

B,C 0 A 1 0 0

dfa[][j]

pat[j]j

ABC

copy dfa[][X] to dfa[][j]

dfa[pat[j]][j] = j+1;

X = dfa[pat[j]][X]];

Page 15: Knuth-Morris-Pratt - Princeton University · 2010. 12. 2. · Knuth-Morris-Pratt construction Constructing the DFA for KMP substring search for A B A B A C 5 0 A1 B 2 3 4 5 6 C B,C

Knuth-Morris-Pratt construction

15Constructing the DFA for KMP substring search for A B A B A C

0 1 2 3 4 5 6A B A AC

B,C A

B C

0 1 2 3 4 5 A B A B A C 1 1 3 5 0 2 4 0 0 6

dfa[][j]ABC

X

X

j

pat.charAt(j)j

Mismatch transition. For each state j and char c != pat.charAt(j),dfa[c][j] = dfa[c][X]; then update X = dfa[pat.charAt(j)][X].

Constructing the DFA for KMP substring search for A B A B A C

0 1 2 3 4 5 6A B A A

B,C

A

CB,CC

B

AB,C A

B C

0 1 2 3 4 5 A B A B A C 1 1 3 1 5 1 0 2 0 4 0 4 0 0 0 0 0 6

dfa[][j]

pat[j]j

ABC

X

X j

X

X

X

X

j

j

j

j

j

0 1 2 3 4 5A B A A

B,C

A

CB,CC

B,C A

B

0 1 2 3 4 A B A B A 1 1 3 1 5 0 2 0 4 0 0 0 0 0 0

dfa[][j]

pat[j]j

ABC

X

0 1 2 3 4A B A

A

CB,CC

B,C A

B

0 1 2 3 A B A B 1 1 3 1 0 2 0 4 0 0 0 0

dfa[][j]

pat[j]j

ABC

X

0 1 2 3A B A

B,CC

B,C A

0 1 2 A B A 1 1 3 0 2 0 0 0 0

dfa[][j]

pat[j]j

ABC

X

0 1 2A BC

B,C A 0 1 A B 1 1 0 2 0 0

dfa[][j]

pat[j]j

ABC

X

0 1A

B,C 0 A 1 0 0

dfa[][j]

pat[j]j

ABC

copy dfa[][X] to dfa[][j]

dfa[pat[j]][j] = j+1;

X = dfa[pat[j]][X]];

Page 16: Knuth-Morris-Pratt - Princeton University · 2010. 12. 2. · Knuth-Morris-Pratt construction Constructing the DFA for KMP substring search for A B A B A C 5 0 A1 B 2 3 4 5 6 C B,C

Knuth-Morris-Pratt construction

16Constructing the DFA for KMP substring search for A B A B A C

0 1 2 3 4 5 6A B A A

B,CC

B,C A

B C

0 1 2 3 4 5 A B A B A C 1 1 3 5 0 2 0 4 0 0 0 6

dfa[][j]ABC

X

X

j

pat.charAt(j)j

Mismatch transition. For each state j and char c != pat.charAt(j),dfa[c][j] = dfa[c][X]; then update X = dfa[pat.charAt(j)][X].

Constructing the DFA for KMP substring search for A B A B A C

0 1 2 3 4 5 6A B A A

B,C

A

CB,CC

B

AB,C A

B C

0 1 2 3 4 5 A B A B A C 1 1 3 1 5 1 0 2 0 4 0 4 0 0 0 0 0 6

dfa[][j]

pat[j]j

ABC

X

X j

X

X

X

X

j

j

j

j

j

0 1 2 3 4 5A B A A

B,C

A

CB,CC

B,C A

B

0 1 2 3 4 A B A B A 1 1 3 1 5 0 2 0 4 0 0 0 0 0 0

dfa[][j]

pat[j]j

ABC

X

0 1 2 3 4A B A

A

CB,CC

B,C A

B

0 1 2 3 A B A B 1 1 3 1 0 2 0 4 0 0 0 0

dfa[][j]

pat[j]j

ABC

X

0 1 2 3A B A

B,CC

B,C A

0 1 2 A B A 1 1 3 0 2 0 0 0 0

dfa[][j]

pat[j]j

ABC

X

0 1 2A BC

B,C A 0 1 A B 1 1 0 2 0 0

dfa[][j]

pat[j]j

ABC

X

0 1A

B,C 0 A 1 0 0

dfa[][j]

pat[j]j

ABC

copy dfa[][X] to dfa[][j]

dfa[pat[j]][j] = j+1;

X = dfa[pat[j]][X]];

Page 17: Knuth-Morris-Pratt - Princeton University · 2010. 12. 2. · Knuth-Morris-Pratt construction Constructing the DFA for KMP substring search for A B A B A C 5 0 A1 B 2 3 4 5 6 C B,C

Knuth-Morris-Pratt construction

17Constructing the DFA for KMP substring search for A B A B A C

0 1 2 3 4 5 6A B A A

A

CB,CC

B,C A

B C

0 1 2 3 4 5 A B A B A C 1 1 3 1 5 0 2 0 4 0 0 0 0 6

dfa[][j]ABC

X

X

j

pat.charAt(j)j

Mismatch transition. For each state j and char c != pat.charAt(j),dfa[c][j] = dfa[c][X]; then update X = dfa[pat.charAt(j)][X].

Constructing the DFA for KMP substring search for A B A B A C

0 1 2 3 4 5 6A B A A

B,C

A

CB,CC

B

AB,C A

B C

0 1 2 3 4 5 A B A B A C 1 1 3 1 5 1 0 2 0 4 0 4 0 0 0 0 0 6

dfa[][j]

pat[j]j

ABC

X

X j

X

X

X

X

j

j

j

j

j

0 1 2 3 4 5A B A A

B,C

A

CB,CC

B,C A

B

0 1 2 3 4 A B A B A 1 1 3 1 5 0 2 0 4 0 0 0 0 0 0

dfa[][j]

pat[j]j

ABC

X

0 1 2 3 4A B A

A

CB,CC

B,C A

B

0 1 2 3 A B A B 1 1 3 1 0 2 0 4 0 0 0 0

dfa[][j]

pat[j]j

ABC

X

0 1 2 3A B A

B,CC

B,C A

0 1 2 A B A 1 1 3 0 2 0 0 0 0

dfa[][j]

pat[j]j

ABC

X

0 1 2A BC

B,C A 0 1 A B 1 1 0 2 0 0

dfa[][j]

pat[j]j

ABC

X

0 1A

B,C 0 A 1 0 0

dfa[][j]

pat[j]j

ABC

copy dfa[][X] to dfa[][j]

dfa[pat[j]][j] = j+1;

X = dfa[pat[j]][X]];

Page 18: Knuth-Morris-Pratt - Princeton University · 2010. 12. 2. · Knuth-Morris-Pratt construction Constructing the DFA for KMP substring search for A B A B A C 5 0 A1 B 2 3 4 5 6 C B,C

Knuth-Morris-Pratt construction

18Constructing the DFA for KMP substring search for A B A B A C

0 1 2 3 4 5 6A B A A

B,C

A

CB,CC

B,C A

B C

0 1 2 3 4 5 A B A B A C 1 1 3 1 5 0 2 0 4 0 0 0 0 0 0 6

dfa[][j]ABC

X

X j

pat.charAt(j)j

Mismatch transition. For each state j and char c != pat.charAt(j),dfa[c][j] = dfa[c][X]; then update X = dfa[pat.charAt(j)][X].

Page 19: Knuth-Morris-Pratt - Princeton University · 2010. 12. 2. · Knuth-Morris-Pratt construction Constructing the DFA for KMP substring search for A B A B A C 5 0 A1 B 2 3 4 5 6 C B,C

Mismatch transition. For each state j and char c != pat.charAt(j),dfa[c][j] = dfa[c][X]; then update X = dfa[pat.charAt(j)][X].

Knuth-Morris-Pratt construction

19Constructing the DFA for KMP substring search for A B A B A C

0 1 2 3 4 5 6A B A A

B,C

A

CB,CC

B

AB,C A

C

0 1 2 3 4 5 A B A B A C 1 1 3 1 5 1 0 2 0 4 0 4 0 0 0 0 0 6

dfa[][j]ABC

X

pat.charAt(j)j

B

jX

Page 20: Knuth-Morris-Pratt - Princeton University · 2010. 12. 2. · Knuth-Morris-Pratt construction Constructing the DFA for KMP substring search for A B A B A C 5 0 A1 B 2 3 4 5 6 C B,C

Knuth-Morris-Pratt construction

20Constructing the DFA for KMP substring search for A B A B A C

0 1 2 3 4 5 6A B A A

B,C

A

CB,CC

B

AB,C A

C

0 1 2 3 4 5 A B A B A C 1 1 3 1 5 1 0 2 0 4 0 4 0 0 0 0 0 6

dfa[][j]ABC

X

pat.charAt(j)j

B