1. Dynamické programování
|
|
- Matyáš Vlček
- před 6 lety
- Počet zobrazení:
Transkript
1 . Dynamické programování V této kapitole prozkoumáme ještě jednu techniku návrhu algoritmů, která je založená na rekurzivním rozkladu problému na podproblémy. V tom je podobná metodě Rozděl a panuj, ovšem umí využít toho, že se podproblémy během rekurze opakují. Proto v mnoha případech vede na mnohem rychlejší algoritmy. Říká se jí poněkud tajemně dynamické programování... Fibonacciho èísla podruhé Princip dynamického programování si nejprve vyzkoušíme na triviálním příkladu. Budeme počítat Fibonacciho čísla, se kterými jsme se už potkali v úvodní kapitole. Začneme přímočarým rekurzivním algoritmem na výpočet n-tého Fibonacciho čísla F n, který postupuje přesně podle definice F n = F n + F n. Algoritmus Fib(n). Pokud n, vrátíme n.. Jinak vrátíme Fib(n ) + Fib(n ). Zkusme zjistit, jakou časovou složitost tento algoritmus má. Sledujme strom rekurze na následujícím obrázku. V jeho kořeni počítáme F n, v listech F 0 a F, vnitřní vrcholy odpovídají výpočtům čísel F k pro k < n. F F F 0 F 0 F F 4 F F 0 F 0 5 F 5 F F 0 F 0 F F Obr..: Rekurzivní výpočet Fibonacciho čísel Legenda říká, že s tímto názvem přišel Richard Bellman, když v 50. letech pracoval v americkém armádním výzkumu a potřeboval nadřízeným vysvětlit, čím se vlastně zabývá. Programováním se tehdy mínilo zejména plánování (třeba postupu výroby) a Bellman zkoumal vícekrokové plánování, v němž optimální volba každého kroku záleží na předchozích krocích proto dynamické
2 Libovolný vnitřní vrchol přitom vrací součet hodnot ze svých synů. Pokud tento argument zopakujeme, dostaneme, že hodnota vnitřního vrcholu je rovna součtu hodnot všech listů ležících pod ním. Speciálně tedy F n v kořeni musí být rovno součtu všech listů. Z každého listu přitom vracíme buďto 0 nebo, takže abychom nasčítali F n, musí se ve stromu celkově nacházet alespoň F n listů. Z cvičení?? víme, že F n.68 n, takže strom rekurze má přinejmenším exponenciálně mnoho listů a celý algoritmus se plouží exponenciálně pomalu. Nyní si všimněme, že funkci Fib voláme pouze pro argumenty z rozsahu 0 až n. Jediné možné vysvětlení exponenciální časové složitosti tedy je, že si necháváme mnohokrát spočítat totéž. To je vidět i na obrázku: F vyhodnocujeme dvakrát a F dokonce čtyřikrát. Zkusme tomu zabránit. Pořídíme si tabulku T a budeme do ní vyplňovat, která Fibonacciho čísla jsme už spočítali a jak vyšly jejich hodnoty. Při každém volání rekurzivní funkce se pak podíváme do tabulky. Pokud již výsledek známe, rovnou ho vrátíme; v opačném případě ho poctivě spočítáme a hned uložíme do tabulky. Upravený algoritmus bude vypadat následovně. Algoritmus Fib(n). Je-li T [n] definováno, vrátíme T [n].. Pokud n, položíme T [n] n.. Jinak položíme T [n] Fib(n ) + Fib(n ). 4. Vrátíme T [n]. Jak se změnila časová složitost? K rekurzi nyní dojde jedině tehdy, vyplňujeme- -li políčko tabulky, v němž dosud nic nebylo. To se může stát nejvýše (n + )-krát, z toho dvakrát triviálně (pro F 0 a F ), takže strom rekurze má nejvýše n vnitřních vrcholů. Pod každým z nich leží nejvýše listy, takže celkově má strom nanejvýš n vrcholů. V každém z nich trávíme konstantní čas, celkově běží funkce Fib v čase O(n). Ve stromu rekurze jsme tedy prořezali opakující se větve, až zbylo O(n) vrcholů. Jak to dopadne pro F 5, vidíme na obrázku.. Nakonec si uvědomíme, že tabulku mezivýsledků T nemusíme vyplňovat rekurzivně. Jelikož k výpočtu T [k] potřebujeme pouze T [k ] a T [k ], stačí ji plnit v pořadí T [0], T [], T [],... a vždy budeme mít k dispozici všechny hodnoty, které v daném okamžiku potřebujeme. Dostaneme následující nerekurzivní algoritmus. Algoritmus Fib(n). T [0] 0, T []. Pro k =,..., n:. T [k] T [k ] + T [k ] 4. Vrátíme T [n]. Funkci Fib jsme pochopitelně mohli vymyslet přímo, bez úvah o rekurzi. Postup, který jsme si předvedli, ovšem funguje i v méně přímočarých případech. Zkusme proto shrnout, co jsme udělali
3 5 F F F 0 F 0 F F 4 F F 5 F Obr..: Prořezaný strom rekurze po zavedení tabulky Princip dynamického programování: Cvičení Začneme s rekurzivním algoritmem, který je exponenciálně pomalý. Odhalíme opakované výpočty stejných podproblémů. Pořídíme si tabulku a budeme si v ní pamatovat, které podproblémy jsme už vyřešili. Tím prořežeme strom rekurze a vznikne rychlejší algoritmus. Tomuto přístupu se často říká kešování a tabulce keš (anglicky cache). Uvědomíme si, že keš lze vyplňovat bez rekurze, zvolíme-li vhodné pořadí podproblémů. Tím získáme stejně rychlý, ale jednodušší algoritmus.. Spočítejte, kolik přesně vrcholů má strom rekurze funkce Fib a dokažte, že časová složitost této funkce činí Θ(τ n ), kde τ = ( + 5)/ je zlatý řez... Vybrané podposloupnosti Metodu dynamického programování nyní předvedeme na méně triviálním příkladu. Dostaneme posloupnost x,..., x n celých čísel a chceme z ní škrtnout co nejméně prvků tak, aby zbývající prvky tvořily rostoucí posloupnost. Jinak řečeno, chceme najít nejdelší rostoucí podposloupnost (NRP). Tu můžeme formálně popsat Cache v angličtině znamená obecně skrýš, třeba tu, kam si veverka schovává oříšky. V informatice se tak říká různým druhům paměti na často používaná data. Je-li řeč o zrychlování rekurze, používá se též poněkud krkolomný termín memoizace memo je zkrácenina z latinského memorandum a dnes značí libovolnou poznámku
4 jako co nejdelší posloupnost indexů i,..., i k takovou, že i <... < i k n a x i <... < x ik. Například v následující posloupnosti je jedna z NRP vyznačena tučně. Rekurzivní řešení i x i Nabízí se použít hladový algoritmus: začneme prvním prvkem posloupnosti a pokaždé budeme přidávat nejbližší další prvek, který je větší. Pro naši ukázkovou posloupnost bychom tedy začali, 4, 5, 9 a dál bychom už nemohli přidat žádný další prvek. Optimální řešení je ale delší. Problém byl v tom, že jsme z možných pokračování podposloupnosti (tedy čísel větších než poslední přidané a ležících napravo od něj) zvolili hladově to nejbližší. Pokud místo toho budeme zkoušet všechna možná pokračování, dostaneme rekurzivní algoritmus, který bude korektní, byť pomalý. Jeho jádrem bude rekurzivní funkce Nrp(i). Ta pro dané i spočítá maximální délku rostoucí podposloupnosti začínající prvkem x i. Udělá to tak, že vyzkouší všechna x j navazující na x i (tedy j > i a x j > x i ) a pro každé z nich se zavolá rekurzivně. Z možných pokračování si pak vybere to, které dá celkově nejlepší výsledek. Algoritmus Nrp(i) (nejdelší rostoucí podposloupnost rekurzivně) Vstup: Posloupnost x i,..., x n. d. Pro j = i +,..., n:. Je-li x j > x i : 4. d max(d, + Nrp(j)) Výstup: Délka d nejdelší rostoucí podposloupnosti v x i,..., x n Všimněme si, že rekurze se přirozeně zastaví pro i = n: tehdy totiž cyklus neproběhne ani jednou a funkce se ihned vrátí s výsledkem. Řešení původní úlohy získáme tak, že zavoláme Nrp(i) postupně pro i =,..., n a vypočteme maximum z výsledků. Probereme tedy všechny možnosti, kterým prvkem může optimální řešení začínat. Elegantnější ovšem je dodefinovat x 0 =. Tím získáme prvek, který se v optimálním řešení zaručeně vyskytuje, takže postačí zavolat Nrp(0). Tento algoritmus je korektní, nicméně má exponenciální časovou složitost: pokud je vstupní posloupnost sama o sobě rostoucí, projdeme během výpočtu úplně všechny podposloupnosti a těch je n. Pro každý prvek si totiž nezávisle na ostatních můžeme vybrat, zda v podposloupnosti leží. Podobně jako u příkladu s Fibonacciho čísly nás zachrání, když si budeme pamatovat, co jsme už spočítali, a nebudeme to počítat znovu. Funkci Nrp totiž
5 můžeme zavolat pouze pro n + různých argumentů. Pokaždé v ní strávíme čas O(n), takže celý algoritmus poběží v příjemném čase O(n ). Iterativní řešení Sledujme dále osvědčený postup. Rekurze se můžeme zbavit a tabulku vyplňovat postupně od největšího i k nejmenšímu. Budeme tedy počítat T [i], což bude délka té nejdelší ze všech rostoucích podposloupností začínajících prvkem x i. Algoritmus Nrp (nejdelší rostoucí podposloupnost iterativně) Vstup: Posloupnost x,..., x n. x 0. Pro i = n, n,..., 0: všechny možné začátky NRP. T [i] 4. P [i] 0 bude se později hodit pro výpis řešení 5. Pro j = i +,..., n: všechna možná pokračování 6. Pokud x i < x j a T [i] < + T [j]: máme lepší řešení 7. T [i] + T [j] 8. P [i] j Výstup: Délka T [0] nejdelší rostoucí podposloupnosti Tento algoritmus běží také v kvadratickém čase. Jeho průběh na naší ukázkové posloupnosti ilustruje následující tabulka. (Všimněte si, že algoritmus našel jiné optimální řešení, než jakého jsme si prve všimli my.) i x i T [i] P [i] Korektnost algoritmu můžeme dokázat zpětnou indukcí podle i. K tomu se nám hodí nahlédnout, že začíná-li optimální řešení pro vstup x i,..., x n dvojicí x i, x j, pak z něj odebráním x i vznikne optimální řešení pro kratší vstup x j,..., x n začínající x j. Kdyby totiž existovalo lepší řešení pro kratší vstup, mohli bychom ho rozšířit o x i a získat lepší řešení pro původní vstup. Této vlastnosti se říká optimální substruktura a už jsme ji potkali například u nejkratších cest v grafech. Zbývá domyslet, jak kromě délky NRP nalézt i posloupnost samu. K tomu nám pomůže, že kdykoliv jsme spočítali T [i], uložili jsme do P [i] index druhého prvku příslušné optimální podposloupnosti (prvním prvkem je vždy x i ). Proto P [0] říká, jaký prvek je v optimálním řešení celé úlohy první, P [P [0]] udává druhý a tak dále. Opět to funguje analogicky s hledáním nejkratší cesty třeba prohledáváním do šířky: tam jsme si pamatovali předchůdce každého vrcholu a pak zpětným průchodem rekonstruovali cestu
6 Grafový pohled Podobnost s hledáním cest v grafech není náhodná celou naši úlohu totiž můžeme přeformulovat do řeči grafů. Sestrojíme orientovaný graf, jehož vrcholy budou prvky x 0,..., x n+, přičemž dodefinujeme x 0 = a x n+ = +. Hrana povede z x i do x j tehdy, mohou-li x i a x j sousedit v rostoucí podposloupnosti, čili pokud i < j a současně x i < x j. (Na obrázku tyto hrany vedou doprava nahoru.) Obr..: Graf reprezentující posloupnost,,, 7, 5, 0, + a jedna z nejdelších cest Každá rostoucí podposloupnost pak odpovídá nějaké cestě v tomto grafu. Chceme proto nalézt nejdelší cestu. Ta bez újmy na obecnosti začíná v x 0 a končí v x n+. Náš graf má Θ(n) vrcholů a O(n ) hran. Navíc je acyklický a a pořadí vrcholů x 0,..., x n+ je topologické. Nejdelší cestu tedy můžeme najít v čase O(n ) indukcí podle topologického uspořádání (podrobněji viz oddíl??). Výsledný algoritmus je přitom náramně podobný našemu Nrp: vnější cyklus prochází pozpátku topologickým pořadím, vnitřní cyklus zkoumá hrany z vrcholu x i a T [i] můžeme interpretovat jako délku nejdelší cesty z x i do x n+. To je poměrně typické: dynamické programování je často ekvivalentní s hledáním cesty ve vhodném grafu. Někdy je jednodušší nalézt tento graf, jindy zase k algoritmu dojít převrácením rekurze. Rychlejší algoritmus Kvadratické řešení je jistě lepší než exponenciální, ale můžeme ho ještě zrychlit. Výběr maxima hrubou silou totiž můžeme nahradit použitím šikovné datové struktury. Ta si bude pro všechna zpracovaná x i pamatovat dvojice (x i, T [i]), přičemž x i slouží jako klíč a T [i] jako hodnota přiřazená tomuto klíči
7 Algoritmus Nrp v každém průchodu vnějšího cyklu uvažuje jedno x i. Výpočet vnitřního cyklu odpovídá tomu, že v datové struktuře hledáme největší z hodnot přiřazených klíčům z intervalu (x i, + ). Následně vložíme novou dvojici s klíčem x i. Jednoduchá modifikace vyvážených vyhledávacích stromů (cvičení??) zvládne obě tyto operace v čase Θ(log n). (Technický detail: Naše klíče se mohou opakovat. Tehdy stačí zapamatovat si největší z hodnot.) Jeden průchod vnějšího cyklu pak zvládneme v čase Θ(log n), takže celý algoritmus poběží v Θ(n log n). Jiný stejně rychlý algoritmus odvodíme ve cvičení 4. Cvičení. Kopcem nazveme podposloupnost, která nejprve roste a pak klesá. Vymyslete algoritmus, který v zadané posloupnosti nalezne nejdelší kopec.. NRP nemusí být jednoznačně určena. Jak spočítat, kolik různých NRP obsahuje zadaná posloupnost?. Pokud existuje více NRP, jakou význačnou vlastnost má ta, kterou najde algoritmus Nrp? 4. Prozkoumejme jiný přístup ke hledání nejdelší rostoucí podposloupnosti. Zadanou posloupnost budeme procházet zleva doprava. Pro již zpracovanou část si budeme udržovat čísla K[i] udávající, jakou nejmenší hodnotou může končit rostoucí podposloupnost délky i. Nahlédněte, že K[i] < K[i + ]. Ukažte, že rozšíříme-li vstup o další prvek x, změní se O() hodnot K[i] a k jejich nalezení stačí nalézt binárním vyhledáváním, kam do posloupnosti K patří x. Z toho získejte algoritmus o složitosti Θ(n log n). 5. Mějme posloupnost n knih. Každá kniha má nějakou šířku s i a výšku v i. Knihy chceme naskládat do knihovny s nějakým počtem polic tak, abychom dodrželi abecední pořadí. Prvních několik knih tedy půjde na první polici, další část na druhou polici, a tak dále. Máme zadanou šířku knihovny S a chceme rozmístit police tak, aby se do nich vešly všechny knihy a celkově byla knihovna co nejnižší. Tloušťku polic a horní a spodní desky přitom zanedbáváme. 6. Podobně jako v předchozím cvičení chceme navrhnout knihovnu, jež pojme dané knihy. Tentokrát ovšem máme zadanou maximální výšku knihovny a chceme najít minimální možnou šířku. Pokud vám to pomůže, předpokládejte, že všechny knihy mají jednotkovou šířku. 7. Dešifrovali jsme tajnou depeši, ale chybí v ní mezery. Známe však slovník všech slov, která se v depeši mohou vyskytnout. Chceme tedy rozdělit depeši na co nejméně slov ze slovníku. 8. Grafový pohled na dynamické programování funguje i pro Fibonacciho čísla. Ukažte, jak pro dané n sestrojit graf na O(n) vrcholech, v němž bude existovat právě F n cest ze startu do cíle. Jak tento graf souvisí se stromem rekurze algoritmu Fib?
8 .. Editaèní vzdálenost Pokud ve slově koule uděláme překlep, vznikne boule, nebo třeba kdoule. Kolik překlepů je potřeba, aby z poutníka vznikl potemník? Podobné otázky vedou ke zkoumání editační vzdálenosti řetězců nebo obecně posloupností. Definice: Editační operací na řetězci nazveme vložení, smazání nebo změnu jednoho znaku. Editační vzdálenost řetězců x = x... x n a y = y... y m udává, kolik nejméně editačních operací je potřeba, abychom z prvního řetězce vytvořili druhý. Budeme ji značit L(x, y). V nejkratší posloupnosti operací se každého znaku týká nejvýše jedna editační operace, takže operace lze vždy uspořádat zleva doprava. Můžeme si tedy představit, že procházíme řetězcem x od začátku do konce a postupně ho přetváříme na řetězec y. Rekurzivní řešení Zkusme rozlišit případy podle toho, jaká operace nastane v optimální posloupnosti na samém začátku řetězce: Pokud x = y, můžeme první znak ponechat beze změny. Tehdy L(x, y) = L(x... x n, y... y m ). Znak x změníme na y. Pak L(x, y) = + L(x... x n, y... y m ). Znak x smažeme. Tehdy L(x, y) = + L(x... x n, y... y m ). Na začátek vložíme y. Tehdy L(x, y) = + L(x... x n, y... y m ). Pokaždé tedy L(x, y) závisí na vzdálenosti nějakých suffixů řetězců x a y. Kdybychom tyto vzdálenosti znali, mohli bychom snadno rozpoznat, která z uvedených čtyř možností nastala byla by to ta, z níž vyjde nejmenší L(x, y). Pokud vzdálenosti suffixů neznáme, vypočítáme je rekurzivně. Zastavíme se v případech, kdy už je jeden z řetězců prázdný tehdy je evidentně vzdálenost rovna délce druhého řetězce. Z toho vychází následující algoritmus. Pro výpočet L(x, y) postačí zavolat Edit(, ). Algoritmus Edit(i, j) (editační vzdálenost řetězců rekurzivně) Vstup: Řetězce x i... x n a y j... y m. Pokud i > n, vrátíme m j +. jeden z řetězců už skončil. Pokud j > m, vrátíme n i +.. l z Edit(i +, j + ) ponechání či změna znaku 4. Pokud x i y j : l z l z l s Edit(i +, j) smazání znaku 6. l v Edit(i, j + ) vložení znaku Někdy též Levenštejnova vzdálenost podle Vladimira Josifoviče Levenštejna, který ji zkoumal okolo roku 965. Odtud značení L(x, y)
9 7. Vrátíme min(l z, l s, l v ) Výstup: Editační vzdálenost L(x i... x n, y j... y m ) Algoritmus je zjevně korektní, nicméně může běžet exponenciálně dlouho (třeba pro x = y = aaa... a). Opět nás zachrání, že funkci Edit můžeme zavolat jen s (n + )(m + ) různými argumenty. Budeme si tedy kešovat, pro které argumenty už známe výsledek, a známé hodnoty nebudeme počítat znovu. Funkce pak poběží jen O(nm)-krát a pokaždé spotřebuje konstantní čas. Iterativní řešení Pokračujme podobně jako v minulém oddílu. Otočíme směr výpočtu a tabulku T s výsledky podproblémů budeme vyplňovat bez použití rekurze. Představíme-li si ji jako matici, každý prvek závisí pouze na těch, které leží napravo a dolů od něj. Tabulku proto můžeme vyplňovat po řádcích zdola nahoru, zprava doleva. Tím získáme následující jednodušší algoritmus, který zjevně běží v čase Θ(nm). Příklad výpočtu naleznete na obrázku.4. Algoritmus Edit (editační vzdálenost řetězců iterativně) Vstup: Řetězce x... x n a y... y m. Pro i =,..., n + položíme T [i, m + ] n i +.. Pro j =,..., m + položíme T [n +, j] m j +.. Pro i = n,..., : 4. Pro j = m,..., : 5. Je-li x i = y j : δ 0, jinak δ 6. T [i, j] min(δ +T [i+, j +], +T [i+, j], +T [i, j +]) Výstup: Editační vzdálenost L(x... x n, y... y m ) = T [, ] Grafové řešení p o t e m n í k p o u t 4 4 n í k Obr..4: Tabulka T pro slova poutník a potemník Editační vzdálenost můžeme také popsat pomocí vhodného orientovaného grafu (obrázek.5). Vrcholy budou odpovídat možným pozicím v obou řetězcích. Budou to tedy dvojice (i, j), kde i n + a j m +. Hrany budou popisovat
10 možné operace: z vrcholu (i, j) povede hrana do (i+, j), (i, j+) a (i+, j+). Tyto hrany odpovídají po řadě smazání znaku, vložení znaku a ponechání/záměně znaku. Všechny budou mít jednotkovou délku, pouze v případě ponechání nezměněného písmene (x i = y j ) bude délka nulová. p o u t n í k p o t e m n í k Obr..5: Graf k výpočtu editační vzdálenosti. Plné hrany mají délku 0, čárkované. Každá cesta z vrcholu (, ) do (n+, m+) proto odpovídá jedné posloupnosti operací uspořádané zleva doprava, která z řetězce x vyrobí y. Jelikož graf je acyklický a má Θ(nm) vrcholů a Θ(nm) hran, můžeme v něm nalézt nejkratší cestu indukcí podle topologického uspořádání v čase Θ(nm). Přesně to ostatně dělá náš algoritmus Edit. Indukcí můžeme dokázat, že T [i, j] je rovno délce nejkratší cesty z vrcholu (i, j) do (n +, m + ). Cvičení. Dokažte, že editační vzdálenost L(x, y) se chová jako metrika: je vždy nezáporná, nulová pouze pro x = y, symetrická (L(x, y) = L(y, x)) a splňuje trojúhelníkovou nerovnost L(x, z) L(x, y) + L(y, z).. Algoritmus Edit zabere Θ(nm) buněk paměti na uložení tabulky T. Ukažte, jak spotřebu paměti snížit na Θ(n + m).. Kromě editační vzdálenosti můžeme chtít spočítat i příslušnou nejkratší posloupnost editačních operací. V grafové interpretaci našeho algoritmu je to triviální prostě vypíšeme nalezenou nejkratší cestu. Ukažte, jak to udělat bez explicitního sestrojení grafu, třeba přímou úpravou algoritmu Edit. 4*. I v předchozím cvičení si lze vystačit s pamětí Θ(n + m). Existuje pěkný trik založený na metodě Rozděl a panuj. Budeme hledat nejkratší cestu v grafu
11 z obrázku.5. Graf postačí procházet po řádcích (to je topologické pořadí), ale obvyklé grafové algoritmy by si pro vypisování cesty musely zapamatovat předchůdce každého vrcholu. My si místo toho uložíme jen to, ve kterém sloupci proťala nejkratší cesta z počátku do daného vrcholu (n/)-tý řádek. To si postačí pamatovat jen v okolí aktuálního řádku. Na konci výpočtu zjistíme, jaký je prostřední vrchol na nejkratší cestě, takže umíme problém rozdělit na dva poloviční podproblémy. Doplňte detaily a dokažte, že tomuto algoritmu postačí lineární paměť, a přesto celkově poběží v čase Θ(nm). 5. Na první pohled se zdá, že čím podobnější řetězce dostaneme, tím by mělo být jednodušší zjistit jejich editační vzdálenost. Náš algoritmus ovšem pokaždé vyplňuje celou tabulku. Ukažte, jak ho zrychlit, aby počítal v čase O((n + m)(l(x, y) + )). 6*. Jak by se výpočet editační vzdálenosti změnil, kdybychom mezi editační operace řadili i prohození dvou sousedních písmen? 7. Navrhněte algoritmus pro nalezení nejdelší společné podposloupnosti daných posloupností x,..., x n a y,..., y m. Jak tento problém souvisí s editační vzdáleností a s grafem z obrázku.5? 8. Jak naopak najít nejkratší společnou nadposloupnost dvou posloupností A a B? Tím se myslí nejkratší posloupnost, která obsahuje jako podposloupnosti jak A, tak B..4. Optimální vyhledávací stromy Když jsme vymýšleli binární vyhledávací stromy (BVS), uměli jsme zařídit, aby žádný prvek neležel příliš hluboko. Hned několik způsobů vyvažování nám zaručilo logaritmickou hloubku stromu. Co kdybychom ale věděli, že se na některé prvky budeme ptát mnohem častěji než na jiné? Nevyplatilo by se potom umístit tyto oblíbené prvky blízko ke kořeni, byť by to znamenalo další prvky posunout níže? Vyzkoušejme si to se třemi prvky. Na prvek se budeme ptát celkem 0krát, na jen jednou, na celkem 5krát. Obrázek.6 ukazuje možné tvary vyhledávacího stromu a jejich ceny počty vrcholů navštívených během všech 6 vyhledávání. Například pro prostřední, dokonale vyvážený strom nahlédneme při hledání prvku do vrcholů, při hledání do vrcholu a při hledání opět do vrcholů. Celková cena tedy činí =. Následující strom ovšem dosahuje nižší ceny, protože často používaná leží v kořeni. Pojďme se na tento problém podívat obecněji. Máme n prvků s klíči x <... < x n a kladnými vahami w,..., w n. Každému binárnímu vyhledávacímu stromu pro tuto množinu klíčů přidělíme cenu C = i w i h i, kde h i je hloubka klíče x i (hloubky tentokrát počítáme od jedničky). Chceme najít optimální vyhledávací strom, tedy ten s nejnižší cenou. Rekurzivní řešení Představme si, že nám někdo napověděl, jaký prvek x i se nachází v kořeni optimálního stromu. Hned víme, že levý podstrom obsahuje klíče x,..., x i a pravý
12 7 8 7 Obr..6: Cena hledání v různých vyhledávacích stromech podstrom klíče x i+,..., x n. Navíc oba tyto podstromy musí být optimální jinak bychom je mohli vyměnit za optimální a tím celý strom zlepšit. Pokud nám prvek v kořeni nikdo nenapoví, vystačíme si sami: vyzkoušíme všechny možnosti a vybereme tu, která povede na minimální cenu. Levý a pravý podstrom pokaždé sestrojíme rekurzivním zavoláním téhož algoritmu. Původní problém tedy postupně rozkládáme na podproblémy. V každém z nich hledáme optimální strom pro nějaký souvislý úsek klíčů x i,..., x j. Zatím se spokojíme s tím, že spočítáme cenu tohoto stromu. Tím vznikne funkce OptStrom(i, j) popsaná níže. Funkce vyzkouší všechny možné kořeny, pro každý z nich rekurzivně spočítá optimální cenu c l levého podstromu a c p pravého. Zbývá domyslet, jak z těchto cen spočítat cenu celého stromu. Všem prvkům v levém podstromu jsme zvýšili hloubku o, takže cena podstromu vzrostla o součet vah těchto prvků. Podobně to bude v pravém podstromu. Navíc přibyly dotazy na kořen, který má hloubku, takže přispívají k ceně přesně vahou kořene. Váhu každého prvku jsme tedy přičetli právě jednou, takže celková cena stromu činí c l + c p + (w i w j ). Algoritmus OptStrom(i, j) (cena optimálního BVS rekurzivně) Vstup: Klíče x i,..., x j s vahami w i,..., w j. Pokud i > j, vrátíme 0. prázdný úsek dává prázdný strom. W w i w j celková váha prvků. C + zatím nejlepší cena stromu 4. Pro k = i,..., j: různé volby kořene 5. c l OptStrom(i, k ) levý podstrom 6. c p = OptStrom(k +, j) pravý podstrom 7. C = min(c, c l + c p + W ) cena celého stromu Výstup: Cena C optimálního vyhledávacího stromu Jako obvykle jsme napoprvé získali exponenciální řešení, které půjde zrychlit kešováním spočítaných mezivýsledků. Budeme-li si pamatovat hodnoty T [i, j] = OptStrom(i, j), spočítáme celkově O(n ) políček tabulky a každým strávíme čas O(n). Celkem tedy algoritmus poběží v čase O(n )
13 Iterativní řešení Nyní obrátíme směr výpočtu. Využijeme toho, že odpověď pro daný úsek závisí pouze na odpovědích pro kratší úseky. Proto můžeme tabulku mezivýsledků vyplňovat od nejkratších úseků k nejdelším. Tím vznikne následující iterativní algoritmus. Oproti předchozímu řešení si navíc budeme pro každý úsek pamatovat optimální kořen, což nám za chvíli usnadní rekonstrukci optimálního stromu. Algoritmus OptStrom (cena optimálního BVS iterativně) Vstup: Klíče x,..., x n s vahami w,..., w n. Pro i =,..., n + : T [i, i ] 0 prázdné stromy nic nestojí. Pro l =,..., n: délky úseků. Pro i =,..., n l + : začátky úseků 4. j i + l konec aktuálního úseku 5. W w i w j celková váha úseku 6. T [i, j] + 7. Pro k = i,..., j: možné kořeny 8. C T [i, k ] + T [k +, j] + W cena stromu 9. Pokud C < T [i, j]: průběžné minimum 0. T [i, j] C. K[i, j] k Výstup: Cena T [, n] optimálního stromu, pole K s optimálními kořeny Spočítejme časovou složitost. Vnitřní cyklus (kroky 4 až ) běží v čase O(n) a spouští se O(n )-krát. To celkem dává O(n ). Odvodit ze zapamatovaných kořenů skutečnou podobu optimálního stromu už bude hračka. Kořenem je prvek s indexem r = K[, n]. Jeho levým synem bude kořen optimálního stromu pro úsek,..., r, což je prvek s indexem K[, r ], a tak dále. Z této úvahy ihned plyne následující rekurzivní algoritmus. Zavoláme-li OptStromReko(, n), vrátí nám celý optimální strom. Algoritmus OptStromReko(i, j) (konstrukce optimálního BVS) Vstup: Klíče x i,..., x j, pole K spočítané algoritmem OptStrom. Pokud i > j, vrátíme prázdný strom.. r K[i, j] kolikátý prvek je v kořeni?. Vytvoříme nový vrchol v s klíčem x r. 4. Jako levého syna nastavíme OptStromReko(i, r ). 5. Jako pravého syna nastavíme OptStromReko(r +, j). Výstup: Optimální vyhledávací strom s kořenem v Samotná rekonstrukce stráví v každém rekurzivním volání konstantní čas a vyrobí přitom jeden vrchol stromu. Jelikož celkem vytvoříme n vrcholů, stihneme to v čase O(n). Celkem tedy hledáním optimálního stromu strávíme čas O(n ). Dodejme, že existuje i kvadratický algoritmus (cvičení 7)
14 w = w = 0 w = w 4 = w 5 = w 6 = 9 T K Obr..7: Ukázka výpočtu algoritmu OptStrom a nalezený optimální strom Abstraktní pohled na dynamické programování Na závěr se zkusme zamyslet nad tím, co mají jednotlivé aplikace dynamického programování v této kapitole společného tedy kromě toho, že jsme je odvodili z rekurzivních algoritmů zavedením kešování. Pokaždé umíme najít vhodný systém podproblémů těm se často říká stavy dynamického programování. Závislosti mezi těmito podproblémy tvoří acyklický orientovaný graf. Díky tomu můžeme všechny stavy procházet v topologickém uspořádání a vždy mít připraveny všechny mezivýsledky potřebné k výpočtu aktuálního stavu. Aby tento přístup fungoval, nesmí být stavů příliš mnoho: v našich případech jich bylo lineárně nebo kvadraticky. Každý stav jsme pak uměli spočítat v nejhůře lineárním čase, takže jsme dostali samé příjemně polynomiální algoritmy. Někdy může být dynamické programování zajímavé i s exponenciálně mnoha stavy. Sice pak dostaneme algoritmus o exponenciální složitosti, ale i ten může být rychlejší než jiná možná řešení. Příklady tohoto typu najdete v oddílu??. Cvičení. Optimální vyhledávací strom můžeme také definovat pomocí pravděpodobností. Nechť se na jednotlivé klíče ptáme náhodně, přičemž s pravděpodobností p i se zeptáme na klíč x i. Počet vrcholů navštívených při hledání se pak chová jako náhodná veličina se střední hodnotou i p ih i (h i je opět hloubka i-tého vrcholu). Zkuste formulovat podobný algoritmus v řeči těchto středních hodnot. Jak bude fungovat argument se skládáním stromů z podstromů?. Navrhněte, jak rovnou při výpočtu vah konstruovat strom. Využijte toho, že se více vrcholů může odkazovat na tytéž podstromy.. Rozmyslete si, že nastavíme-li všem prvkům stejnou váhu, vyjde dokonale vyvážený strom. 4. Jak se algoritmus změní, pokud budeme uvažovat i neúspěšné dotazy? Nejjednodušší je představit si, že váhy přidělujeme i externím vrcholům stromu, jež odpovídají intervalům (x i, x i+ ) mezi klíči
15 5. Co jsou v případě optimálních stromů stavy dynamického programování a jak vypadá graf jejich závislostí? 6**. Knuthova nerovnost: Nechť K[i, j] je kořen spočítaný algoritmem OptStrom pro úsek x i,..., x j (je to tedy nejlevější z optimálních kořenů). Donald Knuth dokázal, že platí K[i, j ] K[i, j] K[i +, j]. Zkuste to dokázat i vy. 7*. Rychlejší algoritmus: Vymyslete jak pomocí nerovnosti z předchozího cvičení zrychlit algoritmus OptStrom na O(n ). 8. Součin matic: Násobíme-li matice X R a b a Y R b c podle definice, počítáme a b c součinů čísel. Pokud chceme spočítat maticový součin X... X n, výsledek nezávisí na uzávorkování, ale časová složitost (měřená pro jednoduchost počtem součinů čísel) ano. Vymyslete algoritmus, který stanoví, jak výraz uzávorkovat, abychom složitost minimalizovali. 9. Minimální triangulace: Konvexní mnohoúhelník můžeme triangulovat, tedy rozřezat neprotínajícími se úhlopříčkami na trojúhelníky. Nalezněte takovou triangulaci, aby součet délek řezů byl nejmenší možný. 0*. Optimalizace na stromech: Ukažte, že předchozí dvě cvičení lze formulovat jako hledání optimálního binárního stromu vzhledem k nějaké cenové funkci. Rozšiřte algoritmy z tohoto oddílu, aby uměly pracovat s obecnými cenovými funkcemi a plynulo z nich automaticky i řešení minulých cvičení
Algoritmizace Dynamické programování. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010
Dynamické programování Jiří Vyskočil, Marko Genyg-Berezovskyj 2010 Rozděl a panuj (divide-and-conquer) Rozděl (Divide): Rozděl problém na několik podproblémů tak, aby tyto podproblémy odpovídaly původnímu
1. Dynamické programování
. Dynamické programování V této kapitole prozkoumáme ještě jednu techniku návrhu algoritmů, která je založená na rekurzivním rozkladu problému na podproblému. Na rozdíl od klasické metody Rozděl a panuj
Binární soubory (datové, typované)
Binární soubory (datové, typované) - na rozdíl od textových souborů data uložena binárně (ve vnitřním tvaru jako v proměnných programu) není čitelné pro člověka - všechny záznamy téhož typu (může být i
Návrh Designu: Radek Mařík
1. 7. Najděte nejdelší rostoucí podposloupnost dané posloupnosti. Použijte metodu dynamického programování, napište tabulku průběžných délek částečných výsledků a tabulku předchůdců. a) 5 8 11 13 9 4 1
Prohledávání do šířky = algoritmus vlny
Prohledávání do šířky = algoritmus vlny - souběžně zkoušet všechny možné varianty pokračování výpočtu, dokud nenajdeme řešení úlohy průchod stromem všech možných cest výpočtu do šířky, po vrstvách (v každé
Dynamické programování
Dynamické programování prof. Ing. Pavel Tvrdík CSc. Katedra počítačových systémů Fakulta informačních technologií České vysoké učení technické v Praze c Pavel Tvrdík, 2010 Efektivní algoritmy (BI-EFA)
Binární vyhledávací stromy pokročilé partie
Binární vyhledávací stromy pokročilé partie KMI/ALS lekce Jan Konečný 30.9.204 Literatura Cormen Thomas H., Introduction to Algorithms, 2nd edition MIT Press, 200. ISBN 0-262-5396-8 6, 3, A Knuth Donald
bin arn ı vyhled av an ı a bst Karel Hor ak, Petr Ryˇsav y 23. bˇrezna 2016 Katedra poˇ c ıtaˇ c u, FEL, ˇ CVUT
binární vyhledávání a bst Karel Horák, Petr Ryšavý 23. března 2016 Katedra počítačů, FEL, ČVUT Příklad 1 Naimplementujte binární vyhledávání. Upravte metodu BinarySearch::binarySearch. 1 Příklad 2 Mysĺım
12. Lineární programování
. Lineární programování. Lineární programování Úloha lineárního programování (lineární optimalizace) je jedním ze základních problémů teorie optimalizace. Našim cílem je nalézt maximum (resp. minimum)
4 Stromy a les. Definice a základní vlastnosti stromů. Kostry grafů a jejich počet.
4 Stromy a les Jedním ze základních, a patrně nejjednodušším, typem grafů jsou takzvané stromy. Jedná se o souvislé grafy bez kružnic. Přes svou (zdánlivou) jednoduchost mají stromy bohatou strukturu a
3. Prohledávání grafů
3. Prohledávání grafů Prohledání do šířky Breadth-First Search BFS Jde o grafový algoritmus, který postupně prochází všechny vrcholy v dané komponentě souvislosti. Algoritmus nejprve projde všechny sousedy
5 Orientované grafy, Toky v sítích
Petr Hliněný, FI MU Brno, 205 / 9 FI: IB000: Toky v sítích 5 Orientované grafy, Toky v sítích Nyní se budeme zabývat typem sít ových úloh, ve kterých není podstatná délka hran a spojení, nýbž jejich propustnost
Kolik existuje různých stromů na pevně dané n-prvkové množině vrcholů?
Kapitola 9 Matice a počet koster Graf (orientovaný i neorientovaný) lze popsat maticí, a to hned několika různými způsoby. Tématem této kapitoly jsou incidenční matice orientovaných grafů a souvislosti
Programování 3. hodina. RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015
Programování 3. hodina RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015 Umíme z minulé hodiny Implementace zásobníku a fronty pomocí
a) b) c) Radek Mařík
2012-03-20 Radek Mařík 1. Čísla ze zadané posloupnosti postupně vkládejte do prázdného binárního vyhledávacího stromu (BVS), který nevyvažujte. Jak bude vypadat takto vytvořený BVS? Poté postupně odstraňte
6 Ordinální informace o kritériích
6 Ordinální informace o kritériích Ordinální informací o kritériích se rozumí jejich uspořádání podle důležitosti. Předpokládejme dále standardní značení jako v předchozích cvičeních. Existují tři základní
Algoritmus pro hledání nejkratší cesty orientovaným grafem
1.1 Úvod Algoritmus pro hledání nejkratší cesty orientovaným grafem Naprogramoval jsem v Matlabu funkci, která dokáže určit nejkratší cestu v orientovaném grafu mezi libovolnými dvěma vrcholy. Nastudoval
Časová a prostorová složitost algoritmů
.. Časová a prostorová složitost algoritmů Programovací techniky doc. Ing. Jiří Rybička, Dr. ústav informatiky PEF MENDELU v Brně rybicka@mendelu.cz Hodnocení algoritmů Programovací techniky Časová a prostorová
1. Toky, řezy a Fordův-Fulkersonův algoritmus
1. Toky, řezy a Fordův-Fulkersonův algoritmus V této kapitole nadefinujeme toky v sítích, odvodíme základní věty o nich a také Fordův-Fulkersonův algoritmus pro hledání maximálního toku. Také ukážeme,
68. ročník Matematické olympiády 2018/2019
68. ročník Matematické olympiády 2018/2019 Řešení úloh ústředního kola kategorie P 2. soutěžní den P-III-4 Výlet Abychom našli požadovaný výlet délky 4, stačí najít dvě hvězdy a a b, které mají dva společné
Výhody a nevýhody jednotlivých reprezentací jsou shrnuty na konci kapitoly.
Kapitola Reprezentace grafu V kapitole?? jsme se dozvěděli, co to jsou grafy a k čemu jsou dobré. rzo budeme chtít napsat nějaký program, který s grafy pracuje. le jak si takový graf uložit do počítače?
Intervalové stromy. Představme si, že máme posloupnost celých čísel p 0, p 1,... p N 1, se kterou budeme. 1. Změna jednoho čísla v posloupnosti.
Intervalové stromy Představme si, že máme posloupnost celých čísel p 0, p 1,... p N 1, se kterou budeme průběžně provádět tyto dvě operace: 1. Změna jednoho čísla v posloupnosti. 2. Zjištění součtu čísel
Ukážeme si lineární algoritmus, který pro pevné k rozhodne, zda vstupní. stromový rozklad. Poznamenejme, že je-li k součástí vstupu, pak rozhodnout
Ukážeme si lineární algoritmus, který pro pevné k rozhodne, zda vstupní graf má stromovou šířku nejvýše k, a je-li tomu tak, také vrátí příslušný stromový rozklad. Poznamenejme, že je-li k součástí vstupu,
Tento text je stručným shrnutím těch tvrzení Ramseyovy teorie, která zazněla
Ramseyovy věty Martin Mareš Tento text je stručným shrnutím těch tvrzení Ramseyovy teorie, která zazněla na mé letošní přednášce z Kombinatoriky a grafů I Předpokládá, že čtenář se již seznámil se základní
Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.
Vyhledávání doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 21. září 2018 Jiří Dvorský (VŠB TUO) Vyhledávání 242 / 433 Osnova přednášky
Algoritmizace prostorových úloh
INOVACE BAKALÁŘSKÝCH A MAGISTERSKÝCH STUDIJNÍCH OBORŮ NA HORNICKO-GEOLOGICKÉ FAKULTĚ VYSOKÉ ŠKOLY BÁŇSKÉ - TECHNICKÉ UNIVERZITY OSTRAVA Algoritmizace prostorových úloh Grafové úlohy Daniela Szturcová Tento
4EK311 Operační výzkum. 5. Teorie grafů
4EK311 Operační výzkum 5. Teorie grafů 5. Teorie grafů definice grafu Graf G = uspořádaná dvojice (V, E), kde V označuje množinu n uzlů u 1, u 2,, u n (u i, i = 1, 2,, n) a E označuje množinu hran h ij,
5. Dynamické programování
5. Dynamické programování BI-EP1 Efektivní programování 1 ZS 2011/2012 Ing. Martin Kačer, Ph.D. 2010-11 Martin Kačer Katedra teoretické informatiky Fakulta informačních technologií České vysoké učení technické
Dynamické programování UIN009 Efektivní algoritmy 1
Dynamické programování. 10.3.2005 UIN009 Efektivní algoritmy 1 Srovnání metody rozděl a panuj a dynamického programování Rozděl a panuj: top-down Dynamické programování: bottom-up Rozděl a panuj: překrývání
Vzdálenost uzlů v neorientovaném grafu
Vzdálenosti a grafy Vzdálenost uzlů v neorientovaném grafu Je dán neorientovaný neohodnocený graf G = (V,E,I) vzdálenost uzlů u a v v neorientovaném souvislém grafu G je délka nejkratší cesty spojující
Dynamické programování
ALG 0 Dynamické programování zkratka: DP Zdroje, přehledy, ukázky viz https://cw.fel.cvut.cz/wiki/courses/a4balg/literatura_odkazy 0 Dynamické programování Charakteristika Neřeší jeden konkrétní typ úlohy,
Stromy, haldy, prioritní fronty
Stromy, haldy, prioritní fronty prof. Ing. Pavel Tvrdík CSc. Katedra počítačů FEL České vysoké učení technické DSA, ZS 2008/9, Přednáška 6 http://service.felk.cvut.cz/courses/x36dsa/ prof. Pavel Tvrdík
Modely teorie grafů, min.kostra, max.tok, CPM, MPM, PERT
PEF ČZU Modely teorie grafů, min.kostra, max.tok, CPM, MPM, PERT Okruhy SZB č. 5 Zdroje: Demel, J., Operační výzkum Jablonský J., Operační výzkum Šubrt, T., Langrová, P., Projektové řízení I. a různá internetová
1 Extrémy funkcí - slovní úlohy
1 Extrémy funkcí - slovní úlohy Příklad 1.1. Součet dvou kladných reálných čísel je a. Určete 1. Minimální hodnotu součtu jejich n-tých mocnin.. Maximální hodnotu součinu jejich n-tých mocnin. Řešení.
Lingebraické kapitolky - Analytická geometrie
Lingebraické kapitolky - Analytická geometrie Jaroslav Horáček KAM MFF UK 2013 Co je to vektor? Šipička na tabuli? Ehm? Množina orientovaných úseček majících stejný směr. Prvek vektorového prostoru. V
Vyvažování a rotace v BVS, všude se předpokládá AVL strom
Vyvažování a rotace v BVS, všude se předpokládá AVL strom 1. Jednoduchá levá rotace v uzlu u má operační složitost a) závislou na výšce levého podstromu uzlu u b) mezi O(1) a Θ(n) c) závislou na hloubce
Stromy. Jan Hnilica Počítačové modelování 14
Stromy Jan Hnilica Počítačové modelování 14 1 Základní pojmy strom = dynamická datová struktura, složená z vrcholů (uzlů, prvků) propojených hranami hrany chápeme jako orientované, tzn. vedou z uzlu A
Přednáška 3: Limita a spojitost
3 / 1 / 17, 1:38 Přednáška 3: Limita a spojitost Limita funkce Nejdříve je potřeba upřesnit pojmy, které přesněji popisují (topologickou) strukturu množiny reálných čísel, a to zejména pojem okolí 31 Definice
Řešení: PŘENESVĚŽ (N, A, B, C) = přenes N disků z A na B pomocí C
Hanojské věže - 3 kolíky A, B, C - na A je N disků různé velikosti, seřazené od největšího (dole) k nejmenšímu (nahoře) - kolíky B a C jsou prázdné - úkol: přenést všechny disky z A na B, mohou se odkládat
Zadání a řešení testu z matematiky a zpráva o výsledcích přijímacího řízení do magisterského navazujícího studia od podzimu 2014
Zadání a řešení testu z matematiky a zpráva o výsledcích přijímacího řízení do magisterského navazujícího studia od podzimu 204 Zpráva o výsledcích přijímacího řízení do magisterského navazujícího studia
8.3). S ohledem na jednoduchost a názornost je výhodné seznámit se s touto Základní pojmy a vztahy. Definice
9. Lineární diferenciální rovnice 2. řádu Cíle Diferenciální rovnice, v nichž hledaná funkce vystupuje ve druhé či vyšší derivaci, nazýváme diferenciálními rovnicemi druhého a vyššího řádu. Analogicky
Úvod do informatiky. Miroslav Kolařík
Úvod do informatiky přednáška desátá Miroslav Kolařík Zpracováno dle R. Bělohlávek, V. Vychodil: Diskrétní matematika 2, http://phoenix.inf.upol.cz/esf/ucebni/dm2.pdf P. Martinek: Základy teoretické informatiky,
1 Polynomiální interpolace
Polynomiální interpolace. Metoda neurčitých koeficientů Příklad.. Nalezněte polynom p co nejmenšího stupně, pro který platí p() = 0, p(2) =, p( ) = 6. Řešení. Polynom hledáme metodou neurčitých koeficientů,
3. přednáška 15. října 2007
3. přednáška 15. října 2007 Kompaktnost a uzavřené a omezené množiny. Kompaktní množiny jsou vždy uzavřené a omezené, a v euklidovských prostorech to platí i naopak. Obecně to ale naopak neplatí. Tvrzení
Jednoduché cykly 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45.
Jednoduché cykly Tento oddíl obsahuje úlohy na první procvičení práce s cykly. Při řešení každé ze zde uvedených úloh stačí použít vedle podmíněných příkazů jen jediný cyklus. Nepotřebujeme používat ani
Cykly a pole 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116.
Cykly a pole Tato část sbírky je tvořena dalšími úlohami na práci s cykly. Na rozdíl od předchozího oddílu se zde již v řešeních úloh objevuje více cyklů, ať už prováděných po sobě nebo vnořených do sebe.
Obsah prezentace. Základní pojmy v teorii o grafech Úlohy a prohledávání grafů Hledání nejkratších cest
Obsah prezentace Základní pojmy v teorii o grafech Úlohy a prohledávání grafů Hledání nejkratších cest 1 Základní pojmy Vrchol grafu: {množina V} Je to styčná vazba v grafu, nazývá se též uzlem, prvkem
Funkce a lineární funkce pro studijní obory
Variace 1 Funkce a lineární funkce pro studijní obory Autor: Mgr. Jaromír JUŘEK Kopírování a jakékoliv další využití výukového materiálu je povoleno pouze s uvedením odkazu na www.jarjurek.cz. 1. Funkce
Elegantní algoritmus pro konstrukci sufixových polí
Elegantní algoritmus pro konstrukci sufixových polí 22.10.2014 Zadání Obsah Zadání... 3 Definice... 3 Analýza problému... 4 Jednotlivé algoritmy... 4 Algoritmus SA1... 4 Algoritmus SA2... 5 Algoritmus
Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz
Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz (2 + 5) * (13-4) * + - 2 5 13 4 - listy stromu obsahují operandy (čísla) - vnitřní uzly obsahují operátory (znaménka)
Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.
Vyhledávání doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 12. září 2016 Jiří Dvorský (VŠB TUO) Vyhledávání 201 / 344 Osnova přednášky
Algoritmy I, složitost
A0B36PRI - PROGRAMOVÁNÍ Algoritmy I, složitost České vysoké učení technické Fakulta elektrotechnická v 1.01 Rychlost... Jeden algoritmus (program, postup, metoda ) je rychlejší než druhý. Co ta věta znamená??
Výroková a predikátová logika - II
Výroková a predikátová logika - II Petr Gregor KTIML MFF UK ZS 2015/2016 Petr Gregor (KTIML MFF UK) Výroková a predikátová logika - II ZS 2015/2016 1 / 18 Základní syntax Jazyk Výroková logika je logikou
Informatika navazující magisterské studium Přijímací zkouška z informatiky 2018 varianta A
Informatika navazující magisterské studium Přijímací zkouška z informatiky 2018 varianta A Každá úloha je hodnocena maximálně 25 body. Všechny své odpovědi zdůvodněte! 1. Postavte na stůl do řady vedle
Dynamické programování
Dynamické programování Rekurzivní funkce je taková funkce, která při svém běhu volá sama sebe, často i více než jednou, což v důsledku může vést na exponenciální algoritmus. Dynamické programování je technika,
Řešení 1b Máme najít body, v nichž má funkce (, ) vázané extrémy, případně vázané lokální extrémy s podmínkou (, )=0, je-li: (, )= +,
Příklad 1 Najděte body, v nichž má funkce (,) vázané extrémy, případně vázané lokální extrémy s podmínkou (,)=0, je-li: a) (,)= + 1, (,)=+ 1 lok.max.v 1 2,3 2 b) (,)=+, (,)= 1 +1 1 c) (,)=, (,)=+ 1 lok.max.v
4EK213 LINEÁRNÍ MODELY
4EK213 LINEÁRNÍ MODELY Úterý 11:00 12:30 hod. učebna SB 324 3. přednáška SIMPLEXOVÁ METODA I. OSNOVA PŘEDNÁŠKY Standardní tvar MM Základní věta LP Princip simplexové metody Výchozí řešení SM Zlepšení řešení
Výroková a predikátová logika - III
Výroková a predikátová logika - III Petr Gregor KTIML MFF UK ZS 2017/2018 Petr Gregor (KTIML MFF UK) Výroková a predikátová logika - III ZS 2017/2018 1 / 16 2-SAT 2-SAT Výrok je v k-cnf, je-li v CNF a
Základní datové struktury III: Stromy, haldy
Základní datové struktury III: Stromy, haldy prof. Ing. Pavel Tvrdík CSc. Katedra počítačových systémů Fakulta informačních technologií České vysoké učení technické v Praze c Pavel Tvrdík, 2010 Efektivní
Algoritmy a datové struktury
Algoritmy a datové struktury Stromy 1 / 32 Obsah přednášky Pole a seznamy Stromy Procházení stromů Binární stromy Procházení BS Binární vyhledávací stromy 2 / 32 Pole Hledání v poli metodou půlení intervalu
zejména Dijkstrův algoritmus pro hledání minimální cesty a hladový algoritmus pro hledání minimální kostry.
Kapitola Ohodnocené grafy V praktických aplikacích teorie grafů zpravidla graf slouží jako nástroj k popisu nějaké struktury. Jednotlivé prvky této struktury mají často přiřazeny nějaké hodnoty (může jít
1 Linearní prostory nad komplexními čísly
1 Linearní prostory nad komplexními čísly V této přednášce budeme hledat kořeny polynomů, které se dále budou moci vyskytovat jako složky vektorů nebo matic Vzhledem k tomu, že kořeny polynomu (i reálného)
Teorie informace a kódování (KMI/TIK) Reed-Mullerovy kódy
Teorie informace a kódování (KMI/TIK) Reed-Mullerovy kódy Lukáš Havrlant Univerzita Palackého 10. ledna 2014 Primární zdroj Jiří Adámek: Foundations of Coding. Strany 137 160. Na webu ke stažení, heslo:
Binární vyhledávací stromy
Binární vyhledávací stromy Definice: Binární vyhledávací strom (po domácku BVS) je buďto prázdná množina nebo kořen obsahující jednu hodnotu a mající dva podstromy (levý a pravý), což jsou opět BVS, ovšem
13. Třídící algoritmy a násobení matic
13. Třídící algoritmy a násobení matic Minulou přednášku jsme probírali QuickSort, jeden z historicky prvních třídících algoritmů, které překonaly kvadratickou složitost aspoň v průměrném případě. Proč
Matematická analýza pro informatiky I. Limita posloupnosti (I)
Matematická analýza pro informatiky I. 3. přednáška Limita posloupnosti (I) Jan Tomeček tomecek@inf.upol.cz http://aix-slx.upol.cz/ tomecek/index Univerzita Palackého v Olomouci 25. února 2011 tomecek@inf.upol.cz
PQ-stromy a rozpoznávání intervalových grafů v lineárním čase
-stromy a rozpoznávání intervalových grafů v lineárním čase ermutace s předepsanými intervaly Označme [n] množinu {1, 2,..., n}. Mějme permutaci π = π 1, π 2,..., π n množiny [n]. Řekneme, že množina S
Zdůvodněte, proč funkce n lg(n) roste alespoň stejně rychle nebo rychleji než než funkce lg(n!). Symbolem lg značíme logaritmus o základu 2.
1 3 4 5 6 7 8 9 10 11 1 13 14 15 16 17 18 19 0 1 3 4 5 6 7 8 9 30 31 3 Zdůvodněte, proč funkce f(n) = n log(n) 1 n 1/ roste rychleji než funkce g(n) = n. Zdůvodněte, proč funkce f(n) = n 3/ log(n) roste
63. ročník Matematické olympiády 2013/2014
63. ročník Matematické olympiády 2013/2014 Úlohy ústředního kola kategorie P 2. soutěžní den Na řešení úloh máte 4,5 hodiny čistého času. Při soutěži je zakázáno používat jakékoliv pomůcky kromě psacích
Stromové rozklady. Definice 1. Stromový rozklad grafu G je dvojice (T, β) taková, že T je strom,
Stromové rozklady Zdeněk Dvořák 25. října 2017 Definice 1. Stromový rozklad grafu G je dvojice (T, β) taková, že T je strom, β je funkce přiřazující každému vrcholu T podmnožinu vrcholů v G, pro každé
Grafové algoritmy. Programovací techniky
Grafové algoritmy Programovací techniky Grafy Úvod - Terminologie Graf je datová struktura, skládá se z množiny vrcholů V a množiny hran mezi vrcholy E Počet vrcholů a hran musí být konečný a nesmí být
Digitální učební materiál
Digitální učební materiál Číslo projektu: CZ.1.07/1.5.00/34.0548 Název školy: Gymnázium, Trutnov, Jiráskovo náměstí 325 Název materiálu: VY_32_INOVACE_145_IVT Autor: Ing. Pavel Bezděk Tematický okruh:
Náhodný vektor. Náhodný vektor. Hustota náhodného vektoru. Hustota náhodného vektoru. Náhodný vektor je dvojice náhodných veličin (X, Y ) T = ( X
Náhodný vektor Náhodný vektor zatím jsme sledovali jednu náhodnou veličinu, její rozdělení a charakteristiky často potřebujeme vyšetřovat vzájemný vztah několika náhodných veličin musíme sledovat jejich
Maticí typu (m, n), kde m, n jsou přirozená čísla, se rozumí soubor mn veličin a jk zapsaných do m řádků a n sloupců tvaru:
3 Maticový počet 3.1 Zavedení pojmu matice Maticí typu (m, n, kde m, n jsou přirozená čísla, se rozumí soubor mn veličin a jk zapsaných do m řádků a n sloupců tvaru: a 11 a 12... a 1k... a 1n a 21 a 22...
Stromy. Strom: souvislý graf bez kružnic využití: počítačová grafika seznam objektů efektivní vyhledávání výpočetní stromy rozhodovací stromy
Stromy úvod Stromy Strom: souvislý graf bez kružnic využití: počítačová grafika seznam objektů efektivní vyhledávání výpočetní stromy rozhodovací stromy Neorientovaný strom Orientovaný strom Kořenový orientovaný
Adresní vyhledávání (přímý přístup, zřetězené a otevřené rozptylování, rozptylovací funkce)
13. Metody vyhledávání. Adresní vyhledávání (přímý přístup, zřetězené a otevřené rozptylování, rozptylovací funkce). Asociativní vyhledávání (sekvenční, binárním půlením, interpolační, binární vyhledávací
které je z různých pohledů charakterizují. Několik z nich dokážeme v této kapitole.
Kapitola 7 Stromy Stromy jsou jednou z nejdůležitějších tříd grafů. O tom svědčí i množství vět, které je z různých pohledů charakterizují. Několik z nich dokážeme v této kapitole. Představíme také dvě
Interpolace Lagrangeovy polynomy. 29. října 2012
Interpolace Lagrangeovy polynomy Michal Čihák 29. října 2012 Problematika interpolace V praxi máme často k dispozici údaje z různých měření tzv. data. Data mohou mít například podobu n uspořádaných dvojic
Úvod do programování 10. hodina
Úvod do programování 10. hodina RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015 Umíme z minulé hodiny Syntax Dvojrozměrné pole
a počtem sloupců druhé matice. Spočítejme součin A.B. Označme matici A.B = M, pro její prvky platí:
Řešené příklady z lineární algebry - část 1 Typové příklady s řešením Příklady jsou určeny především k zopakování látky před zkouškou, jsou proto řešeny se znalostmi učiva celého semestru. Tento fakt se
Operační výzkum. Síťová analýza. Metoda CPM.
Operační výzkum Síťová analýza. Metoda CPM. Operační program Vzdělávání pro konkurenceschopnost Název projektu: Inovace magisterského studijního programu Fakulty ekonomiky a managementu Registrační číslo
V předchozí kapitole jsme podstatným způsobem rozšířili naši představu o tom, co je to číslo. Nadále jsou pro nás důležité především vlastnosti
Kapitola 5 Vektorové prostory V předchozí kapitole jsme podstatným způsobem rozšířili naši představu o tom, co je to číslo. Nadále jsou pro nás důležité především vlastnosti operací sčítání a násobení
fakulty MENDELU v Brně (LDF) s ohledem na disciplíny společného základu http://akademie.ldf.mendelu.cz/cz (reg. č. CZ.1.07/2.2.00/28.
Základy lineárního programování Vyšší matematika, Inženýrská matematika LDF MENDELU Podpořeno projektem Průřezová inovace studijních programů Lesnické a dřevařské fakulty MENDELU v Brně (LDF) s ohledem
2. přednáška 8. října 2007
2. přednáška 8. října 2007 Konvergence v metrických prostorech. Posloupnost bodů (a n ) M v metrickém prostoru (M, d) konverguje (je konvergentní), když v M existuje takový bod a, že lim n d(a n, a) =
Grafy. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 13.
Grafy doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 13. března 2017 Jiří Dvorský (VŠB TUO) Grafy 104 / 309 Osnova přednášky Grafy
Rekurze. Pavel Töpfer, 2017 Programování 1-8 1
Rekurze V programování ve dvou hladinách: - rekurzivní algoritmus (řešení úlohy je definováno pomocí řešení podúloh stejného charakteru) - rekurzivní volání procedury nebo funkce (volá sama sebe přímo
Hledání v textu algoritmem Boyer Moore
Zápočtová práce z Algoritmů a Datových Struktur II (NTIN061) Hledání v textu algoritmem Boyer Moore David Pěgřímek http://davpe.net Algoritmus Boyer Moore[1] slouží k vyhledání vzoru V v zadaném textu
Dynamické programování
ALG 11 Dynamické programování Úloha batohu neomezená Úloha batohu /1 Úloha batohu / Knapsack problem Máme N předmětů, každý s váhou Vi a cenou Ci (i = 1, 2,..., N) a batoh s kapacitou váhy K. Máme naložit
Příklad. Řešte v : takže rovnice v zadání má v tomto případě jedno řešení. Pro má rovnice tvar
Řešte v : má rovnice tvar takže rovnice v zadání má v tomto případě jedno řešení. Pro má rovnice tvar takže rovnice v zadání má v tomto případě opět jedno řešení. Sjednocením obou případů dostaneme úplné
5. Lokální, vázané a globální extrémy
5 Lokální, vázané a globální extrémy Studijní text Lokální extrémy 5 Lokální, vázané a globální extrémy Definice 51 Řekneme, že f : R n R má v bodě a Df: 1 lokální maximum, když Ka, δ Df tak, že x Ka,
Nerovnice, grafy, monotonie a spojitost
Nerovnice, grafy, monotonie a spojitost text pro studenty Fakulty přírodovědně-humanitní a pedagogické TU v Liberci vzniklý za podpory fondu F Martina Šimůnková 29. prosince 2016 1 Úvod Na druhém stupni
Obecná informatika. Matematicko-fyzikální fakulta Univerzity Karlovy v Praze. Podzim 2012
Obecná informatika Přednášející Putovních přednášek Matematicko-fyzikální fakulta Univerzity Karlovy v Praze Podzim 2012 Přednášející Putovních přednášek (MFF UK) Obecná informatika Podzim 2012 1 / 18
Mimo samotné správnosti výsledku vypočteného zapsaným algoritmem je ještě jedno
12 Délka výpočtu algoritmu Mimo samotné správnosti výsledku vypočteného zapsaným algoritmem je ještě jedno neméně důležité hledisko k posouzení vhodnosti algoritmu k řešení zadané úlohy. Jedná se o čas,
JčU - Cvičení z matematiky pro zemědělské obory (doc. RNDr. Nýdl, CSc & spol.) Minitest MT4
ŘEŠENÍ MINITESTŮ JčU - Cvičení z matematiky pro zemědělské obory (doc. RNDr. Nýdl, CSc & spol.) Minitest MT4. Z daných tří soustav rovnic o neznámých x, x vyberte právě všechny ty, které jsou regulární.
Vektory a matice. Obsah. Aplikovaná matematika I. Carl Friedrich Gauss. Základní pojmy a operace
Vektory a matice Aplikovaná matematika I Dana Říhová Mendelu Brno Obsah 1 Vektory Základní pojmy a operace Lineární závislost a nezávislost vektorů 2 Matice Základní pojmy, druhy matic Operace s maticemi
Binární vyhledávací strom pomocí směrníků Miroslav Hostaša L06620
Binární vyhledávací strom pomocí směrníků Miroslav Hostaša L06620 1. Vymezení pojmů Strom: Strom je takové uspořádání prvků - vrcholů, ve kterém lze rozeznat předchůdce - rodiče a následovníky - syny.
ORIENTOVANÉ GRAFY, REPREZENTACE GRAFŮ
ORIENTOVANÉ GRAFY, REPREZENTACE GRAFŮ Doc. RNDr. Josef Kolář, CSc. Katedra teoretické informatiky, FIT České vysoké učení technické v Praze BI-GRA, LS 2/2, Lekce Evropský sociální fond Praha & EU: Investujeme
LDF MENDELU. Simona Fišnarová (MENDELU) Základy lineárního programování VMAT, IMT 1 / 25
Základy lineárního programování Vyšší matematika, Inženýrská matematika LDF MENDELU Podpořeno projektem Průřezová inovace studijních programů Lesnické a dřevařské fakulty MENDELU v Brně (LDF) s ohledem
Základy algoritmizace a programování
Základy algoritmizace a programování Složitost algoritmů. Třídění Přednáška 8 16. listopadu 2009 Který algoritmus je "lepší"? Různé algoritmy, které řeší stejnou úlohu zbytek = p % i; zbytek = p - p/i*i;
Anotace. Dámy na šachovnici dominance a nezávislost. Aritmetické výrazy, notace a převody mezi nimi, nejdelší rostoucí podposloupnost.
Anotace Dámy na šachovnici dominance a nezávislost. Aritmetické výrazy, notace a převody mezi nimi, Problémy řešitelné vyplněním tabulky : Přednášející jde do M1, nejdelší rostoucí podposloupnost. Dámy