Pole přípon

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 6. listopadu 2021; kontroly vyžadují 2 úpravy .

Pole přípon  je lexikograficky seřazené pole všech přípon řetězce . Tuto datovou strukturu navrhli Eugene Myers a Udy Manber jako ekonomičtější alternativu ke stromu přípon z hlediska požadavků na paměť. Často se používá tam, kde je potřeba rychlé vyhledávání podřetězců, jako je Burrows-Wheeler Transform (BWT) a jako datová struktura ve vyhledávacím indexu .

Příklad

Zvažte řetězec "abracadabra" dlouhý 11 znaků.

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

Seřazený seznam jeho přípon:

A abra abrakadabra akadabra adabra podprsenka brakadabra kadabra dabra ra racadabra

Pole přípon tohoto řetězce je {11,8,1,4,6,9,2,5,7,10,3}, protože přípona „a“ začíná 11. znakem, přípona „abra“ začíná 8. znak. go a tak dále, až k poslední příponě „racadabra“, která začíná třetím znakem původního slova.

Nyní pomocí tohoto pole můžete snadno najít všechny podřetězce. Pokud například potřebujete najít podřetězec „ab“, stačí najít všechny přípony, které začínají na „ab“. Seřazením podle abecedy jsou vedle sebe. Pomocí binárního vyhledávání najdeme 2. a 3. příponu „abra“ a „abracadabra“, které odpovídají 2. a 3. prvku pole přípon (8 a 1). To znamená, že hledaný podřetězec "ab" se vyskytuje na prvním a osmém znaku původního slova.

Konstrukce

Pole přípon lze sestavit se stromem přípon nebo bez něj tak, že se řetězec vloží do cyklické délky mocniny dvě a použije se na něj specifický algoritmus.

Prostřednictvím stromu přípon

  1. Vytvoříme strom přípon pro řetězec T$. Kde T je text.
  2. V tomto stromu přípon spouštíme hloubkové vyhledávání s prioritou výběru lexigraficky minimálních hran.
  3. Při vyhledávání uvažujeme, že $ (sentinel) je lexikograficky nejmenší znak.
  4. Příchod do listu dosáhne nějaké lexikograficky nejmenší přípony, která v tuto chvíli ještě není uvažována, jejíž hodnota v listu, počínaje indexem, musí být zapsána do aktuální buňky pole přípon.
  5. Výsledkem je pole přípon pro celý text.

Složitost konstrukce je , řada zahrnuje konstrukci sufixového stromu a hloubkové prohledávání.

Hledat

Vyhledávání v poli přípon lze provést pomocí binárního vyhledávání. Jeho nejhorší hodnocení . Ale můžete zrychlit až .

Naivní binární vyhledávání

  • Myšlenka hledání je taková, že pokud se vzor vyskytuje v textu, pak všechny přípony začínající v poli přípon budou umístěny vedle sebe.
  • Spustíme binární vyhledávání v poli přípon a najdeme nejmenší index : nezačíná na a největší index : nezačíná ani jedním .
  • Poté vzorek přichází v polohách až .
  • Pokud existuje mnoho předpon vzoru, skóre klesne na .

Jednoduché zrychlení

  • ,  — hranice intervalu vyhledávání. Na začátku , .
  • Pamatujeme si délku předpon , , shodující se s předponou .
  • .
  • Při dalším srovnání na pozici začneme zpracovávat znaky nikoli od první pozice, ale od .
  • Obvykle pracovní doba , ale nejhorší pracovní doba je stále .

Akcelerace pomocí LCP

Největší společná předpona ( angl.  Largest Common Prefix ) - pro dva řetězce ,  - délka největší shodné předpony.

V tomto algoritmu budeme předpokládat, že pro libovolné dvě přípony se počítá pro . Funkce se vypočítá ve fázi předběžného zpracování při vytváření stromu. Následující tvrzení je také pravdivé :

Díky této funkci můžete optimalizovat binární vyhledávání pole přípon.

Lemma : Pokud se první znaky přípony shodují na levém a pravém okraji ( respektive indexy pole přípon) , pak bude stejný počet znaků odpovídat všem příponám v segmentu .

  1. , , , . Možné jsou následující případy
    1. .
      1. Porovnejte příponu in se vzorem na pozici .
      2. Přípona je lexikograficky větší nebo rovna a na pozici v příponě došlo k neshodě (pokud existuje lexikografická shoda a , považujeme ji za rovnou ), změníme hranice hledání: .
      3. Jinak změňte okraje takto: .
    2. . kontrolujeme .
      1. . V tomto případě za pozicí v koncovce on position , následuje řada stejných znaků jako v , které neodpovídají vzoru (pokud by odpovídaly, bylo by jich více). Takže musíte změnit hranice následovně: .
      2. , to znamená, že za pozicí v sufixu následuje pozice neshoda s některými znaky prefixu a většina shody se vzorem je obsažena v segmentu - to znamená , že zde rozhodně nebude výskyt vzor v segmentu. Okraje musíte změnit následovně: .
      3. to znamená, že v segmentu  se první znaky ve všech příponách shodují a není možné okamžitě určit, do kterého podsegmentu přejít. Chcete-li to vyřešit, je nutné porovnat se vzorem znaky  následující za pozicí v příponě . Pokud je lexikograficky menší nebo roven a existuje neshoda na -té pozici (pokud existuje lexikografická shoda a, pak považujeme za rovné ), změníme hranice následovně:, ,; jinak ( lexikograficky větší): , ,.
    3. . Zkontrolujeme a porovnáme s jako v předchozím kroku, ale změníme na a na .
  2. Algoritmus funguje tak dlouho, dokud se nestane rovnost . To znamená, že existuje segment náhody. Pokud invariant není splněn , pak v textu není žádný vzor jako podřetězec.

Taková superakcelerace dává čas , protože se provádějí iterace nad polem přípon.

Související algoritmy

Viz také

Odkazy

Literatura