Algoritmul Knuth-Morris-Pratt (algoritmul KMP) este un algoritm eficient care caută un subșir într-un șir . Timpul de rulare al algoritmului depinde liniar de cantitatea de date de intrare, adică este imposibil să se dezvolte un algoritm asimptotic mai eficient .
Algoritmul a fost dezvoltat de D. Knuth și W. Pratt și, independent de aceștia, de D. Morris [1] . Ei au publicat în comun rezultatele muncii lor în 1977 [2] .
Dat un model (șir) și un șir . Este necesar să se determine indexul pornind de la care modelul este conținut în șir . Dacă nu este conținut în , returnează un index care nu poate fi interpretat ca o poziție în șir (de exemplu, un număr negativ). Dacă trebuie să urmăriți fiecare apariție a unui model în text, este logic să aveți o funcție suplimentară care este apelată de fiecare dată când este găsit un model.
Algoritmul Aho-Korasik vă permite, de asemenea, să căutați un singur șir în timp liniar. Dar punctul slab al acestui algoritm este automatul finit, care este construit în mod explicit în operații O (| ac |·|Σ|) și necesită aceeași cantitate de memorie.
Dacă căutați doar o linie, fiecare stat va avea o singură tranziție „directă”. Tranzițiile laterale vor fi calculate dinamic, fără a le stoca în vreun fel.
dacă carul de fân[i] = ac[starea] atunci stare = stare + 1 altfel stare = tranziție laterală (stare, car de fân[i])Este ușor de observat că legăturile sufixe ale algoritmului Aho-Korasik sunt o funcție de prefix a șablonului dorit.
Luați în considerare o comparație de șiruri la poziție , unde modelul este potrivit cu o bucată de text . Să presupunem că prima nepotrivire a avut loc între și , unde . Apoi și .
La schimbare, este foarte posibil să ne așteptăm ca prefixul (caracterele inițiale) modelului să convergă cu un sufix (caracterele de sfârșit) ale textului . Lungimea celui mai lung prefix, care este și un sufix, este valoarea funcției de prefix din șirul pentru index .
Aceasta ne conduce la următorul algoritm: fie valoarea funcției de prefix din șirul pentru index . Apoi, după tură, putem relua comparațiile de la fața locului și fără a pierde posibila locație a probei. Se poate arăta că tabelul poate fi calculat (amortizat) pentru comparații înainte de a începe căutarea. Și deoarece șirul va fi parcurs exact o dată, timpul total de rulare al algoritmului va fi egal cu , unde este lungimea textului .
Funcția returnează — setul de numere de elemente ale șirului care termină aparițiile găsite în .
Siruri de caractere | |
---|---|
Măsuri de similitudine a șirurilor | |
Căutare subșir | |
palindromuri | |
Alinierea secvenței | |
Structuri de sufix | |
Alte |
Donald Knuth | |
---|---|
Publicaţii |
|
Software | |
Fonturi |
|
Programare competenta |
|
Algoritmi |
|
Alte |
|