Knuth-Morris-Pratt- algoritmi (KMP-algoritmi) on tehokas algoritmi , joka etsii alimerkkijonoa merkkijonosta . Algoritmin ajoaika riippuu lineaarisesti syötetyn datan määrästä, eli asymptoottisesti tehokkaampaa algoritmia on mahdotonta kehittää.
Algoritmin ovat kehittäneet D. Knuth ja W. Pratt sekä heistä riippumatta D. Morris [1] . He julkaisivat työnsä tulokset yhdessä vuonna 1977 [2] .
Annettu kuvio (merkkijono) ja merkkijono . On määritettävä indeksi, josta alkaen kuvio sisältyy merkkijonoon . Jos ei sisällä , palauttaa indeksin, jota ei voida tulkita asemaksi merkkijonossa (esimerkiksi negatiivinen luku). Jos sinun on seurattava jokaista kuvion esiintymistä tekstissä, on järkevää käyttää lisätoimintoa, jota kutsutaan aina, kun kuvio löytyy.
Aho-Korasik-algoritmin avulla voit myös etsiä yksittäistä merkkijonoa lineaarisessa ajassa. Mutta tämän algoritmin heikko kohta on äärellinen automaatti, joka on eksplisiittisesti rakennettu O (| neula |·|Σ|) -operaatioihin ja vaatii saman määrän muistia.
Jos haet vain yhtä riviä, jokaisessa tilassa on vain yksi "suora" siirtymä. Sivusiirtymät lasketaan dynaamisesti ilman, että niitä tallennetaan millään tavalla välimuistiin.
jos heinäsuovasta[i] = neula[tila] sitten tila = tila + 1 muuten tila = sivusiirtymä(tila, heinäsuovasta[i])On helppo nähdä, että Aho-Korasik-algoritmin suffiksilinkit ovat halutun mallin etuliitefunktio .
Harkitse merkkijonojen vertailua kohdassa , jossa kuvio on sovitettu tekstinpalaan . Oletetaan, että ensimmäinen epäsuhta tapahtui välillä ja , jossa . Sitten ja .
Siirrettäessä on täysin mahdollista odottaa, että kuvion etuliite (alkumerkit) suppenee jonkin tekstin päätteen (loppumerkkien) kanssa . Pisimmän etuliitteen pituus, joka on myös jälkiliite, on etuliitefunktion arvo merkkijonosta indeksille .
Tämä johtaa meidät seuraavaan algoritmiin: olkoon etuliitefunktion arvo merkkijonosta indeksi . Vuoron jälkeen voimme jatkaa vertailuja paikan päällä menettämättä mahdollista näytteen sijaintia. Voidaan osoittaa, että taulukko voidaan laskea (poisto) vertailuja varten ennen haun aloittamista. Ja koska merkkijono ajetaan tasan kerran, algoritmin kokonaisajoaika on yhtä suuri kuin , missä on tekstin pituus .
Funktio palauttaa — joukon merkkijonon elementtien lukumäärää, jotka päättävät löydetyt esiintymät kohtaan .
jouset | |
---|---|
Merkkijonojen samankaltaisuusmitat | |
Alimerkkijonohaku | |
palindromit | |
Jakson tasaus | |
Suffiksirakenteet | |
muu |
Donald Knuth | |
---|---|
Julkaisut |
|
Ohjelmisto | |
Fontit |
|
Osaava ohjelmointi |
|
Algoritmit |
|
muu |
|