Knuth-Morris-Pratt- algoritmen (KMP-algoritmen) är en effektiv algoritm som söker efter en delsträng i en sträng . Algoritmens körtid beror linjärt på mängden indata, det vill säga det är omöjligt att utveckla en asymptotiskt mer effektiv algoritm.
Algoritmen utvecklades av D. Knuth och W. Pratt och, oberoende av dem, av D. Morris [1] . De publicerade resultaten av sitt arbete gemensamt 1977 [2] .
Givet ett mönster (sträng) och en sträng . Det krävs att bestämma indexet från vilket mönstret finns i strängen . Om det inte ingår i returnerar du ett index som inte kan tolkas som en position i strängen (till exempel ett negativt tal). Om du behöver hålla reda på varje förekomst av ett mönster i texten, är det vettigt att ha en extra funktion som anropas när ett mönster hittas.
Aho-Korasik-algoritmen låter dig också söka efter en enda sträng i linjär tid. Men den svaga punkten med denna algoritm är den finita automaten, som är explicit inbyggd i O (| nål |·|Σ|) operationer och kräver samma mängd minne.
Om du bara söker efter en rad kommer varje stat att ha bara en "direkt" övergång. Sidoövergångar kommer att beräknas dynamiskt, utan att cachelagra dem på något sätt.
om höstack[i] = nål[tillstånd] sedan state = state + 1 annars tillstånd = sidoövergång(tillstånd, höstack[i])Det är lätt att se att suffixlänkarna i Aho-Korasik-algoritmen är en prefixfunktion för den önskade mallen.
Överväg en strängjämförelse vid position , där mönstret matchas mot en textbit . Antag att den första missmatchningen inträffade mellan och , där . Sedan och .
När du skiftar är det fullt möjligt att förvänta sig att prefixet (starttecken) i mönstret kommer att konvergera med något suffix (sluttecken) i texten . Längden på det längsta prefixet, som också är ett suffix, är värdet på prefixfunktionen från strängen för indexet .
Detta leder oss till följande algoritm: låt vara värdet på prefixfunktionen från strängen för index . Sedan, efter skiftet, kan vi återuppta jämförelser från platsen och utan att förlora den möjliga platsen för provet. Det kan visas att tabellen kan beräknas (amorteras) för jämförelser innan sökningen påbörjas. Och eftersom strängen kommer att korsas exakt en gång, kommer den totala körtiden för algoritmen att vara lika med , där är längden på texten .
Funktionen returnerar — uppsättningen av antalet element i strängen som slutar de hittade förekomsterna i .
Strängar | |
---|---|
Stränglikhetsmått | |
Sök efter delsträng | |
palindromer | |
Sekvensjustering | |
Suffixstrukturer | |
Övrig |
Donald Knuth | |
---|---|
Publikationer |
|
programvara | |
Teckensnitt |
|
Kompetent programmering |
|
Algoritmer |
|
Övrig |
|