Suffix array

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 6 november 2021; kontroller kräver 2 redigeringar .

Suffixmatrisen  är en lexikografiskt sorterad matris av alla suffixen i strängen . Denna datastruktur designades av Eugene Myers och Udy Manber som ett mer ekonomiskt alternativ till suffixträdet när det gäller minneskrav. Det används ofta där snabba delsträngssökningar behövs, till exempel i Burrows-Wheeler Transform (BWT), och som en datastruktur i ett sökindex .

Exempel

Tänk på att strängen "abracadabra" är 11 tecken lång.

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

Sorterad lista över dess suffix:

a en bh abrakadabra acadabra adabra behå bracadabra cadabra dabra ra racadabra

Suffixmatrisen för denna sträng är {11,8,1,4,6,9,2,5,7,10,3}, eftersom suffixet "a" börjar med det 11:e tecknet, suffixet "abra" börjar med det 8:e tecknet. go, och så vidare, upp till det sista suffixet "racadabra", som börjar med det tredje tecknet i det ursprungliga ordet.

Nu, med hjälp av denna array, kan du enkelt hitta alla delsträngar. Om du till exempel behöver hitta delsträngen "ab" räcker det med att hitta alla suffix som börjar med "ab". Genom att sortera alfabetiskt ligger de bredvid varandra. Med hjälp av binär sökning hittar vi 2:a och 3:e suffixen "abra" och "abracadabra" som matchar det 2:a och 3:e elementet i suffixmatrisen (8 och 1). Det betyder att den sökta delsträngen "ab" förekommer på det första och åttonde tecknet i det ursprungliga ordet.

Byggnad

En suffixarray kan byggas med eller utan ett suffixträd genom att utfylla en sträng till en cyklisk längd av en potens av två och tillämpa en specifik algoritm på den.

Genom suffixträdet

  1. Vi bygger ett suffixträd för strängen T$. Där T är text.
  2. I detta suffixträd kör vi en djup-först-sökning med prioritet att välja lexigrafiskt minimala kanter.
  3. Under sökningen anser vi att $ (sentinel) är det lexikografiskt minsta tecknet.
  4. Ankomst i arket når något lexikografiskt minsta suffix som ännu inte har beaktats för tillfället, vars värde i arket, med startindex i, måste skrivas till den aktuella cellen i suffixarrayen.
  5. Detta resulterar i en suffixarray för hela texten.

Konstruktionens komplexitet är , raden inkluderar konstruktionen av ett suffixträd och en djup-först-sökning.

Sök

En sökning i en suffixarray kan göras genom en binär sökning. Hans sämsta betyg . Men du kan snabba upp till .

Naiv binär sökning

  • Tanken med sökningen är att om mönstret förekommer i texten kommer alla suffix som börjar med i suffixarrayen att vara placerade bredvid varandra.
  • Vi kör en binär sökning på suffixmatrisen och hittar det minsta indexet : börjar inte med och det största indexet : börjar inte med någondera .
  • Sedan kommer provet i positioner upp till .
  • Om det finns många mönsterprefix sjunker poängen till .

Enkel acceleration

  • ,  — gränser för sökintervallet. I början ,.
  • Vi kommer ihåg längden på prefixen , , sammanfallande med prefixet .
  • .
  • Vid nästa jämförelse i position börjar vi bearbeta tecken inte från den första positionen, utan från .
  • Vanligtvis arbetstid , men den värsta arbetstiden är fortfarande .

Acceleration via LCP

Det största vanliga prefixet ( eng.  Largest Common Prefix ) - för två strängar ,  - längden på det största matchande prefixet.

I denna algoritm kommer vi att anta att för vilka två suffix som helst beräknas för . Funktionen beräknas i förbearbetningsstadiet när man bygger ett träd. Följande påstående är också sant :

Tack vare denna funktion kan du optimera den binära sökningen efter en suffixarray.

Lemma : Om de första tecknen i suffixet sammanfaller på den vänstra och högra gränsen ( , respektive indexen för suffixmatrisen) , så kommer samma antal tecken att matcha för alla suffix i segmentet .

  1. , , , . Följande fall är möjliga
    1. .
      1. Jämför suffixet i med mönstret på plats .
      2. Suffixet är lexikografiskt större än eller lika och en missmatchning inträffade vid positionen i suffixet (om det finns en lexikografisk matchning och , då anser vi att det är lika med ), då ändrar vi sökgränserna: .
      3. Annars ändrar du gränserna så här: .
    2. . Vi kollar .
      1. . I det här fallet, efter positionen i suffixet på position , följer ett antal av samma tecken som i , som inte matchar mönstret (om de gjorde det skulle det finnas fler). Så du måste ändra gränserna enligt följande: .
      2. , betyder detta att efter positionen i suffixet följs positionen av en missmatchning med vissa tecken i prefixet , och majoriteten av matchningen med mönstret finns i segmentet - det betyder att det definitivt inte kommer att förekomma mönstret i segmentet. Du måste ändra gränserna enligt följande: .
      3. Detta betyder att på segmentet  sammanfaller de första tecknen i alla suffix , och det är omöjligt att omedelbart avgöra vilket undersegment man ska gå till. För att lösa detta är det nödvändigt att jämföra tecknen  efter positionen i suffixet med mönstret . Om det är lexikografiskt mindre än eller lika med och det finns en oöverensstämmelse vid den:e positionen (om det finns en lexikografisk match och, då betraktar vi lika ), så ändrar vi gränserna enligt följande:, ,; annars ( lexikografiskt större): , ,.
    3. . Vi kontrollerar och jämför med som i föregående steg, men ändrar till och till .
  2. Algoritmen fungerar tills och blir lika . Det betyder att det finns ett segment av tillfälligheter. Om invarianten inte uppfylls finns det inget mönster som en delsträng i texten.

Sådan superacceleration ger tid eftersom iterationer över suffixarrayen utförs.

Relaterade algoritmer

Se även

Länkar

Litteratur