Ejho—Korasikin algoritam

U računarstvu, Ejho—Korasikin algoritam za podudarnost niski je algoritam za pretragu niski koji su izmislili Alfred Vejno Ejho i Margaret Dž. Korasik.[1] To je algoritam po principu pretrage rečnika koji nalazi elemente konačnog skupa niski („rečnika“) u okviru unetog teksta. Vrši simultano podudaranje šablona. Teorija složenosti izračunavanja algoritma je linearna u dužini šablona, plus dužini pretraženog teksta, plus broja podudarnosti na izlazu. Uzmimo u obzir da, pošto su sve podudarnosti nađene, može biti kvadratni broj podudaranja ako je podudaran svaki podstring.

Algoritam gradi mašinu konačnog stanja koja podseća na drvo, sa dodatnim vezama između različitih unutrašnjih čvorova. Ove dodatne unutrašnje veze dopuštaju brze prelaze između neuspelih poklapanja šablona(pretraga za мачка u drvetu koje ne sadrži мачка ali sadrži мачевалац ne bi uspela na čvoru sa prefiksom мач) i ostalih grana koje dele zajednički prefiks. Ovo omogućava automatizaciju prelaska između podudarnih šablona bez potrebe za bektrekingom.

Kada je rečnik šablona poznat unapred, konstrukcija automata može biti izvršena oflajn i kompajlirani automat sačuvan za kasniju upotrebu. U ovom slučaju, njegovo vreme izvršavanja je linearno u dužini ulaza plus broj podudarnih ulaza.

Ejho—Korasikin algoritam za podudarnost stringova zasnovao je bazu originalne liste Juniks programa.

Graf ispod je Ejho—Korasikina struktura podataka, napravljena iz navedenog rečnika, sa svakim redom u tabeli koji predstavlja čvor u stablu, sa putanjom kolona koja ukazuje na jedinstven niz karaktera iz korena ka čvoru.

Struktura podataka ima po jedan čvor za svaki prefiks svakog stringa u rečniku. Ako je (bca) u rečniku onda će postojati čvorovi za (bca), (bc), (b) i (). Postoji crna usmerena grana deteta iz svakog čvora do čvora čije ime se dobija nadovezivanjem jednog karaktera. Samim tim postoji crna grana od (bc) do (bca). Postoji plava usmerena sufiks grana od svakog čvora do čvora koji je najduži mogući striktni sufiks tog čvora u grafu. Na primer, za čvor (caa) striktni sufiksi su (aa), (a) i (). Najduži od njih koji postoji u grafu je (a), tako da postoji plava grana od (caa) do (a). Postoji zelena grana rečničkog sufiksa od svakog čvora do sledećeg čvora u rečniku do kog se može doći prateći plave grane. Na primer, postoji zelena grana od (bca) do (a) zbog toga što je (a) prvi čvor u rečniku (tzv. beli čvor) do koga se dolazi prateći plave grane do (ca), a onda do (a).

Dijagram pretrage
Rečnik {a, ab, bc, bca, c, caa}
Putanja U rečniku Sufiks Rečnički sufiks
() -
(a) + ()
(ab) + (b)
(b) - ()
(bc) + (c) (c)
(bca) + (ca) (a)
(c) + ()
(ca) - (a) (a)
(caa) + (a) (a)

Na svakom koraku, trenutni čvor se produžava tražeći svoje dete, a ako ono ne postoji, nalazeći njegovo dete sufiks, a ako to ne uspe nalazeći dete sufiks njegovog sufiksa itd. završavajući na kraju u korenu ako ništa nije viđeno pre toga.

Kada algoritam dođe do čvora, izbacuje sve rečničke ulaze koji se završavaju na trenutnoj poziciji karaktera u unetom tekstu. Ovo se radi štampanjem svakog čvora do koga se došlo prateći sufiks veze rečnika počevši od tog čvora, i nastavljajući sve dok se ne dođe do čvora koji nema rečničku sufiks vezu. Kao dodatak, i taj čvor se štampa ako predstavlja ulaz u rečnik.

Izvršenje na ulaznom stringu abccab povlači sledeće korake:

Analysis of input string abccab
Node Remaining String Output:End Position Transition Output
() abccab   start at root
(a) bccab a:1 () to child (a) Current node
(ab) ccab ab:2 (a) to child (ab) Current node
(bc) cab bc:3, c:3 (ab) to suffix (b) to child (bc) Current Node, Dict suffix node
(c) ab c:4 (bc) to suffix (c) to suffix () to child (c) Current node
(ca) b a:5 (c) to child (ca) Dict suffix node
(ab) ab:6 (ca) to suffix (a) to child (ab) Current node

Reference uredi

  1. ^ Aho, Alfred V.; Margaret J. Corasick (1975). „Efficient string matching: An aid to bibliographic search”. Communications of the ACM. 18 (6): 333–340. doi:10.1145/360825.360855. 

Spoljašnje veze uredi