Top Banner
The string matching problem The Rabin-Karp algorithm The Boyer-Moore Algorithm The Knuth-Morris-Pratt algorithm COMP36111: Advanced Algorithms I Lecture 3: String Matching Ian Pratt-Hartmann Room KB2.38: email: [email protected] 2016–17
34

COMP36111: Advanced Algorithms I - Lecture 3: String Matchingsyllabus.cs.manchester.ac.uk/ugt/2016/COMP36111/lecture3.pdf · The string matching problem The Rabin-Karp algorithm The

Apr 13, 2019

Download

Documents

lelien
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: COMP36111: Advanced Algorithms I - Lecture 3: String Matchingsyllabus.cs.manchester.ac.uk/ugt/2016/COMP36111/lecture3.pdf · The string matching problem The Rabin-Karp algorithm The

The string matching problem The Rabin-Karp algorithm The Boyer-Moore Algorithm The Knuth-Morris-Pratt algorithm

COMP36111: Advanced Algorithms I

Lecture 3: String Matching

Ian Pratt-Hartmann

Room KB2.38: email: [email protected]

2016–17

Page 2: COMP36111: Advanced Algorithms I - Lecture 3: String Matchingsyllabus.cs.manchester.ac.uk/ugt/2016/COMP36111/lecture3.pdf · The string matching problem The Rabin-Karp algorithm The

The string matching problem The Rabin-Karp algorithm The Boyer-Moore Algorithm The Knuth-Morris-Pratt algorithm

Outline

The string matching problem

The Rabin-Karp algorithm

The Boyer-Moore Algorithm

The Knuth-Morris-Pratt algorithm

Page 3: COMP36111: Advanced Algorithms I - Lecture 3: String Matchingsyllabus.cs.manchester.ac.uk/ugt/2016/COMP36111/lecture3.pdf · The string matching problem The Rabin-Karp algorithm The

The string matching problem The Rabin-Karp algorithm The Boyer-Moore Algorithm The Knuth-Morris-Pratt algorithm

• Suppose we are given some English text

A blazing sun upon a fierce August day was nogreater rarity in southern France then, than at anyother time, before or since. Everything in Marseilles,and about Marseilles, had stared at the fervid sky,and been stared at in return, until a staring habithad become universal there.

and a search string, say “Marseilles”.

• We would like to find all instances (or just the first instance )of the search string in the text.

• What’s the best way?

Page 4: COMP36111: Advanced Algorithms I - Lecture 3: String Matchingsyllabus.cs.manchester.ac.uk/ugt/2016/COMP36111/lecture3.pdf · The string matching problem The Rabin-Karp algorithm The

The string matching problem The Rabin-Karp algorithm The Boyer-Moore Algorithm The Knuth-Morris-Pratt algorithm

• Suppose we are given some English text

A blazing sun upon a fierce August day was nogreater rarity in southern France then, than at anyother time, before or since. Everything in Marseilles,and about Marseilles, had stared at the fervid sky,and been stared at in return, until a staring habithad become universal there.

and a search string, say “Marseilles”.

• We would like to find all instances (or just the first instance )of the search string in the text.

• What’s the best way?

Page 5: COMP36111: Advanced Algorithms I - Lecture 3: String Matchingsyllabus.cs.manchester.ac.uk/ugt/2016/COMP36111/lecture3.pdf · The string matching problem The Rabin-Karp algorithm The

The string matching problem The Rabin-Karp algorithm The Boyer-Moore Algorithm The Knuth-Morris-Pratt algorithm

• As usual, we start by modelling the data:• let Σ be a finite non-empty set (the alphabet);• let T = T [0], . . . ,T [n − 1] be a string length n over a fixed

alphabet Σ;• let P = P[0], . . . ,P[m − 1] be a string length m over Σ;

• We formalize the notion of an occurrence of one string inanother:

• string P occurs with shift i in string T if P[j ] = T [i + j ] for allj (0 ≤ i < |P|).

• The we have the following problem

MATCHINGGiven: strings T and P over some fixed alphabet Σ.Return: the set of integers i such that P occurs in T

with shift i .

Page 6: COMP36111: Advanced Algorithms I - Lecture 3: String Matchingsyllabus.cs.manchester.ac.uk/ugt/2016/COMP36111/lecture3.pdf · The string matching problem The Rabin-Karp algorithm The

The string matching problem The Rabin-Karp algorithm The Boyer-Moore Algorithm The Knuth-Morris-Pratt algorithm

• Here is a really stupid algorithm

begin naiveMatch(T,P)I ← ∅for i = 0 to |T | − |P|

j ← 0until j = |P| or T [i + j ] 6= P[j ]

j++if j = |P|

I = I ← {i}return I

end

• Graphically

0 i

a b d

0 j

a b c d

• Running time is O(|T | · |P|).

Page 7: COMP36111: Advanced Algorithms I - Lecture 3: String Matchingsyllabus.cs.manchester.ac.uk/ugt/2016/COMP36111/lecture3.pdf · The string matching problem The Rabin-Karp algorithm The

The string matching problem The Rabin-Karp algorithm The Boyer-Moore Algorithm The Knuth-Morris-Pratt algorithm

• Here is a really stupid algorithm

begin naiveMatch(T,P)I ← ∅for i = 0 to |T | − |P|

j ← 0until j = |P| or T [i + j ] 6= P[j ]

j++if j = |P|

I = I ← {i}return I

end

• Graphically

0 i

a b d

0 j

a b c d

• Running time is O(|T | · |P|).

Page 8: COMP36111: Advanced Algorithms I - Lecture 3: String Matchingsyllabus.cs.manchester.ac.uk/ugt/2016/COMP36111/lecture3.pdf · The string matching problem The Rabin-Karp algorithm The

The string matching problem The Rabin-Karp algorithm The Boyer-Moore Algorithm The Knuth-Morris-Pratt algorithm

• Here is a really stupid algorithm

begin naiveMatch(T,P)I ← ∅for i = 0 to |T | − |P|

j ← 0until j = |P| or T [i + j ] 6= P[j ]

j++if j = |P|

I = I ← {i}return I

end

• Graphically

0 i

a b d

0 j

a b c d

• Running time is O(|T | · |P|).

Page 9: COMP36111: Advanced Algorithms I - Lecture 3: String Matchingsyllabus.cs.manchester.ac.uk/ugt/2016/COMP36111/lecture3.pdf · The string matching problem The Rabin-Karp algorithm The

The string matching problem The Rabin-Karp algorithm The Boyer-Moore Algorithm The Knuth-Morris-Pratt algorithm

Outline

The string matching problem

The Rabin-Karp algorithm

The Boyer-Moore Algorithm

The Knuth-Morris-Pratt algorithm

Page 10: COMP36111: Advanced Algorithms I - Lecture 3: String Matchingsyllabus.cs.manchester.ac.uk/ugt/2016/COMP36111/lecture3.pdf · The string matching problem The Rabin-Karp algorithm The

The string matching problem The Rabin-Karp algorithm The Boyer-Moore Algorithm The Knuth-Morris-Pratt algorithm

• Let n = |T | and m = |P|.• Think of the elements of Σ as digits in a base-b numeral,

where b = |Σ|.• Then P is the number P[0] · bm−1 + · · ·+ P[m − 1] · b0.

• Similarly, T [i , · · · , i + m − 1] isT [i ] · bm−1 + · · ·+ T [i + m − 1] · b0.

• To calculate T [i + 1, · · · , i + m] from T [i , · · · , i + m − 1],write:

T [i+1, · · · , i+m] = (T [i , · · · , i+m−1]−T [i ]·bm−1)·b+T [i+m].

Page 11: COMP36111: Advanced Algorithms I - Lecture 3: String Matchingsyllabus.cs.manchester.ac.uk/ugt/2016/COMP36111/lecture3.pdf · The string matching problem The Rabin-Karp algorithm The

The string matching problem The Rabin-Karp algorithm The Boyer-Moore Algorithm The Knuth-Morris-Pratt algorithm

• These numbers can get a bit large.

• However, we can work modulo q, for some constant q (usuallya prime) such that bq is about the size of a computer word.

• Of course, we have

T [i + 1, · · · , i + m] =

(T [i , · · · , i + m − 1]− T [i ] · bm−1) · b + T [i + m] (mod q).

• If T [i , · · · , i + m − 1] 6= P mod q, then we know we do nothave a match at shift i .

• If T [i , · · · , i + m − 1] = P mod q, then we simply checkexplicitly that T [i , · · · , i + m − 1] = P.

Page 12: COMP36111: Advanced Algorithms I - Lecture 3: String Matchingsyllabus.cs.manchester.ac.uk/ugt/2016/COMP36111/lecture3.pdf · The string matching problem The Rabin-Karp algorithm The

The string matching problem The Rabin-Karp algorithm The Boyer-Moore Algorithm The Knuth-Morris-Pratt algorithm

• The worst-case running time of this algorithm is alsoO(|T | · |P|).

• On average, however, it works must better:• A rough estimate of the probability of a spurious match is 1/q,

since this is the probability that a random number will take agiven value modulo q. (Well, that’s actually nonsense, butnever mind.)

• A reasonable estimate of the number of matches is O(1), sincepatterns are basically rare.

• This leads to an expected performance of aboutO(n + m + m(n/q))

• Thus, expected running time will be about O(n + m), sincepresumably q > m.

Page 13: COMP36111: Advanced Algorithms I - Lecture 3: String Matchingsyllabus.cs.manchester.ac.uk/ugt/2016/COMP36111/lecture3.pdf · The string matching problem The Rabin-Karp algorithm The

The string matching problem The Rabin-Karp algorithm The Boyer-Moore Algorithm The Knuth-Morris-Pratt algorithm

• Here is the algorithmbegin Rabin-Karp(T,S,q,b)

I ← ∅m← |P|t ← T [0] · bm−1 + · · ·+ T [m − 1] · b0 mod qp ← P[0] · bm−1 + · · ·+ P[m − 1] · b0 mod qi → 0while i ≤ |T | −m

if p = tj ← 0while P[j ] = T [i + j ] and j < |P|

j++if j = |P|

I ← I ∪ {i}t ← (t − T [i ] · bm−1) · b + T [i + m] mod qi++

return Iend

Page 14: COMP36111: Advanced Algorithms I - Lecture 3: String Matchingsyllabus.cs.manchester.ac.uk/ugt/2016/COMP36111/lecture3.pdf · The string matching problem The Rabin-Karp algorithm The

The string matching problem The Rabin-Karp algorithm The Boyer-Moore Algorithm The Knuth-Morris-Pratt algorithm

Outline

The string matching problem

The Rabin-Karp algorithm

The Boyer-Moore Algorithm

The Knuth-Morris-Pratt algorithm

Page 15: COMP36111: Advanced Algorithms I - Lecture 3: String Matchingsyllabus.cs.manchester.ac.uk/ugt/2016/COMP36111/lecture3.pdf · The string matching problem The Rabin-Karp algorithm The

The string matching problem The Rabin-Karp algorithm The Boyer-Moore Algorithm The Knuth-Morris-Pratt algorithm

• The Boyer-Moore algorithm is a refinement of the naıve stringmatching algorithm.

• It checks the pattern against the text starting from the end(rather than the beginning).

0 i

d

0 j

a b c d

• It also incorporates and two refinements:• the bad character heuristic;• the good suffix heuristic.

Page 16: COMP36111: Advanced Algorithms I - Lecture 3: String Matchingsyllabus.cs.manchester.ac.uk/ugt/2016/COMP36111/lecture3.pdf · The string matching problem The Rabin-Karp algorithm The

The string matching problem The Rabin-Karp algorithm The Boyer-Moore Algorithm The Knuth-Morris-Pratt algorithm

• The bad character heuristic: suppose T [i + j ] 6= P[j ].• Let k be largest such that T [i + j ] = P[k] (-1 if no such k).• Then we can safely increase i by j − k .• Denote this value of k by λ(T [i + j ]). Notice λ depends only

on P and the character T [i + j ].

• Graphically:

0 i

a d

0 1 2 3

a b c d

In this example, j = 2 and k = 0; so we can increase i by 2.

Page 17: COMP36111: Advanced Algorithms I - Lecture 3: String Matchingsyllabus.cs.manchester.ac.uk/ugt/2016/COMP36111/lecture3.pdf · The string matching problem The Rabin-Karp algorithm The

The string matching problem The Rabin-Karp algorithm The Boyer-Moore Algorithm The Knuth-Morris-Pratt algorithm

• The good character heuristic is more complicated.

• Suppose we have a mismatch at some pattern position j .

i

0 j m − 1

• Call P[j + 1, . . . ,m − 1] the good suffix.

• Let us say that two strings are end-equivalent if one is a suffixof the other.

• Note: it takes a bit of thinking to show that this really is anequivalence relation!

• Let k be the largest value (0 ≤ k < m) such that the prefix ofP[0, . . . , k − 1] is end-equivalent to the good suffix.

• The good suffix heuristic says: increase i by m − k .

Page 18: COMP36111: Advanced Algorithms I - Lecture 3: String Matchingsyllabus.cs.manchester.ac.uk/ugt/2016/COMP36111/lecture3.pdf · The string matching problem The Rabin-Karp algorithm The

The string matching problem The Rabin-Karp algorithm The Boyer-Moore Algorithm The Knuth-Morris-Pratt algorithm

• Suppose first that k ≥ m − j − 1. This means that the goodsuffix is a suffix of P[0, . . . , k − 1].

i

0 j m − 1

• There cannot be any match corresponding to a move of lessthan m− k , because then, the good suffix would be a suffix ofa still longer prefix, contradicting the maximality of k .

Page 19: COMP36111: Advanced Algorithms I - Lecture 3: String Matchingsyllabus.cs.manchester.ac.uk/ugt/2016/COMP36111/lecture3.pdf · The string matching problem The Rabin-Karp algorithm The

The string matching problem The Rabin-Karp algorithm The Boyer-Moore Algorithm The Knuth-Morris-Pratt algorithm

• Suppose first that k ≥ m − j − 1. This means that the goodsuffix is a suffix of P[0, . . . , k − 1].

i

0 m − 1j

• There cannot be any match corresponding to a move of lessthan m− k , because then, the good suffix would be a suffix ofa still longer prefix, contradicting the maximality of k .

Page 20: COMP36111: Advanced Algorithms I - Lecture 3: String Matchingsyllabus.cs.manchester.ac.uk/ugt/2016/COMP36111/lecture3.pdf · The string matching problem The Rabin-Karp algorithm The

The string matching problem The Rabin-Karp algorithm The Boyer-Moore Algorithm The Knuth-Morris-Pratt algorithm

• Suppose first that k ≥ m − j − 1. This means that the goodsuffix is a suffix of P[0, . . . , k − 1].

i

0 m − 1j

• There cannot be any match corresponding to a move of lessthan m− k , because then, the good suffix would be a suffix ofa still longer prefix, contradicting the maximality of k .

Page 21: COMP36111: Advanced Algorithms I - Lecture 3: String Matchingsyllabus.cs.manchester.ac.uk/ugt/2016/COMP36111/lecture3.pdf · The string matching problem The Rabin-Karp algorithm The

The string matching problem The Rabin-Karp algorithm The Boyer-Moore Algorithm The Knuth-Morris-Pratt algorithm

• Suppose on the other hand that k < m − j − 1. This meansthat P[0, . . . , k − 1] is a proper suffix of the good suffix.

i

0 j m − 1

• There certainly cannot be any match corresponding to a moveof j or less (for then the good suffix would be a proper suffixof some prefix, and k ≥ m − j − 1).

• But there also cannot be any match corresponding to a moveof more than j but less than m − k , because then, a longerprefix than P[0, . . . , k − 1] would be a proper suffix of thegood suffix, again contradicting the maximality of k .

Page 22: COMP36111: Advanced Algorithms I - Lecture 3: String Matchingsyllabus.cs.manchester.ac.uk/ugt/2016/COMP36111/lecture3.pdf · The string matching problem The Rabin-Karp algorithm The

The string matching problem The Rabin-Karp algorithm The Boyer-Moore Algorithm The Knuth-Morris-Pratt algorithm

• Suppose on the other hand that k < m − j − 1. This meansthat P[0, . . . , k − 1] is a proper suffix of the good suffix.

i

0 m − 1j

• There certainly cannot be any match corresponding to a moveof j or less (for then the good suffix would be a proper suffixof some prefix, and k ≥ m − j − 1).

• But there also cannot be any match corresponding to a moveof more than j but less than m − k , because then, a longerprefix than P[0, . . . , k − 1] would be a proper suffix of thegood suffix, again contradicting the maximality of k .

Page 23: COMP36111: Advanced Algorithms I - Lecture 3: String Matchingsyllabus.cs.manchester.ac.uk/ugt/2016/COMP36111/lecture3.pdf · The string matching problem The Rabin-Karp algorithm The

The string matching problem The Rabin-Karp algorithm The Boyer-Moore Algorithm The Knuth-Morris-Pratt algorithm

• Suppose on the other hand that k < m − j − 1. This meansthat P[0, . . . , k − 1] is a proper suffix of the good suffix.

i

0 m − 1j

• There certainly cannot be any match corresponding to a moveof j or less (for then the good suffix would be a proper suffixof some prefix, and k ≥ m − j − 1).

• But there also cannot be any match corresponding to a moveof more than j but less than m − k , because then, a longerprefix than P[0, . . . , k − 1] would be a proper suffix of thegood suffix, again contradicting the maximality of k .

Page 24: COMP36111: Advanced Algorithms I - Lecture 3: String Matchingsyllabus.cs.manchester.ac.uk/ugt/2016/COMP36111/lecture3.pdf · The string matching problem The Rabin-Karp algorithm The

The string matching problem The Rabin-Karp algorithm The Boyer-Moore Algorithm The Knuth-Morris-Pratt algorithm

• Thus, we want to compute the largest k (0 ≤ k < m) suchthat either the prefix P[0, . . . , k − 1], is a (proper) suffix ofthe good suffix or the good suffix is a suffix of the prefixP[0, . . . , k − 1].

• Denote the value m − k by γ[j ]. Notice γ is always positive,and depends only and depends only on P and j .

Page 25: COMP36111: Advanced Algorithms I - Lecture 3: String Matchingsyllabus.cs.manchester.ac.uk/ugt/2016/COMP36111/lecture3.pdf · The string matching problem The Rabin-Karp algorithm The

The string matching problem The Rabin-Karp algorithm The Boyer-Moore Algorithm The Knuth-Morris-Pratt algorithm

• The functions λ and γ can be pre-computed once P is known(independently ofT ).

• Thus, the Boyer-Moore algorithm isbegin naiveMatch(T,S)

compute the functions λ and γI ← ∅i ← 0while i ≤ |T | − |P|

j ← |P| − 1while T [i + j ] = P[j ] and j > 0

j--if j = 0

I ← I ∪ {i}i ← i + γ[−1]

else

i ← i + max(γ[j ], j − λ(T [i + j ]))return I

end

Page 26: COMP36111: Advanced Algorithms I - Lecture 3: String Matchingsyllabus.cs.manchester.ac.uk/ugt/2016/COMP36111/lecture3.pdf · The string matching problem The Rabin-Karp algorithm The

The string matching problem The Rabin-Karp algorithm The Boyer-Moore Algorithm The Knuth-Morris-Pratt algorithm

Outline

The string matching problem

The Rabin-Karp algorithm

The Boyer-Moore Algorithm

The Knuth-Morris-Pratt algorithm

Page 27: COMP36111: Advanced Algorithms I - Lecture 3: String Matchingsyllabus.cs.manchester.ac.uk/ugt/2016/COMP36111/lecture3.pdf · The string matching problem The Rabin-Karp algorithm The

The string matching problem The Rabin-Karp algorithm The Boyer-Moore Algorithm The Knuth-Morris-Pratt algorithm

• The basic idea of this algorithm is as follows. Suppose wehave a mismatch at some pattern position j .

j

• Call P[0, . . . , j − 1] the good prefix.

• Now let is look at the longest prefix of the good prefix whichis also a proper suffix of the good prefix.

Page 28: COMP36111: Advanced Algorithms I - Lecture 3: String Matchingsyllabus.cs.manchester.ac.uk/ugt/2016/COMP36111/lecture3.pdf · The string matching problem The Rabin-Karp algorithm The

The string matching problem The Rabin-Karp algorithm The Boyer-Moore Algorithm The Knuth-Morris-Pratt algorithm

• The basic idea of this algorithm is as follows. Suppose wehave a mismatch at some pattern position j .

j

• Call P[0, . . . , j − 1] the good prefix.

• Now let is look at the longest prefix of the good prefix whichis also a proper suffix of the good prefix.

Page 29: COMP36111: Advanced Algorithms I - Lecture 3: String Matchingsyllabus.cs.manchester.ac.uk/ugt/2016/COMP36111/lecture3.pdf · The string matching problem The Rabin-Karp algorithm The

The string matching problem The Rabin-Karp algorithm The Boyer-Moore Algorithm The Knuth-Morris-Pratt algorithm

• Suppose that the length of the longest such proper prefix is k .

• It should be clear that there cannot be any matches involvingshifts of less than k (for then, k would not be maximal).

jk

• So we can shift the pattern up by k .

• Denote the length k of the longest prefix of P[0, . . . , j − 1]that is also a proper suffix of P[0, . . . , j − 1] by π(j), for all j(1 ≤ j ≤ |P|), and set π(0) = 0.

Page 30: COMP36111: Advanced Algorithms I - Lecture 3: String Matchingsyllabus.cs.manchester.ac.uk/ugt/2016/COMP36111/lecture3.pdf · The string matching problem The Rabin-Karp algorithm The

The string matching problem The Rabin-Karp algorithm The Boyer-Moore Algorithm The Knuth-Morris-Pratt algorithm

• Suppose that the length of the longest such proper prefix is k .

• It should be clear that there cannot be any matches involvingshifts of less than k (for then, k would not be maximal).

jk

• So we can shift the pattern up by k .

• Denote the length k of the longest prefix of P[0, . . . , j − 1]that is also a proper suffix of P[0, . . . , j − 1] by π(j), for all j(1 ≤ j ≤ |P|), and set π(0) = 0.

Page 31: COMP36111: Advanced Algorithms I - Lecture 3: String Matchingsyllabus.cs.manchester.ac.uk/ugt/2016/COMP36111/lecture3.pdf · The string matching problem The Rabin-Karp algorithm The

The string matching problem The Rabin-Karp algorithm The Boyer-Moore Algorithm The Knuth-Morris-Pratt algorithm

• Suppose that the length of the longest such proper prefix is k .

• It should be clear that there cannot be any matches involvingshifts of less than k (for then, k would not be maximal).

jk

• So we can shift the pattern up by k .

• Denote the length k of the longest prefix of P[0, . . . , j − 1]that is also a proper suffix of P[0, . . . , j − 1] by π(j), for all j(1 ≤ j ≤ |P|), and set π(0) = 0.

Page 32: COMP36111: Advanced Algorithms I - Lecture 3: String Matchingsyllabus.cs.manchester.ac.uk/ugt/2016/COMP36111/lecture3.pdf · The string matching problem The Rabin-Karp algorithm The

The string matching problem The Rabin-Karp algorithm The Boyer-Moore Algorithm The Knuth-Morris-Pratt algorithm

• Don’t do it! Don’t shift the pattern up by k!

• Instead, think what would happen to j if you did. The lengthof the good prefix would change:

j ← π(j).

a

jπ(j)

π(j)

• Now repeat the process: either we get a match and makeprogress (incrementing j), or we get a mismatch and executej ← π(j).

Page 33: COMP36111: Advanced Algorithms I - Lecture 3: String Matchingsyllabus.cs.manchester.ac.uk/ugt/2016/COMP36111/lecture3.pdf · The string matching problem The Rabin-Karp algorithm The

The string matching problem The Rabin-Karp algorithm The Boyer-Moore Algorithm The Knuth-Morris-Pratt algorithm

• Here is the algorithm.

begin Knuth-Morris-Pratt(T,P)I ← ∅compute the function πi ← 0, j ← 0while i < |T |

if P[j ] = T [i ]if j = |P| − 1

I ← I ∪ {i − |P|+ 1}i++, j ← π[|P|]

i++, j++else if j > 0

j ← π[j ]else

i++return I

end

Page 34: COMP36111: Advanced Algorithms I - Lecture 3: String Matchingsyllabus.cs.manchester.ac.uk/ugt/2016/COMP36111/lecture3.pdf · The string matching problem The Rabin-Karp algorithm The

The string matching problem The Rabin-Karp algorithm The Boyer-Moore Algorithm The Knuth-Morris-Pratt algorithm

• The running time (ignoring the construction of π is O(|T |).• Letting k = i − j , each iteration of the loop either increments i

or increases k by at least 1, and neither quantity reduces.• Hence, the while loop can execute at most 2|T | times.

• Note that π is one-off: it depends only P and not on T , so itscomputation is not critical.

• In fact, however, π can be computed in time O(|P|), leadingto an overall running time of O(|P|+ |T |).