From: Martin Mares Date: Mon, 16 Jan 2012 16:48:25 +0000 (+0100) Subject: KMP: Cviceni X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=bbb1b6d72650e56d7056ddaa4b4afe7d69eedeb5;p=ads2.git KMP: Cviceni --- diff --git a/1-kmp/1-kmp.tex b/1-kmp/1-kmp.tex index b18ed19..6088f12 100644 --- a/1-kmp/1-kmp.tex +++ b/1-kmp/1-kmp.tex @@ -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