KnuthMorrisPratt Pattern Matching Algorithm Instructor Prof JyhShing Roger

  • Slides: 17
Download presentation
Knuth-Morris-Pratt Pattern Matching Algorithm Instructor : Prof. Jyh-Shing Roger Jang Designer:Shao-Huan Wang The ideas

Knuth-Morris-Pratt Pattern Matching Algorithm Instructor : Prof. Jyh-Shing Roger Jang Designer:Shao-Huan Wang The ideas are reference to the textbook “Fundamentals of Data Structures in C “ and “名題精選百則-使用C語言(技巧篇)”.

Knuth-Morris-Pratt Pattern Matching Algorithm n Use failure function j 0 1 2 3 4

Knuth-Morris-Pratt Pattern Matching Algorithm n Use failure function j 0 1 2 3 4 5 6 7 8 9 10 p[] a b b a b a a f(j)

Knuth-Morris-Pratt Pattern Matching Algorithm n Use failure function j 0 1 2 3 4

Knuth-Morris-Pratt Pattern Matching Algorithm n Use failure function j 0 1 2 3 4 5 6 7 8 9 10 p[] a b b a b a a f(j) -1 First, initial f(0) = -1

Knuth-Morris-Pratt Pattern Matching Algorithm n Use failure function j 0 1 2 3 4

Knuth-Morris-Pratt Pattern Matching Algorithm n Use failure function j 0 1 2 3 4 5 6 7 8 9 10 p[] a b b a b a a f(j) -1 -1 First, initial f(0) = -1 j++, i = f(j-1), then compare p[i+1] and p[j] If p[i+1] != p[j] and f(i-1) == -1, put -1

Knuth-Morris-Pratt Pattern Matching Algorithm n Use failure function j 0 1 2 3 4

Knuth-Morris-Pratt Pattern Matching Algorithm n Use failure function j 0 1 2 3 4 5 6 7 8 9 10 p[] a b b a b a a f(j) -1 -1 0 1 First, initial f(0) = -1 j++, i = f(j-1), then compare p[i+1] and p[j] If p[i+1] != p[j] and f(i-1) == -1, put -1 Else if p[i+1] == p[j], put i+1 Else if p[i+1] != p[j] and i != -1, let i = f(i), until p[i+1] == p[j] or i == -1

Knuth-Morris-Pratt Pattern Matching Algorithm n Use failure function j 0 1 2 3 4

Knuth-Morris-Pratt Pattern Matching Algorithm n Use failure function j 0 1 2 3 4 5 6 7 8 9 10 p[] a b b a b a a f(j) -1 -1 0 1 -1 Not equal! First, initial f(0) = -1 j++, i = f(j-1), then compare p[i+1] and p[j] If p[i+1] != p[j] and f(i-1) == -1, put -1 Else if p[i+1] == p[j], put i+1 Else if p[i+1] != p[j] and i != -1, let i = f(i), until p[i+1] == p[j] or i == -1 If i == -1 compare p[0] and p[j]

Knuth-Morris-Pratt Pattern Matching Algorithm n Use failure function j 0 1 2 3 4

Knuth-Morris-Pratt Pattern Matching Algorithm n Use failure function j 0 1 2 3 4 5 6 7 8 9 10 p[] a b b a b a a f(j) -1 -1 0 1 2 3 First, initial f(0) = -1 j++, i = f(j-1), then compare p[i+1] and p[j] If p[i+1] != p[j] and f(i-1) == -1, put -1 Else if p[i+1] == p[j], put i+1 Else if p[i+1] != p[j] and i != -1, let i = f(i), until p[i+1] == p[j] or i == -1 If i == -1 compare p[0] and p[j]

Knuth-Morris-Pratt Pattern Matching Algorithm n Use failure function j 0 1 2 3 4

Knuth-Morris-Pratt Pattern Matching Algorithm n Use failure function j 0 1 2 3 4 5 6 7 8 9 10 p[] a b b a b a a f(j) -1 -1 0 1 2 3 Not equal! Equal! 2 First, initial f(0) = -1 j++, i = f(j-1), then compare p[i+1] and p[j] If p[i+1] != p[j] and f(i-1) == -1, put -1 Else if p[i+1] == p[j], put i+1 Else if p[i+1] != p[j] and i != -1, let i = f(i), until p[i+1] == p[j] or i == -1 If i == -1 compare p[0] and p[j] If p[i+1] == p[j], put i+1

Knuth-Morris-Pratt Pattern Matching Algorithm n Use failure function j 0 1 2 3 4

Knuth-Morris-Pratt Pattern Matching Algorithm n Use failure function j 0 1 2 3 4 5 6 7 8 9 10 p[] a b b a b a a f(j) -1 -1 0 1 2 3 Not equal! 2 0 First, initial f(0) = -1 j++, i = f(j-1), then compare p[i+1] and p[j] If p[i+1] != p[j] and f(i-1) == -1, put -1 Else if p[i+1] == p[j], put i+1 Else if p[i+1] != p[j] and i != -1, let i = f(i), until p[i+1] == p[j] or i == -1 If i == -1 compare p[0] and p[j] If p[i+1] == p[j], put i+1 If i == -1 and p[0] == p[j], put i+1

Knuth-Morris-Pratt Pattern Matching Algorithm n Use failure function j 0 1 2 3 4

Knuth-Morris-Pratt Pattern Matching Algorithm n Use failure function j 0 1 2 3 4 5 6 7 8 9 10 p[] a b b a b a a f(j) -1 -1 0 1 2 3 2 0 First, initial f(0) = -1 j++, i = f(j-1), then compare p[i+1] and p[j] If p[i+1] != p[j] and f(i-1) == -1, put -1 Else if p[i+1] == p[j], put i+1 Else if p[i+1] != p[j] and i != -1, let i = f(i), until p[i+1] == p[j] or i == -1 If i == -1 compare p[0] and p[j] If p[i+1] == p[j], put i+1 If i == -1 and p[0] == p[j], put i+1

Knuth-Morris-Pratt Pattern Matching Algorithm n n Use failure function Compare with a string s[]

Knuth-Morris-Pratt Pattern Matching Algorithm n n Use failure function Compare with a string s[] : a b a b a b b a b a a f(j ) -1 -1 0 1 2 3 2 0 j 0 1 2 3 4 5 6 7 8 9 10 p[ ] b Compare with s[i] and p[j], start with i = j = 0 If s[i] != p[j] and j != 0, j = f(j-1)+1 a b a a

Knuth-Morris-Pratt Pattern Matching Algorithm n n Use failure function Compare with a string s[]

Knuth-Morris-Pratt Pattern Matching Algorithm n n Use failure function Compare with a string s[] : a b a b a b b a b a a f(j ) -1 -1 0 1 2 3 2 0 j 0 1 2 3 4 5 6 7 8 9 10 p[ ] b Compare with s[i] and p[j], start with i = j = 0 If s[i] != p[j] and j != 0, j = f(j-1)+1 Else if s[i] != p[j] and j == 0, i++ a b a a

Knuth-Morris-Pratt Pattern Matching Algorithm n n Use failure function Compare with a string s[]

Knuth-Morris-Pratt Pattern Matching Algorithm n n Use failure function Compare with a string s[] : a b a b a b a p[ ] a b b a b a a f(j ) -1 -1 0 1 2 3 2 0 j 0 1 2 3 4 5 6 7 8 9 10 Compare with s[i] and p[j], start with i = j = 0 If s[i] != p[j] and j != 0, j = f(j-1)+1 Else if s[i] != p[j] and j == 0, i++ b a a

Knuth-Morris-Pratt Pattern Matching Algorithm n n Use failure function Compare with a string s[]

Knuth-Morris-Pratt Pattern Matching Algorithm n n Use failure function Compare with a string s[] : a b a b a b a p[ ] a b b a b a a f(j ) -1 -1 0 1 2 3 2 0 j 0 1 2 3 4 5 6 7 8 9 10 Compare with s[i] and p[j], start with i = j = 0 If s[i] != p[j] and j != 0, j = f(j-1)+1 Else if s[i] != p[j] and j == 0, i++ b a a

Knuth-Morris-Pratt Pattern Matching Algorithm n n Use failure function Compare with a string s[]

Knuth-Morris-Pratt Pattern Matching Algorithm n n Use failure function Compare with a string s[] : a b a b p[ ] a b b a b a a f(j ) -1 -1 0 1 2 3 2 0 j 0 1 2 3 4 5 6 7 8 9 10 Compare with s[i] and p[j], start with i = j = 0 If s[i] != p[j] and j != 0, j = f(j-1)+1 Else if s[i] != p[j] and j == 0, i++ a a

Knuth-Morris-Pratt Pattern Matching Algorithm n n Use failure function Compare with a string s[]

Knuth-Morris-Pratt Pattern Matching Algorithm n n Use failure function Compare with a string s[] : a b a b p[ ] a b b a b a a f(j ) -1 -1 0 1 2 3 2 0 j 0 1 2 3 4 5 6 7 8 9 10 Compare with s[i] and p[j], start with i = j = 0 If s[i] != p[j] and j != 0, j = f(j-1)+1 Else if s[i] != p[j] and j == 0, i++ a a

Knuth-Morris-Pratt Pattern Matching Algorithm n n Use failure function Compare with a string s[]

Knuth-Morris-Pratt Pattern Matching Algorithm n n Use failure function Compare with a string s[] : a b a b a a p[ ] a b b a b a a f(j ) -1 -1 0 1 2 3 2 0 j 0 1 2 3 4 5 6 7 8 9 10 Compare with s[i] and p[j], start with i = j = 0 If s[i] != p[j] and j != 0, j = f(j-1)+1 Else if s[i] != p[j] and j == 0, i++ Following the rules and you can finish this comparison