]> mj.ucw.cz Git - ads2.git/commitdiff
KMP: Cviceni
authorMartin Mares <mj@ucw.cz>
Mon, 16 Jan 2012 16:48:25 +0000 (17:48 +0100)
committerMartin Mares <mj@ucw.cz>
Mon, 16 Jan 2012 16:48:25 +0000 (17:48 +0100)
1-kmp/1-kmp.tex

index b18ed19f229083886e99ce96c8ad9d092e2954ec..6088f12ebd619a7cdd1216de40ce35b420fa42ef 100644 (file)
@@ -470,9 +470,86 @@ algoritmus pob
 
 \exercises
 
+\ex{Naivní algoritmus, který zkou¹í v¹echny mo¾né zaèátky jehly v~senì a v¾dy
+porovnává øetìzce, má èasovou slo¾itost $\O(JS)$. Mù¾e být opravdu tak pomalý,
+uvá¾íme-li, ¾e porovnávání øetìzcù skonèí, jakmile najde první neshodu? Sestrojte
+vstup, na kterém algoritmus pobì¾í $\Theta(JS)$ krokù, pøesto¾e nic nenajde.}
+
+\ex{Naleznìte pøíklad jehel a sena, v~nìm¾ se nachází superlineární poèet
+výskytù vzhledem k~celkové velikosti vstupu (souèet velikostí jehel a délky
+sena).}
+
+\ex{Uva¾ujme zjednodu¹ený algoritmus AC, který nepou¾ívá zkratkové hrany
+a v¾dy projde po zpìtných hranách a¾ do koøene. Uka¾te pøíklad vstupu,
+na~kterém je tento algoritmus asymptoticky pomalej¹í.}
+
+\ex{Oznaème $M(S)$ mno¾inu øetìzcù, jejich¾ výskyty algoritmus AC ohlásí
+ve~stavu~$S$. Uka¾te, ¾e kdybychom si mìli v¹echny mno¾iny $M(S)$ pamatovat
+explicitnì, budeme pro nìkteré vstupy potøebovat superlineární mno¾ství
+prostoru vzhledem k~velikosti vstupu, tak¾e automat nepùjde sestrojit
+v~lineárním èase.}
+
+\ex{Rozmyslete si, ¾e mno¾iny $M(S)$ z~pøedchozího pøíkladu by bylo mo¾né
+reprezentovat jako srùstající spojové seznamy -- tedy takové, kde si ka¾dý
+prvek pamatuje ukazatel na svého následníka, který ov¹em mù¾e le¾et v~jiném
+seznamu. Uka¾te, ¾e námi zavedené zkratkové hrany lze interpretovat jako
+v~takových seznamech.}
+
 \ex{Rozmyslete si, jak algoritmy z~této kapitoly upravit, aby si poradily
 s~velkými abecedami.}
 
+\ex{Upravte algoritmus AC, aby pro ka¾dou pozici v~senì vypsal nejdel¹í
+tam konèící jehlu, a~to efektivnìji ne¾ vyjmenováním v¹ech jehel. Jak se
+algoritmus zmìní, budeme-li chtít vypsat nejdel¹í jehlu, která na dané
+pozici zaèíná?}
+
+\ex{Mìjme seno a jehly. Popi¹te algoritmus, který v~lineárním èase pro ka¾dou
+jehlu spoèítá, kolikrát se v~senì vyskytuje. Èasová slo¾itost by nemìla záviset
+na poètu výskytù -- ten, jak u¾ víme, mù¾e být superlineární.}
+
+\ex{Cenzor dostane mno¾inu zakázaných podøetìzcù a text. V¾dy najde nejlevìj¹í
+výskyt zakázaného podøetìzce v~textu (s~nejlevìj¹ím koncem; pokud jich je více,
+tak nejdel¹í takový), vystøihne ho a postup opakuje. Uka¾te, jak text cenzurovat
+v~lineárním èase.}
+
+\ex{Rotací øetìzce~$\alpha$ o~$K$ pozic nazýváme øetìzec $\alpha[K:{}]\alpha[{}:K]$.
+Jak o~dvou øetìzcích zjistit, zda je jeden rotací druhého?}
+
+\ex{Jak v~lineárním èase zrotovat øetìzec, dostaèuje-li pamì» poèítaèe jen
+na ulo¾ení jedhoho øetìzce a $\O(1)$ pomocných promìnných?}
+
+\ex{Navrhnìte algoritmus, který v~lineárním èase nalezne tu z~rotací zadaného
+øetìzce, je¾ je lexikograficky minimální.}
+
+\ex{Navrhnìte datovou strukturu pro básníky, která si bude pamatovat slovník
+a bude umìt hledat rýmy. Tedy pro libovolné zadané slovo najde takové slovo
+ve~slovníku, které má se zadaným nejdel¹í spoleèný suffix.}
+
+\exx{Upravte datovou strukturu z~pøedchozího cvièení, aby je-li nejlep¹ích rýmù
+více, vypsala lexikograficky nejmen¹í z~nich.}
+
+\ex{Jak reprezentovat slovník, abyste umìli rychle vyhledávat v¹echny
+pøesmyèky zadaného slova?}
+
+\exx{Je dán text a èíslo~$K$. Jak zjistit, který podøetìzec délky~$K$
+se v~textu vyskytuje nejèastìji?}
+
+\exx{Sestrojte co nejefektivnìj¹í algoritmus, který v~daném øetìzci najde
+nejdel¹í podøetìzec, který se vyskytuje vícekrát.}
+
+\exx{Uka¾te, jak pro dané dva øetìzce najít jejich nejdel¹í spoleèný
+podøetìzec.}
+
+\ex{Definujme Fibonacciho slova takto: $F_0=|a|$, $F_1=|b|$, $F_{n+2}=F_nF_{n+1}$.
+Jak pro zadaný øetìzec nad abecedou $\{|a|,|b|\}$ najít nejdel¹í Fibonacciho podslovo?
+}
+
+\exx{Pokraèujme v~pøedchozím cvièení. Dostaneme-li øetìzec nad nìjakou obecnou abecedou,
+jak nalézt jeho nejdel¹í podøetìzec, který je isomorfní s~nìjakým Fibonacciho slovem
+(li¹í se pouze substitucí jiných znakù za |a| a~|b|)?}
+
+\ex{Je dáno slovo. Chceme nalézt jeho nejdel¹í prefix, který je souèasnì suffixem.}
+
 \endexercises
 
 \bye