Kursuse kodulehekülg Viimati muudetud: 16.4.2003

Teema 5 - sufiksipuud, tabelid ja automaadid

  1. Ülesandepüstitus ja sissejuhatus
  2. Sufiksipuu
  3. Sufiksipuu rakendusi
  4. Sufiksitabel
  5. Sufiksiautomaat
  6. Sufiksikaktus jt.
  7. Rakendusi: Oxford English Disctionary

Lisakirjandust


Tagasi

Ülesandepüstitus

Eelmistes loengutes käsitlesime otsimisülesannet suvalisest ettantud tekstist. Olukorras kus tekst ise ei muutu (tihti) võib otsimisülesande püstitada nii, et tekstile S lubada eeltöötlemist ehk indekseerimist.

Võtame näitesõna: S=mississippi. Nüüd: miss on prefix, ippi on sufix ja issi on alamstring mis esineb kahes kohas (issi on sufiksite ississippi ja issippi prefiks!).

T1  = mississippi 
T2  = ississippi
T3  = ssissippi
T4  = sissippi
T5  = issippi
T6  = ssippi
T7  = sippi
T8  = ippi
T9  = ppi
T10 = pi
T11 = i
T12 =               (tühi)
Vaatame nende sufiksite peale sorteeritult:
T11 = i
T8  = ippi
T5  = issippi
T2  = ississippi
T1  = mississippi
T10 = pi
T9  = ppi
T7  = sippi
T4  = sissippi
T6  = ssippi
T3  = ssissippi
Teeks õige samasuguse puu-esituse nagu Aho-Corasick automaadi puhul?

Vaatame näidet:

Pane tähele, et $ ∉ Σ on pandud S lõppu selleks et oleks lihtsam eristada sisesõlmi ja lehti (vrdl. A ja A$).

Kuidas otsida sellest struktuurist?

Olgu antud otsitav string P. Järgi puu harusid vastavalt P tähtedele. Kui P märgiga pole puus haru, siis P ei esine S-is. Vastasel juhul on esinemiskohad antud vastava alampuu lehtedesse pandud positsioonidel.

Otsimise keerukus: O(|P|)

Otsimise keerukus ei sõltu enam S suurusest!

Kuid see eeldab lisaindeksi olemasolu igast tipust vastava alampuu vasakpoolsesse lehte. See on aga triviaalne.

Tagasi

Sufiksipuu

Trie versioonis on ruumi raisatud. Pakime kokku hargnematud alamteed:

Definition A suffix tree T for an m-character string S is a rooted directed tree with exactly m leaves numbered 1 to m. Each internal node, other than the root, has at least two children and each edge is labeled with a nonempty substring of S. No two edges out of a node can have edge-labels beginning with the same character. The key feature of the suffix tree is that for any leaf i, the concatenation of the edge-labels on the path from the root to leaf i exactly spells out the suffix of S that starts at position i. That is, it spells out S[i..m]. Kuid puu on ikka veel O(n2)?
Esitame kaartel olevad nimed omakorda konstantse pikkusega:

Ukkonen'i konstruktsioon

Algoritm: On-line sufiksipuu konstruktsioon (Ukkonen)
Sisend: Tekst S
Väljund: Sufiksipuu ST.

1. Konstrueeri puu algus

2. for i = 1 .. m-1 do   { lisa positsioon i+1 }
3.      for j = 1 .. i+1 { laiendus j }
4.          Leia sellise tee lõpp mis vastaks juurest S[j..i] -le.
5.          Kui vaja, jätka seda teed tähega S[i+1] veendumaks
            et S[ j .. i+1 ] oleks ka puus

Näide sufiksitrie peal:

Sama näide sufiksipuu peal:

Alternatiivne esitusviis kus lehed on pakitud, on ka efektiivne:


Tagasi

Sufiksipuu rakendusi

Vt. Dan Gusfieldi raamatut!

APL1: Exact String Matching
Otsi stringi P sufiksipuust O(|P|) ajaga

APL2: Exact set matching

APL3: substring problem for a database of patterns
Olgu antud stringide hulk S=S1, ... , Sn (Andmebaas tekstidega) Otsi stringi P kõikidest nendest tekstidest. Tehtav üldistatud sufiksipuust mis sisaldab iga teksti kõiki sufikseid "ülestikku". Päring võtab ikka O(|P|) aja. Indekseerimine aga S kogupikkus (st. andmebaasi suuruse suhtes lineaarse aja)

APL4: Longest common substring of two strings
Leie kahe stringi S ja T pikim ühine osasõne. Potentsiaalselt on neid ju n2 tükki kus n on lühema stringi pikkus. Donald Knuth esitas kunagi oma hüpoteesi, et see ei ole lahendatav lineaarse ajaga kahe stringi pikkuse summa suhtes. On aga selge, et sufiksipuid kasutades on see lineaarse ajaga teostatav - konstrueeri sufiksipuu S ja T tarbeks korraga. Käi see puu läbi j väljasta sügavaima tipuni viivate kaarte pikkus kus tipus on veel nii S kui ka T alamstringid.

APL5: Recognizing DNA contamination
Sekveneerimisel võib sattuda sisse vale DNA (näiteks bakteritest mida kasutatakse DNA ettevalmistamiseks), siis saab andmebaasist leida need jupid mis on selgelt teisest organismist.

APL6:Common substrings of more than two strings
See on APL4 üldistus, teostatav samuti kõikide sringide ühispikkuse suhtes lineaarse ajaga.

APL7: Building a smaller directed graph for exact matching
Sufiksipuu on paljude alampuude osas identne, need saab esitada vaid ühekordselty ning teha niimodoi graafi kus pole dubleeritud alampuid. Nii saab küll otsida kuid ei tea täpset asukohta kui ei pea arvet kus positsioonidest algasid vastavad sufiksid.

APL8: A reverse role for suffix trees, and major space reduction

APL10: All-pairs suffix-prefix matching
Kõik kÕigi vastu...

APL11: Finding all repetitive structures in molecular strings

APL12: Circular string linearization

APL13: Suffix arrays - more space reduction

APL14: Suffix trees in genome-scale projects

APL15: A Boyer-Moore approach to exact set matching

APL16: Ziv-Lempel data compression

APL17: Minimum length encoding of DNA

Additional applications
Mostly exercises...

Extra feature: CONSTANT time lowest common ancestor retrieval (LCA)
Andmestruktuur mis võimaldab leida konstantse ajaga alumist ühist vanemat (see vastab pikimale ühisele prefixile!) on võimalik koostada lineaarse ajaga.

APL: Longest common extension: a bridge to inexact matching

APL: Finding all maximal palindromes in linear time
Palindroom on keksmisest positsioonist edasi kui ka tagasi pikim ühine prefiks. (palindroomi eest taha ja tagant ette lugedes on ikka üks ja sama: kirik, saippuakivikauppias.

Tehes sufiksipuu edasi-tagasi suunas (aabcbad => aabcbad#dabcbaa ) ja kasutades LCA konstruktsiooni saab küsida positsioonidest 4 ja (2n-4) algavat pikimat ühist prefiksit konstantse ajaga. Ehk, kogu ülesanne lahendatav O(n) ajaga.

APL: Exact matching with wild cards

APL: The k-mismatch problem

Approximate palindromes and repeats

Faster methods for tandem repeats

A linear-time solution to the multiple common substring problem

And many-many more ...

Tagasi

Sufiksitabel

    1  2  3  4  5  6  7  8  9  10 11
T=  m  i  s  s  i  s  s  i  p  p  i

T11 = i
T8  = ippi
T5  = issippi
T2  = ississippi
T1  = mississippi
T10 = pi
T9  = ppi
T7  = sippi
T4  = sissippi
T6  = ssippi
T3  = ssissippi

Suffix array:  11 8 5 2 1 10 9 7 4 6 3

Sufiksitabel: TATTATTAA

   123456789
S= TATTATTAA$

SA= 8 5 2 9 7 4 1 6 3

Kahendotsimine sufikistabelist

Algoritm: Otsimine sufiksitabelist 
Input: Tekst S, |S|=n, sufiskitabel SA, otsitav sõne P, |P|=m
Output: P esinemiste algpositsioonid S-is

I: Otsi P vasakpoolsed esinemised

1. L=1; R=n
2. while R-L > 0
3.    M = (L+R)/2
4.    if   P ≤m S[ SA[M] ] then R = M
5.    else L = M
6. 

II: Otsi P parempoolsed esinemised (analoogselt)

III: Kui LP ≤ RP väljasta algospositsioonid 
     SA[LP] .. SA[RP]

Sufiks sort: (kohalik). Sorts the n suffixes of an n-item string in time n log n. (Not as easy as it might seem, since n log n string comparisons take O(n^2 log n) time. ANSI C.


Tagasi

Teised lahendused

  1. Hübriidsüsteemid

Tagasi

Rakendusi - Oxford English Disctionary


Tagasi

Teised lahendused


Tagasi

Teised lahendused


Tagasi
EOF