2D1458, Prolemlösning oh progrmmering under press Föreläsning 3: Strängmthning Dtum: 2006-09-18 Srienter: Miel Elisson, Joim Erisson oh Mts Linnder Föreläsre: Miel Goldmnn Denn föreläsning ehndlr prolemet strängmthning. Den niv nstsen, ändlig utomter oh Knuth Morris Prtts lgoritm gås genom oh ortre översiter v någr metoder för mthning v fler mönster i smm text ges. 1 Strängmthning niv lgoritm Prolemet är tt givet en text T [1...n] oh ett mönster P [1...m] hitt ll föreomster v P som delsträng till T. Den niv lgoritmen undersöer ll positioner i texten melln 1 oh n m för tt se om mönstret örjr där. När en position är undersöt så sifts mönstret ett steg åt höger i T. Tidsomplexiteten för lgoritmen som n ses nedn är Θ(mn). Algoritm 1: Strängmthning - niv lgoritm Input: Text T [1...n], mönsterp [1...m]. Output: Positioner i T där P örjr. String mthing(t [1...n], P [1...m]) (1) for j 1 to n m (2) for i 1 to m (3) if P [i] T [i + j 1] then re (4) if i m then OUTPUT j 2 Strängmthning ändlig utomt En ändlig utomt för strängmthning är en ritd grf, vrs noder oh nter lls tillstånd respetive övergångr. Vrje övergång i utomten är märt med ett eller fler teen ur lfetet Σ. Automten hr ett strttillstånd oh minst ett epternde tillstånd. Strängmthning utförs genom tt vndr i utomten, med örjn i strttillståndet, tills det epternde tillståndet nås. I vrje tillstånd väljs näst tillstånd genom tt t ett nytt teen x ur T oh sedn låt den övergång som är märt x nge näst tillstånd. Betrt följnde utomt som söer efter mönstret P = : 1
2 2D1458 Popup HT 2006, 0 1,, 2 3, 4 5 6 7,,,, Mn efinner sig i tillstånd q om de senste q läst tenen i T mthr de först q tenen i P. Som synes n endst en föreomst v led till ett epternde tillstånd. Prolem uppstår do t ex om T =, tyefterde först fem tenen hmnr vi i strttillståndet oh missr därför föreomsten v P med örjn i teen 2 i T. Lösningen på dett är tt lägg till övergångr enligt följnde figur:, 0 1 2 3 4 5 6 7,, Automten hmnr nu i det epternde tillståndet preis om P föreommer i T. Eftersom vrje teen i T undersös en end gång oh övergångrn n görs i onstnt tid så lir tidsåtgången Θ(n). För tt gör övergångr i onstnt tid n vi nvänd en övergångsmtris δ[q, x] =näst tillstånd, där q är nuvrnde tillstånd oh x är indtteen. Prolem uppstår vid stor lfeten, t ex uniode, då mtrisen n li orimligt stor oh tidsrävnde tt onstruer. 3 Strängmthning Knuth Morris Prtt Prolemet med stor övergångsmtriser n vhjälps med Knuth Morris Prtt lgoritm (KMP). Här nvänder vi oss v en prefixfuntion π[1..m] sådn tt π[q] är längden v det längst prefix v P [1..q 1] som oså är ett suffix v P [1..m].
Strängmthning 3 Algoritm 2: Strängmthning Knuth Morris Prtt Input: Text T [1...n], mönsterp [1...m]. Output: Positioner i T där P örjr. KMP(T [1...n],P[1...m]) (1) π PREKMP(P ) (2) q 0 (3) for i 1 to n (4) while q>0 nd P [q +1] T [i] (5) q π[q] (6) if P [q +1]=T [i] then q q +1 (7) if q = m (8) OUTPUT i m +1 (9) q π[q] Algoritm 3: Prefixfuntionen π tillhörnde KMP Input: P [1...m] Output: π[1...m] så tt π[q] =mx{ <q,p[1...] suffix v P [1...q]} PREKMP(P [1...m]) (1) π[1] 0 (2) for q 2 to m (3) π[q 1] (4) while >0 nd P [ +1] P [q] (5) π[] (6) if P [ +1]=P [q] then π[q] +1 (7) else π[q] 0 Då π n föreräns i tid Θ(m) lir tidsåtgången för KMP Θ(m+n). Eftersom m<nrimligen gäller, så är lgoritmen Θ(n) itid. 4 Översiter v lgoritmer för mthning v fler mönster i smm text Under föreläsningen gvs även ett pr mer övergripnde genomgångr v någr lgoritmer för smtidig mthning v fler mönster i smm text. Upprepd nvändning v lgoritmer som KMP fungerr givetvis men ättre metoder finns tt tillgå. 4.1 Trie En trie är ett söträd som representerr en mängd S v ord över lfetet Σ. Trädets nter är märt med teen ur Σ oh dess noder är märt med 1 eller 0. En nod märt 1 svrr mot tt märningen v ntern, från trädets rot ner till
4 2D1458 Popup HT 2006 den märt noden, ildr ett ord i S. En nod märt 0 etyder tt motsvrnde ord ej finns i S. Betrt följnde trie för S = {p, pelsin, s, gnu, gur}: g p s n u e u r l s i n Vlet v dtstrutur för representtion v trädet eror på om låg minnesåtgång eller sn söningr sll prioriters. Om hstighet är vitigst så n det vr lämpligt tt i vrje nod håll en rry v storle Σ med pere till rnnodern. I vrje nod n då uppslgning v efterommnde nod görs snt, ovsett hur stort lfetet är, så uppslg v ett m teen långt ord går i tid Θ(m). Insättning v ett ord v längd m gåridettfllitidθ(m). Om minnessnålhet prioriters n det vr mer lämpligt med dynmis rryer i nodern. Dett låter oss i vrje nod lgr preis så mång rnreferenser som ehövs, istället för en rnreferens för vrje teen i lfetet. Dess rryer hålls med fördel sorterde för snre uppslg. Sillnden i tidsåtgång (oh minnesåtgång) siljer sig endst från det föregående fllet med en onsnt ftor, så tidsomplexiteten är oförändrd. 4.2 Suffixträd Om vi sll sö efter fler strängr P i i T, så n det lön sig tt först onstruer ett suffixträd över T oh sedn för vrje P i sö i suffixträdet. Själv suffixträdet är helt enelt en trie innehållndes ll suffix till T.OmP i är en delsträng till T så måste P i vr prefix till något v T s suffix oh n därför i tid Θ(m) slås upp i suffixträdet. Själv onstrutionen görs nivt i tid Θ(n 2 ) men n görs i tid Θ(n) (se littertur för detljer). 4.3 Suffixrry Ett lterntiv till tt onstruer suffixträd är tt nvänd en suffixrry, vilet är en rry vrs element är ll suffix till T (eller referenser till dess) sorterde i lexiogrfis ordning. På smm sätt som för suffixträdet n föreomster v ett mönster P i T finns genom tt sö efter de element i rryen vrs prefix är P. Söningen n görs genom inärsöning i tid O(m log n) där m oh n är mönstret respetive textens storle. Suffixrryen n onstruers i tid Θ(n), texgenom tt först ygg ett suffixträd oh sedn sö genom dett i lexiogrfis ordning. I
Strängmthning 5 prtien är det oft, lnd nnt på grund v hög onstntftorer, ättre tt nvänd ndr metoder. Den niv nstsen vore tt sorter suffixen med en vnlig jämförelseserd lgoritm. Eftersom suffixens längd är O(n) lir då tidsomplexiteten O(n 2 log n). Genom tt utnyttj tt vrje suffix till ett suffix föreommer som prefix till något nnt suffix, n vi reltivt enelt förättr den niv nstsen. Låt gå från 0 till log n oh sorter i vrje steg suffixen med vseende på de först 2 tenen. I den först itertionen inspeterr vi vrje suffix först teen oh sorterr efter dess. I efterföljnde itertioner utnyttjr vi tt den först hälften v de 2 tenen som sll ses till redn är i ordning oh tt de återstående 2 1 tenen är prefix till något nnt suffix oh som sådnt hr ordnts i föregående itertion. Sorteringssteget n reduers till ett onstnt ntl jämförelser för vrje suffixpr oh n lltså görs i tid O(n log n). Sorteringen utförs i ll de log n itertionern, så tidsomplexiteten lir O(n(log n) 2 ). 4.4 Aho Corsi Aho Corsis lgoritm är en generlisering v KMP som söer efter föreomster v fler strängr P i smtidigt. Algoritmen onstruerr en trie innehållndes P i, lägger till ett ntl återlänr oh ehndlr söträdet som en ändlig utomt med strttillstånd i roten oh epternde tillstånd i de noder som är märt 1. Följnde figur illustrerr hur en sådn utomt, med en mjoritet v övergångrn orttgn, sulle unn se ut för P i {v,rm,r,rmod,r}. 0 2 1 8 r v v 7 9 m r 6 3 o 4 d 5 10 I prtien nvänder Aho Corsis lgoritm, lisom KMP, inte den ändlig utomten diret, utn onstruerr istället en generlisering v KMP:s prefixfuntion. ÿ