Pređi na sadržaj

Približno poklapanje niske

S Vikipedije, slobodne enciklopedije
Rasplinuta Vikimedija pretraga za "angry emoticon": "Da li ste mislili: andré emotions"

U računarstvu, približno poklapanje niske (često neformalno nazvano rasplinuto poklapanje niske) je tehnika pronalaženja niski koje približno odgovaraju obrascu (umesto tačno). Problem približnog poklapanja niske se uglavnom deli na dva potproblema: pronalaženje poklapanja približne podniske unutar date niske i pronalaženje niski u rečniku koji odgovaraju obrascu približno.

Pregled[uredi | uredi izvor]

Preciznost poklapanja se određuje na osnovu broja primitivnih operacija potrebnih za pretvaranje niske u tačno poklapanje. Ovaj broj se naziva edit rastojanje između niske i obrasca. Uobičajene primitivne operacije su:[1]

  • dodavanje: cotcoat
  • brisanje: coatcot
  • zamena: coatcost

Ove tri operacije mogu biti uopštene kao forma zamene dodavanjem NULL karaktera (ovde prikazanog simbolom *) gde god je karakter obrisan ili ubačen:

  • dodavanje: co*tcoat
  • brisanje: coatco*t
  • zamena: coatcost

Nekada se u približnom poklapanju transpozicija, u kojoj se pozicije dva slova u niski zamene, tretira kao primitivna operacija. Promena cost u cots je primer transpozicije.[2]

Različita približna poklapanja nameću različita ograničenja. Neka poklapanja koriste jednu opštu beztežinsku cenu, tj. ona predstavlja ukupan broj primitivnih operacija potrebnih da za pretvaranje poklapanja u obrazac. Na primer, ako je obrazac coil, foil se dobija jednom zamenom, coils jednim dodavanjem, oil jednim brisanjem, a foal sa dve zamene. Ako se sve operacije računaju kao jedna jedinica cene i ograničenje je postavljeno na jedan, foil, coils, i oil se računaju kao poklapanja, dok foal ne.

Druga poklapanja određuju broj operacija svakog tipa posebno, dok neka postavljaju ukupnu cenu ali dozvoljavaju različite vrednosti da budu dodeljene različitim operacijama. Neka poklapanja dozvoljavaju odvojene dodele ograničenja i vrednosti različitim grupama u obrascu.

Problem formulacije i algoritmi[uredi | uredi izvor]

Jedna moguća definicija približnog poklapanja niske je sledeća: Data je niska obrasca: i niska teksta , pronaći podnisku u T, koji ima najmanje edit rastojanje do obrasca P od svih mogućih podniski u T.

Pristup grubom silom (brute-force pristup) bi bio da se izračuna edit rastojanje do P za sve podniske u T, i onda odabrati podnisku sa najmanjim rastojanjem. Međutim, vremenska složenost ovog algoritma bi bila O(n3 m).

Bolje rešenje, koje je predložio Selers[3], oslanja se na dinamičko programiranje. Ovde se problem drugačije formuliše: za svaku poziciju j u tekstu T i svaku poziciju i u obrascu P, izračunati najmanje edit rastojanje između prvih i karaktera obrasca , i bilo koje podniske iz T koji se završava na poziciji j.

Za svaku poziciju j u tekstu T, i svaku poziciju i u obrascu P, proći kroz sve podniske u T završno sa pozicijom j, i odrediti koja od njih ima najmanje edit rastojanje do prvih i karaktera obrasca P. Zapisati najmanje rastojanje kao E(ij). Nakon izračunavanja E(ij) za sve i i j, možemo lako naći rešenje početnog problema: to je podniska za koju je E(mj) najmanje (gde je m dužina obrasca P).

Izračunavanje E(mj) je veoma slično izračunavanju edit rastojanja između dve niske. U stvari, možemo iskoristiti algoritam za izračunavanje Levenštajnovog rastojanja za izračunavanje E(mj), jedina razlika je da moramo prva dva reda inicijalizovati nulama, i čuvati put izračunavanja, što je, zavisno da li koristimo E(i − 1,j), E(i,j − 1) ili E(i − 1,j − 1) u izračunavanju E(ij).

U nizu koji sadrži vrednosti E(xy) odaberemo najmanju vrednost u poslednjem redu, neka je to E(x2y2), i pratimo put izračunavanja unazad, sve do nultog reda. Ako je polje do kog smo stigli E(0, y1), onda je T[y1 + 1] ... T[y2] podniska od T sa najmanjim edit rastojanjem do obrasca P.

Za izračunavanje niza E(xy) je potrebno O(mn) vremena koristeći algoritam koji primenjuje dinamičko programiranje, dok za deo traženja puta unazad treba O(n + m) vremena.

Onlajn nasuprot oflajn[uredi | uredi izvor]

Tradicionalno, algoritmi za približno poklapanje niske se klasifikuju u dve kategorije: onlajn i oflajn. Sa onlajn algoritmima obrazac se može obraditi pre pretrage, ali tekst ne može. Drugim rečima, onlajn tehnike rade pretragu bez indeksa. Rani algoritmi za onlajn približno poklapanje su predloženi od strane Vagnera i Fišera[4] i Selersa.[5] Oba algoritma su zasnovana na dinamičkom programiranju ali rešavaju različite probleme. Selersov algoritam pretražuje približno za podnisku u tekstu, dok algoritam Vagnera i Fišera izračunava Levenštajnovo rastojanje i odgovara jedino za rasplinutu pretragu rečnika.

Onlajn tehnike pretrage su unapređivane u više navrata. Možda je najpoznatije unapređenje bitap algotiram (takođe poznat kao šift-ili i šift-i algoritam) koji je veoma efikasan za relativno kratke niske obrazaca. Bitap algoritam predstavlja jezgro Juniks programskog alata za pretragu agrep. Pregled algoritama za onlajn pretragu je urađen od strane G. Navara.[6]

Iako postoje veoma brze onlajn tehnike, njihov učinak na velikim količinama podataka je neprihvatljiv. Pretprocesiranje teksta ili indeksiranje čini pretragu drastično bržom. Danas postoji veliki broj algoritama za indeksiranje. Među njima su sufiksna stabla[7], metrička stabla[8] i n-gram metode.[9][10] Detaljan pregled tehnika indeksiranja koje omogućavaju pronalaženje proizvoljne podniske u tekstu je dao Navaro et al.[11]. Računarski pregled rečničkih metoda (npr. metoda koje omogućavaju pronalaženje svi reči iz rečnika koje približno odgovaraju obrascu pretrage) je dao Bojcov [12].

Primene[uredi | uredi izvor]

Najčešća primena približnih poklapanja do skora je bila u proveri pisanja.[13] Sa dostupnošću velikih količina DNK podataka, veoma važna primena je postala i proveravanje poklapanja sekvenci nukleotida.[14] Približno poklapanje se takođe koristi u filtriranju nepoželjne imejl pošte.[15] Poklapanje niski se ne može koristiti za većinu binarnih podataka, kao što su slike i muzika. Oni zahtevaju drugačije algoritme, kao što je akustični otisak.

Vidi još[uredi | uredi izvor]

Reference[uredi | uredi izvor]

Spoljašnje veze[uredi | uredi izvor]