KMP- ja BMH-algoritmit soveltuvat vain yhden hahmon etsimiseen
kerrallaan. Kuitenkin yleensä on annettu useampia
hakusanoja, jotka kaikki täytyy löytää yhdellä tekstin läpikäynnillä.
Aho-Corasick-algorimi on KMP-algoritmin yleistys, joka mahdollistaa
useamman kuin yhden hahmon etsimisen tekstistä tehokkaasti. Olkoon
annettu hahmojoukko
.
Merkitään
:n hahmojen yhteenlaskettua pituutta
. Aho-Corasick-algoritmissa
muodostetaan
:stä kuvassa 2 esitetyn
kaltainen
äärellinen jononsovitusautomaatti
.
Muodostettavan äärellisen automaatin siirtymät muodostavat
:stä trie-rakenteen (lisää trie-puista kerrotaan luvussa 5.1).
Jokaisella siirtymällä luetaan tekstistä yksi merkki. Mikäli
luetulla merkillä ei ole siirtymää, suoritetaan korjaussiirtymä
(merkitty kuvassa 2 katkoviivalla).
AC-algoritmin automaatti
toteutetaan kolmen funktion
avulla.
-,
- ja
-funktiot voidaan yleensä toteuttaa taulukkoina.
Mikäli aakkoston koko
on hyvin suuri, ei
-funktiota voi enää toteuttaa pelkkänä taulukkona, koska
merkillä
indeksoitavan taulukon koko kasvaisi liian suureksi.
Tällöin täytyy ottaa käyttöön jokin muu yleisesti käytetty
hakutietorakenne (esim. lista, hajautustaulu, järjestetty taulukko,
...).
AC-algoritmin jononsovitusautomaatti suorittaa vähemmän kuin
tilasiirtymää selatessaan tekstin. Suoritettavien tilasiirtymien
määrä ei ole riippuvainen hahmojen lukumäärästä
.
Algoritmin aikavaatimukseen vaikuttaa tilasiirtymien lisäksi
yhden tilasiirtymän suoritukseen tarvittavien operatioiden
aikavaatimukset:
Mikäli kaikki funktiot (
) voidaan esittää
taulukkoina, AC-algoritmin aikavaatimus on
, mikäli löytyneiden
esiintymien käsittelyyn tarvittavaa aikaa ei oteta huomioon.
Jos
tai
ovat hyvin suuria, voidaan joutua käyttämään
hakutietorakenteita, jolloin haun aikavaatimukseksi
käytännössä tulee
.