Suffiksitaulukko

Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 6.11.2021 tarkistetusta versiosta . tarkastukset vaativat 2 muokkausta .

Suffiksitaulukko  on leksikografisesti lajiteltu taulukko kaikista merkkijonon jälkiliitteistä . Eugene Myers ja Udy Manber suunnittelivat tämän tietorakenteen edullisemmaksi vaihtoehdoksi suffiksipuulle muistivaatimusten suhteen. Sitä käytetään usein silloin, kun tarvitaan nopeita osamerkkijonohakuja, kuten Burrows-Wheeler Transformissa (BWT), ja tietorakenteena hakuhakemistossa .

Esimerkki

Harkitse merkkijonoa "abrakadabra", joka on 11 merkkiä pitkä.

abrakadabra 1 2 3 4 5 6 7 8 9 10 11

Lajiteltu luettelo sen jälkiliitteistä:

a abra abrakadabra acadabra adabra rintaliivit bracadabra cadabra dabra ra racadabra

Tämän merkkijonon päätetaulukko on {11,8,1,4,6,9,2,5,7,10,3}, koska "a"-liite alkaa 11. merkillä ja "abra"-liite alkaa 8. merkki. go ja niin edelleen viimeiseen loppuliitteeseen "racadabra", joka alkaa alkuperäisen sanan kolmannella merkillä.

Nyt käyttämällä tätä taulukkoa voit helposti löytää kaikki alimerkkijonot. Jos esimerkiksi haluat löytää alimerkkijonon "ab", riittää, kun etsit kaikki "ab":lla alkavat päätteet. Lajittelemalla aakkosjärjestykseen ne ovat vierekkäin. Käyttämällä binaarihakua löydämme 2. ja 3. päätteet "abra" ja "abracadabra", jotka vastaavat jälkiliitetaulukon 2. ja 3. elementtiä (8 ja 1). Tämä tarkoittaa, että haettu osamerkkijono "ab" esiintyy alkuperäisen sanan ensimmäisessä ja kahdeksannessa merkissä.

Rakennus

Suffiksitaulukko voidaan rakentaa suffiksipuun kanssa tai ilman sitä lisäämällä merkkijono kahden potenssin sykliseen pituuteen ja soveltamalla siihen tiettyä algoritmia.

Suffiksipuun kautta

  1. Rakennamme päätepuun merkkijonolle T$. Missä T on tekstiä.
  2. Tässä suffiksipuussa suoritamme syvyyshaun, jonka etusijalla on valita leksigrafisesti minimaaliset reunat.
  3. Haun aikana katsomme, että $ (sentinel) on leksikografisesti pienin merkki.
  4. Arkkiin saapuminen saavuttaa jonkin leksikografisesti pienimmän tällä hetkellä harkitsemattoman loppuliitteen, jonka arkin arvo, joka alkaa indeksi sisään, on kirjoitettava suffiksitaulukon nykyiseen soluun.
  5. Tämä johtaa loppuliitteen matriisiin koko tekstille.

Rakenteen monimutkaisuus on , rivi sisältää suffiksipuun rakentamisen ja syvyyshaun.

Hae

Haku päätetaulukosta voidaan tehdä binäärihaulla. Hänen huonoin arvosanansa . Mutta voit nopeuttaa .

Naiivi binaarihaku

  • Haun ideana on, että jos kuvio esiintyy tekstissä, niin kaikki suffiksitaulukossa alkavat päätteet sijoittuvat vierekkäin.
  • Suoritamme binäärihaun suffiksitaulukosta ja löydämme pienimmän indeksi : ei ala ja suurin indeksi : ei ala kummallakaan .
  • Sitten näyte tulee paikoissa aina .
  • Jos kuvion etuliitteitä on useita, pistemäärä laskee arvoon .

Yksinkertainen kiihtyvyys

  • ,  — hakuvälin rajat. Alussa ,. _
  • Muistamme etuliitteiden pituuden , joka on sama kuin etuliite .
  • .
  • Seuraavassa sijaintivertailussa alamme käsitellä merkkejä ei ensimmäisestä paikasta, vaan alkaen .
  • Yleensä työaika , mutta pahin työaika on silti .

Kiihtyvyys LCP:n kautta

Suurin yhteinen etuliite ( eng.  Largest Common Prefix ) - kahdelle merkkijonolle ,  - suurimman vastaavan etuliite pituus.

Tässä algoritmissa oletetaan, että kahdelle loppuliitteelle lasketaan . Funktio lasketaan esikäsittelyvaiheessa puuta rakennettaessa. Myös seuraava väite pitää paikkansa :

Tämän toiminnon ansiosta voit optimoida päätetaulukon binaarihaun.

Lemma : Jos päätteen ensimmäiset merkit ovat samat vasemmalla ja oikealla rajalla ( vastaavasti suffiksitaulukon indeksit) , niin sama määrä merkkejä vastaa kaikkia segmentin jälkiliitteitä .

  1. , , , . Seuraavat tapaukset ovat mahdollisia
    1. .
      1. Vertaa päätettä sisään kuvioon paikoillaan .
      2. Suffiksi on leksikografisesti suurempi tai yhtä suuri ja loppuliitteen kohdassa tapahtui yhteensopimattomuus (jos on leksikografinen vastaavuus ja , niin katsomme sen yhtäläiseksi kuin ), muutamme hakurajoja: .
      3. Muutoin muuta reunuksia seuraavasti: .
    2. . Tarkistamme .
      1. . Tässä tapauksessa aseman päätteessä olevan sijainnin jälkeen seuraa useita samoja merkkejä kuin kohdassa , jotka eivät vastaa kuviota (jos olisivat, niitä olisi enemmän). Joten sinun on muutettava rajoja seuraavasti: .
      2. , tämä tarkoittaa, että päätteen paikan jälkeen paikkaa seuraa epäsuhta etuliitteen joidenkin merkkien kanssa , ja suurin osa kuvion vastaavuudesta sisältyy segmenttiin - se tarkoittaa , että ei varmasti esiinny segmentin kuvio. Sinun on muutettava reunuksia seuraavasti: .
      3. Tämä tarkoittaa, että segmentissä  kaikkien päätteiden ensimmäiset merkit ovat samat , ja on mahdotonta sanoa heti, mihin alasegmenttiin mennä. Tämän ratkaisemiseksi on tarpeen verrata kuvioon merkkejä,  jotka seuraavat jälkiliitteen sijaintia . Jos se on leksikografisesti pienempi tai yhtä suuri kuin  ja siinä on epäsuhta :nnessa paikassa (jos on leksikografinen vastaavuus ja, niin katsotaan yhtäläiseksi ), muutamme rajoja seuraavasti:, ,; muuten ( leksikografisesti suurempi): , ,.
    3. . Tarkistamme ja vertaamme kuten edellisessä vaiheessa, mutta vaihdamme arvoon ja .
  2. Algoritmi toimii, kunnes ja tulee yhtä suureksi . Tämä tarkoittaa, että on olemassa osa sattumaa. Jos invarianttia ei täyty , tekstissä ei ole kuviota osamerkkijonona.

Tällainen superkiihtyvyys antaa aikaa , koska suoritetaan iteraatioita suffiksitaulukon yli.

Aiheeseen liittyvät algoritmit

Katso myös

Linkit

Kirjallisuus