Suffiks array

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 6. november 2021; checks kræver 2 redigeringer .

Suffiksarrayet  er en leksikografisk sorteret matrix af alle strengens suffikser . Denne datastruktur blev designet af Eugene Myers og Udy Manber som et mere økonomisk alternativ til suffikstræet med hensyn til hukommelseskrav. Det bruges ofte, hvor der er behov for hurtige substring-opslag, såsom i Burrows-Wheeler Transform (BWT), og som en datastruktur i et søgeindeks .

Eksempel

Overvej strengen "abracadabra" 11 tegn lang.

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

Sorteret liste over dens suffikser:

-en abra abrakadabra acadabra adabra bh bracadabra cadabra dabra ra racadabra

Suffiksarrayet for denne streng er {11,8,1,4,6,9,2,5,7,10,3}, fordi "a"-suffikset starter med det 11. tegn, "abra"-suffikset starter med det 8. tegn. go, og så videre, op til det sidste suffiks "racadabra", som begynder med det tredje tegn i det oprindelige ord.

Nu, ved at bruge dette array, kan du nemt finde alle understrenge. Hvis du for eksempel skal finde understrengen "ab", er det nok at finde alle de suffikser, der starter med "ab". Ved at sortere alfabetisk ligger de ved siden af ​​hinanden. Ved at bruge binær søgning finder vi 2. og 3. suffikser "abra" og "abracadabra", som matcher 2. og 3. element i suffiksarrayet (8 og 1). Det betyder, at den søgte understreng "ab" forekommer på det første og ottende tegn i det oprindelige ord.

Bygning

Et suffiksarray kan bygges med eller uden et suffikstræ ved at udfylde en streng til en cyklisk længde af en potens på to og anvende en specifik algoritme til den.

Gennem suffikstræet

  1. Vi bygger et suffikstræ for strengen T$. Hvor T er tekst.
  2. I dette suffikstræ kører vi en dybde-først-søgning med prioritet at vælge leksigrafisk minimale kanter.
  3. Under søgningen vurderer vi, at $ (sentinel) er det leksikografisk mindste tegn.
  4. Ankomst i arket når et eller andet leksikografisk mindste suffiks, der endnu ikke er overvejet i øjeblikket, hvis værdi i arket, med startindeks i, skal skrives til den aktuelle celle i suffiksarrayet.
  5. Dette resulterer i et suffiksarray for hele teksten.

Konstruktionens kompleksitet er , linjen omfatter konstruktionen af ​​et suffikstræ og en dybde-først-søgning.

Søg

En søgning i et suffiksarray kan udføres gennem en binær søgning. Hans dårligste vurdering . Men du kan speede op til .

Naiv binær søgning

  • Ideen med søgningen er, at hvis mønsteret forekommer i teksten, vil alle suffikser, der starter med i suffiksarrayet , være placeret ved siden af ​​hinanden.
  • Vi kører en binær søgning på suffiks-arrayet og finder det mindste indeks : starter ikke med og det største indeks : starter heller ikke med .
  • Så kommer prøven i positioner op til .
  • Hvis der er mange mønsterpræfikser, falder scoren til .

Simpel acceleration

  • ,  — grænser for søgeintervallet. I begyndelsen ,.
  • Vi husker længden af ​​præfikserne , , der falder sammen med præfikset .
  • .
  • Ved den næste sammenligning i position begynder vi at behandle tegn ikke fra den første position, men fra .
  • Normalt arbejdstid , men den værste arbejdstid er stadig .

Acceleration via LCP

Det største fælles præfiks ( eng.  Largest Common Prefix ) - for to strenge ,  - længden af ​​det største matchende præfiks.

I denne algoritme vil vi antage, at for to suffikser beregnes for . Funktionen beregnes på forbehandlingsstadiet, når et træ bygges. Følgende udsagn er også sandt :

Takket være denne funktion kan du optimere den binære søgning efter et suffiksarray.

Lemma : Hvis de første tegn i suffikset falder sammen på venstre og højre grænser ( henholdsvis indeksene for suffikset) , så vil det samme antal tegn matche for alle suffikser på segmentet .

  1. , , , . Følgende tilfælde er mulige
    1. .
      1. Sammenlign suffikset i med mønsteret i position .
      2. Suffikset er leksikografisk større end eller lig , og der opstod en mismatch ved positionen i suffikset (hvis der er et leksikografisk match og , så betragter vi det som lig med ), så ændrer vi søgegrænserne: .
      3. Ellers skal du ændre grænserne sådan: .
    2. . Vi tjekker .
      1. . I dette tilfælde, efter positionen i suffikset på position , følger der en række af de samme tegn som i , som ikke matcher mønsteret (hvis de gjorde det, ville der være flere). Så du skal ændre grænserne som følger: .
      2. , betyder det, at efter positionen i suffikset efterfølges positionen af ​​en mismatch med nogle tegn i præfikset , og størstedelen af ​​matchningen med mønsteret er indeholdt i segmentet - det betyder , at der absolut ikke vil være forekomster af mønsteret i segmentet. Du skal ændre grænserne som følger: .
      3. Det betyder, at på segmentet  falder de første tegn i alle suffikser sammen , og det er umuligt umiddelbart at sige, hvilket undersegment man skal gå til.  For at løse dette er det nødvendigt at sammenligne tegnene efter positionen i suffikset med mønsteret . Hvis det leksikografisk er mindre end eller lig med,  og der er et misforhold ved den te position (hvis der er et leksikografisk match og, så betragter vi som lig ), så ændrer vi grænserne som følger:, ,; ellers ( leksikografisk større): , ,.
    3. . Vi tjekker og sammenligner med som i forrige trin, men skifter til og til .
  2. Algoritmen virker indtil og bliver lige . Det betyder, at der er et segment af tilfældigheder. Hvis invarianten ikke er opfyldt , er der ikke noget mønster som en understreng i teksten.

En sådan superacceleration giver tid , da iterationer over suffiksarrayet udføres.

Relaterede algoritmer

Se også

Links

Litteratur