Knuth-Morris-Pratt- algoritmen (KMP-algoritmen) er en effektiv algoritme , der søger efter en understreng i en streng . Algoritmens køretid afhænger lineært af mængden af inputdata, det vil sige, at det er umuligt at udvikle en asymptotisk mere effektiv algoritme.
Algoritmen er udviklet af D. Knuth og W. Pratt og, uafhængigt af dem, af D. Morris [1] . De offentliggjorde resultaterne af deres arbejde i fællesskab i 1977 [2] .
Givet et mønster (streng) og en snor . Det er nødvendigt at bestemme det indeks, der starter, hvorfra mønsteret er indeholdt i strengen . Hvis det ikke er indeholdt i , skal du returnere et indeks, der ikke kan fortolkes som en position i strengen (f.eks. et negativt tal). Hvis du har brug for at holde styr på hver forekomst af et mønster i teksten, giver det mening at have en ekstra funktion, der kaldes, hver gang et mønster er fundet.
Aho-Korasik-algoritmen giver dig også mulighed for at søge efter en enkelt streng i lineær tid. Men det svage punkt ved denne algoritme er den endelige automat, som er eksplicit bygget i O (| nål |·|Σ|) operationer og kræver den samme mængde hukommelse.
Hvis du kun søger efter én linje, vil hver tilstand kun have én "direkte" overgang. Sideovergange vil blive beregnet dynamisk uden at cache dem på nogen måde.
hvis høstak[i] = nål[tilstand] så stat = tilstand + 1 ellers tilstand = sideovergang(tilstand, høstak[i])Det er let at se, at suffikslinkene i Aho-Korasik-algoritmen er en præfiksfunktion af den ønskede skabelon.
Overvej en strengsammenligning ved position , hvor mønsteret matches mod et stykke tekst . Antag, at den første uoverensstemmelse opstod mellem og , hvor . Så og .
Når du skifter, er det meget muligt at forvente, at præfikset (starttegn) i mønsteret vil konvergere med et eller andet suffiks (sluttegn) i teksten . Længden af det længste præfiks, som også er et suffiks, er værdien af præfiksfunktionen fra strengen for indekset .
Dette fører os til følgende algoritme: lad være værdien af præfiksfunktionen fra strengen for indeks . Derefter, efter skiftet, kan vi genoptage sammenligninger fra stedet og uden at miste den mulige placering af prøven. Det kan påvises, at tabellen kan beregnes (amortiseres) til sammenligninger, inden søgningen påbegyndes. Og da strengen vil blive krydset præcis én gang, vil den samlede køretid for algoritmen være lig med , hvor er længden af teksten .
Funktionen returnerer — mængden af numre af elementer i strengen , der ender de fundne forekomster i .
Strenge | |
---|---|
String lighedsmål | |
Understrengssøgning | |
palindromer | |
Sekvensjustering | |
Suffiksstrukturer | |
Andet |
Donald Knuth | |
---|---|
Publikationer |
|
Software | |
Skrifttyper |
|
Kompetent programmering |
|
Algoritmer |
|
Andet |
|