Sufiksni niz

S Vikipedije, slobodne enciklopedije

U informatici, sufiksni niz je sortirani niz svih sufiksa niske. To je jednostavna, ali moćna struktura podataka koja se koristi, između ostalog, u tekstu punom indeksa, pri kompresiji podataka i algoritmima iz oblasti bioinformatike.[1] Sufiksni nizovi su uvedeni od strane Manbera i Majersa (1990) kao jednostavna i po prostoru efikasna alternativa sufiksnih stabala. Ona su nezavisno otkrivena od strane Gonet, Baeza-Iates, Snajder (1992) pod imenom PAT niz.

Definicija[uredi | uredi izvor]

Neka je niska i neka označava podnisku od u rasponu od do .

Sufiksni niz od je sada definisan da bude niz celih brojeva koji pružaju početne pozicije nastavaka od u leksikografskom poretku. To znači da, unos sadrži početnu poziciju -tog najmanjeg sufiksa u i tako za sve : .

Primer[uredi | uredi izvor]

Nisku ćemo indeksirati kao:

i 1 2 3 4 5 6 7
S[i] b a n a n a $

Tekst se završava sa posebnim terminirajućim slovom $ koji je jedinstven i leksikografski manji od bilo kog drugog karaktera. Tekst ima sledeće sufikse:

Suffix i
banana$ 1
anana$ 2
nana$ 3
ana$ 4
na$ 5
a$ 6
$ 7

Ove sufikse sortiramo:

Suffix i
$ 7
a$ 6
ana$ 4
anana$ 2
banana$ 1
na$ 5
nana$ 3

Sufiksni niz sadrži startne pozicije ovih sortiranih sufiksa:

i 1 2 3 4 5 6 7
A[i] 7 6 4 2 1 5 3

Kompletan niz sa sufiksima:

1 $ a a a b n n
2 $ n n a a a
3 a a n $ n
4 $ n a a
5 a n $
6 $ a
7 $

Tako na primer, sadrži vrednost , i stoga odnosi se na sufiks koji počinje na poziciji u , što je sufiks .

Prebacivanje u sufiksna stabla[uredi | uredi izvor]

Sufiksni nizovi su tesno povezani sa sufiksnim stablima:

  • Sufiksni nizovi mogu biti konstruisani prolaskom po dubini DFS kroz sufiksno stablo. Sufiksni niz odgovara obeležjima listova koji se dobiju u redosledu kojim su oni posećeni tokom prolaza, ako su rubovi posećeni u leksikografskim redosledu njihovog prvog karaktera.
  • Sufiksno stablo može biti izgrađeno u linearnom vremenu korišćenjem kombinacije sufiksa i LCP niza.

Pokazano je da se svaki algoritam za sufiksna stabla može sistematski zameniti sa algoritmom koji koristi sufiksni niz unapređen sa dodatnim informacijama (kao što je LCP niz) i rešava isti problem za istu vremensku složenost. [2] Prednosti sufiksnih nizova u odnosu na sufiksna stabla obuhvataju poboljšanje prostorne složenosti, jednostavnija izgradnja algoritma u linearnom vremenu (npr. u odnosu na Ukonenov algoritam) i poboljšanje lokalizacije keša.[1]

Prostorna efikasnost[uredi | uredi izvor]

Sufiksni nizovi su uvedeni od strane Manbera i Majersa (1990) u cilju poboljšanja prostornih zahteva sufiksnih stabala: Sufiksni nizovi smeštaju celih brojeva. Pod pretpostavkom da ceo broj zahteva 4 bajta, sufiksni niz zahteva bajtova ukupno. To je znatno manje od bajtova koji se zahtevaju pažljivom implementacijom sufiksnog stabla. [3] Međutim, u pojedinim aplikacijama, prostorni zahtevi sufiksnih nizova i dalje mogu biti previsoki. Analizirano u bitovima, sufiksni niz zahteva prostora, dok originalni tekst preko azbuke veličine zahteva samo bitova. Za ljudski genom sa i sufiksni niz bi stoga zauzimao oko 16 puta više memorije nego sam genom.

Algoritmi za konstrukciju[uredi | uredi izvor]

Naivan pristup za izgradnju sufiksnog niza je da se koristi neki od algoritama sortiranja zasnovanih na poređenju. Ovi algoritmi zahtevaju poređenja sufiksa, ali poređenje sufiksa radi u vremenu, tako da je ukupno vreme izvršavanja putem ovog pristupa je .

Napredniji algoritmi koriste činjenicu da sufiksi koji treba da budu sortirani nisu proizvoljne niske, ali su međusobno povezani. Ovi algoritmi nastoje da postignu sledeće ciljeve: [4]

  • minimalna asimptotska složenost
  • lagan u prostoru, što znači malo ili nimalo radne memorije pored teksta i koliko je potrebno samom sufiksnom nizu
  • brz u praksi

Jedan od prvih algoritama za postizanje svih ciljeva je SA-IS algoritam autora Nong, Žang, Can (2009). Algoritam je takođe prilično jednostavan (< 100 linija koda) i može se povećati da istovremeno izgradi i LCP niz. [5] SA-IS algoritam je jedan od najbržih poznatih algoritama za izgradnju sufiksnog niza. Pažljiva implementacija od Juta Mori Arhivirano na sajtu Wayback Machine (26. jul 2014) nadmašuje većinu drugih linearnih ili super-linearnih pristupa izgradnje.

Pored vremenskih i prostornih zahteva, algoritmi za izgradnju sufiksnog niza se takođe razlikuju po azbuci koju podržavaju: konstanta azbuka gde je veličina azbuke vezana stalnom, celobrojnom azbukom gde su karakteri celi brojevi u opsegu u zavisnosti od i opšte azbuke gde su dozvoljena samo poređenja karaktera.[6]

Većina algoritama za izgradnju sufiksnog niza su zasnovani na jednom od sledećih pristupa:[4]

  • Algoritmi sa dupliranjem prefiksa su zasnovani na strategiji Karp, Miller & Rosenberg 1972. Ideja je da se pronađu prefiksi koji poštuju leksikografski redosled sufiksa. Procenjuje se dužina dupliranog prefiksa u svakoj iteraciji algoritma dok je prefiks jedinstven i pruža rang pridruženog sufiksa.
  • Rekurzivni algoritmi prate pristup algoritama za izgradnju sufiksnih stabala po Farach 1997 za rekurzivno sortiranje podskupa sufiksa. Ovaj podskup se onda koristi za zaključivanje sufiksnog niza preostalih sufiksa. Oba od ovih sufiksnih nizova se onda spajaju i čine konačni sufiksni niz.
  • Algoritmi za indukovano kopiranje su slični rekurzivnim algoritmima u smislu da oni koriste već sortirani podskup da podstaknu brzo sortiranje preostalih sufiksa. Razlika je u tome što ovi algoritmi favorizuju iteraciju iznad rekurzije za sortiranje izabranih podskupova sufiksa. Istraživanje ovih raznolikih grupa algoritama je objavljeno od strane Puglisi, Smyth & Turpin 2007.

Poznat rekurzivni algoritam za celobrojne azbuke je DC3 / izobličenje algoritam Kärkkäinen & Sanders 2003. On radi u linearnom vremenu i uspešno se koristi kao osnova za paralelne i algoritme za izgradnju sufiksnog niza sa eksternom memorijom.

Najnoviji rad Salson et al. 2009 predlaže algoritam za ažuriranje sufiksnog niza teksta koji je izmenjen umesto ponovne izgradnje novog sufiksnog niza od nule. Čak i ako je teoretski u najgorem slučaju vremenska kompleksnost , čini se da se dobro pokazuju u praksi: eksperimentalni rezultati autora pokazali su da je njihova implementacija dinamičkih sufiksnih nizova generalno efikasnija od ponovne izgradnje kada se ubacuje razuman broj slova u originalni tekst.

Aplikacije[uredi | uredi izvor]

Sufiksni niz niske može da se koristi kao indeks da brzo locirate svaku pojavu podniske obrasca u nisci . Pronalaženje svakog pojavljivanja uzorka je ekvivalentno pronalaženju svakog sufiksa koji počinje sa podniskom. Zahvaljujući leksikografskim poretku, ovi sufiksi će biti grupisani zajedno u sufiksnom nizu i mogu se naći efikasno sa dve binarne pretrage. Prva pretraga locira početnu poziciju intervala, a druga određuje krajnju poziciju:

    def search(P):
        l = 0; r = n
        while l < r:
            mid = (l+r) / 2
            if P > suffixAt(A[mid]):
                l = mid + 1
            else:
                r = mid
        s = l; r = n
        while l < r:
            mid = (l+r) / 2
            if P < suffixAt(A[mid]):
                r = mid
            else:
                l = mid + 1
        return (s, r)

Pronalaženje podniske obrasca dužine u nisci dužine uzima vremena, s obzirom da za jedno poređenje sufiksa treba da uporedite znakova. Manber & Myers 1990 opisuju kako se ova granica može poboljšati do vremena koristeći informacije iz LCP niza. Ideja je da poređenje obrasca ne mora ponovo da uporedi određene znakove, kada je već poznato da su deo najdužeg zajedničkog prefiksa za uzorak i trenutni interval pretrage. Abouelhoda, Kurtz & Ohlebusch 2004 su poboljšali granicu još dalje i postigli vreme potrage za kao što je poznato iz sufiksnih stabala.

Algoritmi za sortiranje sufiksa mogu da se koriste za računanje Barouz-Viler transformacije (BVT). BVT zahteva sortiranje svih cikličnih permutacija niza. Ako se ova niska završava sa posebnim terminirajućim karakterima koji su leksikografski manji od svih drugih karaktera (tj., $), onda poredak sortirane rotirane matrice BVT odgovara redosledu sufiksa u sufiksnom nizu. BVT se stoga može izračunati u linearnom vremenu, prvo izgradnjom sufiksnog niza teksta i zatim zaključenjem BVT niske: .

Sufiksni nizovi se takođe mogu koristiti za traženje podniske u mašinskom prevodu zasnovanom na primerima, zahtevajući mnogo manje prostora nego puna tabela fraza koja se koristi u statističkom mašinskom prevođenju. Mnoge dodatne aplikacije sufiksnog niza zahtevaju LCP niz .

Reference[uredi | uredi izvor]

Literatura[uredi | uredi izvor]

Spoljašnje veze[uredi | uredi izvor]