Givet: ett mönster P och en strän S. Mönsterlängden |P| betecknas m, stränglängden |S| med n.
Om S=which-finally-halt-at-that-point och P=at-that
which-finally-halt-at-that-point
a
a
a
a
a
a
a
a
a
at
a
a
a
a
a
at
a
a
a
at-that
28 jämförelser.
RF fungerar bra om m är litet (mindre än 4) eller n är ungefär m.
next[j] = 1+längden av matchande delsträng.Tecknet * visar aktuell mismatch, versaler den matchande delsträngen.
j abracadabra next[j] 1 0 (per def) 2 a* 1 3 ab* 1 4 abr* 1 5 abrA* 2 6 abrac* 1 7 abracA* 2 8 abracad* 1 9 abracadA* 2 10 abracadAB* 3 11 abracadABR* 4
abrada... abracabracadabra
abrac next[5]=2
b next[2]=1
ab next[2]=1
a next[1]=0
a next[1]=0
a next[1]=0
a next[1]=0
abracad next[7]=2
bracadabra match!
KMP fungerar bäst i texter med alfabetets storlek ungefär lika med n.
P = AT-THAT
S = WHICH-FINALLY-HALT-AT-THAT-POINT(längd m=7 och n=32 respektive)
| A | H | T | - | Övr | |
|---|---|---|---|---|---|
| d1 | 1 | 2 | 0 | 4 | 7 |
| A | T | - | T | H | A | T | |
|---|---|---|---|---|---|---|---|
| d1 | 11 | 10 | 9 | 8 | 7 | 4 | 1 |
* markerar var mönsterpekaren är när en mismatch detekteras, versaler anger jämförda bokstäver. Varje rad motsvarar en flyttning via tabellerna.
WHICH-FINALLY-HALT-AT-THAT-POINT
*
at-thaT * F i d1 ger 7 steg
at-thaT * - i d1 ger 4 steg
at-thAT* A i d2 ger 4 steg
at-tHAT H i d2 ger 7 steg
AT-THAT match
Totalt 14 jämförelser.
För varje tecken i d1 sätt tabellvärdet till:
d1[j]=m-läget i mönstret för den "högraste" förekomsten av tecknet.
1234567 AT-THATA, H, T och - förekommer sist i mönstret i lägena 6, 5, 7 resp. 3 vilket ger d1 värden 1, 2, 0 och 4.
Versala tecken har blivit jämförda, * anger mönsterpekaren och X ett tecken som mismatchar. Raden ovanför mönstret representerar en tänkt text man arbetar mot.
*
...X...
at-thaT j=7. Mismatch vid T: flytta 1 steg, ger:
*
at-that
*
...XT..
at-thAT j=6. Match för T: flytta 4 steg, ger:
*
at-that
*
...XAT.
at-tHAT j=5. Match för AT: flytta 7 steg, ger:
*
at-that
*
...XHAT
at-THAT j=4. Match för HAT: flytta 8 steg, ger:
*
at-that
*
..XTHAT
at-THAT j=3. Match för THAT: flytta 9 steg, ger:
*
at-that
*
.X-THAT
at-THAT j=2. Match för -THAT: flytta 10 steg, ger:
*
at-that
*
XT-THAT
at-THAT j=1. Match för T-THAT: flytta 11 steg, ger:
*
at-that
Se också http://www.ctc.dcu.ie/ctcweb/courses/algorithms/course/string.html för en genomgång av flera strängmatchningsalgoritmer.