Boyer-Moore-Horspool-algoritmi on algoritmi alimerkkijonon löytämiseksi merkkijonosta , yksinkertaistettu versio Boyer-Moore-algoritmista . ABMX toimii paremmin kuin Boyer-Moore-algoritmi satunnaisissa teksteissä, keskimääräinen pistemäärä on välillä - yhteen tekstin merkkiin [1] . Lisäksi laskennallisesti intensiivinen sovituspääteheuristiikka jätetään pois.
Kuitenkin arvio ( pahimmassa tapauksessa ei-jaksollisilla malleilla) ABMX:lle on | neula |·| heinäsuovasta | (3 sijasta | heinäsuovasta | Boyer-Moorelle).
Algoritmi on muunnos Boyer-Moore-algoritmista . Algoritmin idea on tämä.
1. Skannaus vasemmalta oikealle, vertailu "musta laatikko" -tilassa. Kuten primitiivisessä algoritmissa, tekstin alku ja malli yhdistetään, vertailu tehdään tavallisella " vertaa muistiosia " -menettelyä . Jos kaikki kuvion merkit vastasivat merkkijonon päällekkäisiä merkkejä, osamerkkijono on löydetty ja haku on päättynyt.
Jos jokin kuvion merkki ei vastaa merkkijonon vastaavaa merkkiä, kuviota siirretään muutaman merkin verran oikealle. Nämä "harvat" valitaan tällaisen heuristiikan mukaan.
2. Pysäytyssymbolin heuristiikka muutettu. Otamme tekstin luonteen, joka ilmestyi kuvion viimeisen merkin yläpuolelle (riippumatta siitä, missä yhteensopimattomuus tapahtui!). Kuvassa on "b".
↓ pysäytyssymboli Teksti abadb * * * * lakattu kuvio Seuraava abbad checkSiirrämme mallia niin, että mallin kirjain "b" on stop-symbolin alla. Tämä toteutetaan offset-taulukon avulla: tallennamme jokaiselle aakkoston merkille suurimman mahdollisen siirtymän, joka ei ohita stop-merkkiä. Eli (kun numeroidaan rivejä 1:llä): siirto ( c ) = | neula |−lastpos( c , neula [1..| neula |−1]) , jossa lastpos on merkin viimeinen esiintyminen merkkijonossa, neula [ a .. b ] on osamerkkijonotoiminto.
"Abbad"-kuviolle taulukko näyttää tältä.
Symboli | a | b | (muu) |
---|---|---|---|
Puolueellisuus | yksi | 2 | 5 |
Symboleille, jotka eivät sisälly malliin, offset-arvo asetetaan yhtä suureksi kuin mallipohjan pituus - 5. Mallin viimeistä symbolia ei oteta huomioon laskettaessa offset-taulukkoa (se on täynnä silmukoita ).
Taulukon laskeminen on helpompaa käymällä läpi kaikki kuvion symbolit:
c=MIN_CHAR..MAX_CHAR vaihto[c] = |neula| i=1..|neula|-1 vaihto[neula[i]] = |neula|-iHaluttu kuvio on "abbad" (tämän kuvion taulukko on rakennettu yllä).
abeccacbadbabbad AbadAsetamme näytteen linjalle. Lähdemerkkijonon "c" viimeinen merkki ei sisälly kuvioon. Siirrä kuviota oikealle 5 asemaa "c":n siirtymäarvon mukaan:
abeccacbadbabbad AbadKuvion kolme merkkiä sopivat, mutta neljäs ei. Siirrä kuviota oikealle 5 asemaa "d":n siirtymäarvon mukaan:
abeccacbadbabbad AbadMerkkijonon "a" viimeinen merkki ei vastaa kuviomerkkiä. Siirrä kuviota oikealle 1:llä "a":n siirtymäarvon mukaan ja hanki kuvion haluttu esiintyminen:
abeccacbadbabbad AbadPysäytysmerkillä otamme neulaa seuraavan merkin .
Empiirinen algoritmi , joka on optimoitu englanninkielisille teksteille. Vertaa viimeistä merkkiä, sitten ensimmäistä, sitten keskimmäistä ja sitten kaikkia muita; yhteensopimattomuuden sattuessa Horspool-vuoro.
Keskimäärin erittäin nopea[ määritä ] . Helppo toteuttaa. Käyttää vakiotoimintoa muistialueiden vertailuun, pääsääntöisesti optimoituna kokoonpanotasolla tietylle prosessorille.
Kuten muutkin Boyer-Moore-perheen algoritmit, sitä ei ole muokattu likimääräistä hakua varten, useiden merkkijonojen samanaikaista hakua varten.
Regressio "huonoihin" tietoihin tapahtuu jonkin verran useammin kuin Boyer-Moore-algoritmissa. Mitä monipuolisempia merkkejä lähdetekstissä on, sitä paremmin ABMX käyttäytyy.
jouset | |
---|---|
Merkkijonojen samankaltaisuusmitat | |
Alimerkkijonohaku | |
palindromit | |
Jakson tasaus | |
Suffiksirakenteet | |
Muut |