KMI/ALM3 Mgr. Petr Osička, Ph.D. Update: 15. listopadu 2016
|
|
- Pavla Janečková
- před 8 lety
- Počet zobrazení:
Transkript
1 Algoritmická matematika 3 KMI/ALM3 Mgr. Petr Osička, Ph.D. Update: 15. listopadu 2016 Algoritmický problém Přednáška 1 Definice 1. Abeceda Σ je konečná neprázdná množina. Prvkům Σ říkáme symboly. Slovo (řetězec) nad abecedou Σ je uspořádaná sekvence znaků z Σ. Délka slova x Σ je délka této sekvence. Množinu všech slov nad abecedou Σ označujeme jako Σ. Jazyk L nad Σ je libovolná podmnožina Σ. Příklad 1. Mějme Σ Bool = {0, 1}. Sekvence 0001, 1110, 00 jsou slovy nad touto abecedou, sekvence 12, #43k nejsou. Σ je pak množina {0, 1, 00, 01, 10, 11, 000,... }. Definice 2. Necht Σ je abeceda. Pak algoritmický problém definujeme jako dvojici L, R, kde L Σ je množina vstupů (instancí) a R je relace zachycující vztah mezi instancemi a správnými výsledky. Tedy pokud x, y R, pak y je správným řešením x. Formálně je L Σ množina zakódování instancí pomocí řetězců nad abecedou Σ, a R Σ Σ, výsledky také kódujeme pomocí Σ. Pro ukázku si problém testování prvočíselnosti uvedeme ve verzích bez kódování pomocí řetězců i s jeho kódováním. (a) Bez použití řetězců můžeme problém zavést následovně. Množina instancí je dána {n n N, n 1}, správné řešení je ANO, pokud je n prvočíslo, jinak NE. (b) Zavedeme-li kódování nad Σ Bool takové, že zakódováním n je jeho zápis ve dvojkové soustavě, kódováním ANO je slovo 1 a kódováním NE je slovo 0, pak je problém popsán pomocí dvojice L, R takové, že: L = {x {0, 1} x je zápis čísla n ve dvojkové soustavě, n N, n 1} a x, y R právě když x je zakódováním prvočísla. Proč kódovat vstupy a výstupy? Velikost instance můžeme zavést jako délku zakódovaní dané instance. Můžeme tak zachytit složitost algoritmu, která by jinak zústala skrytá. Naivní algoritmus pro test prvočíselnosti (ten, který zkouší dělitelnosti všemi menšími čísly) má pro případ (a) z předchozího příkladu složitost O(n), protože vstup n má velikost n. V případě zakódování pomocí dvojkové soustavy má algoritmus složitost exponenciální, protože délka zákódování n je lg n. Pokud se v instanci problému vyskytuje množina čísel, bereme často jako velikost instance jejich počet. Zanedbáváme tak ovšem velikost těchto čísel. Některé operace, o kterých při analýze algoritmu předpokládáme, že mají konstantní složitost, mají ve skutečnosti pro velká čísla složitost horší (například sčítání, porovnávání na součastném harwaru). Pokud zavedeme velikost instance jako délku zakódování, tomuto problému se vyhneneme. Čím větší číslo, čím větší je délka jeho zákódování a tedy i délka zakódování instance. Typy problémů Definice 3. Problém L, R je rozhodovacím problémem, pokud je množina všech možných výsledků dvouprvková, tj {y (x, y) R pro x L} = 2. Jeden z prvků této množiny pak označujeme jako rozhodnutí ANO, druhý z prvků jako rozhodnutí NE. Rozhodovací problém je problémem zjištění, jestli daná instance má požadovanou vlastnost. Pokud ji má, očekáváme odpověd ANO, pokud ji nemá, očekáváme odpověd NE. Protože R je v tomto případě jednoduché, můžeme problém reprezentovat pomocí jazyka. Slova, která kódují instance, pro které je odpověd ANO, do jazyka patří, slova, která kódují instance, pro které je odpověd NE, do jazyka nepatří.
2 Příklad 2. (a) Problém testování prvočíselnosti je rozhodovací problém. (b) Typickým rozhodovacím problémem je problém splnitelnosti formulí výrokové logiky v konjunktivní normální formě (CNF). Formule je v CNF, pokud je konjunkcí klausulí. Klausule je disjunkcí literálů, z nichž každý je bud výrokovou proměnnou nebo její negací. Formule (x y) (y z) je v CNF, kdežto formule (x y) (x y) není v CNF. Každou formuli výrokové logiky lze převést do CNF. Řekneme, že formule ϕ je splnitelná, pokud existuje ohodnocení výrokových proměnných takové, že ϕ je pravdivá. Například formule (x y) je splnitelná, protože pro ohodnocení x = 1, y = 1 je pravdivá. Oproti tomu formule (x x) splnitelná není, protože není pravdivá pro žádné ohodnocení proměnných. Problém splnitelnosti formulí výrokové logiky, který označujeme jako SAT, je problémem určení toho, zda je formule splnitelná. Problém je tedy určen jazykem {zakódování ϕ ϕ je splnitelná formule v CNF}. Definice 4. Necht Σ je abeceda. Optimalizační problém je čtveřice L, sol, cost, goal, kde L Σ je množina instancí daného problému, sol : L P(Σ ) je zobrazení přiřazující instanci problému množinu jejích přípustných řešení; cost : L P(Σ ) Q je zobrazení přiřazující každé instanci a přípustnému řešení této instance jeho cenu; goal je bud minimum (pak mluvíme o minimalizačním problému) nebo maximum (pak mluvíme o maximalizačním problému). Řekneme, že y sol(x) je optimálním řešením instance x, pokud cost(x, y) = goal{cost(y, x) x sol(x)}. Optimalizační problém je problémem výběru řešení s nejlepší cenou z množiny vhodných řešení dané instance. Vhodná řešení obdržíme pomocí zobrazení sol, cenu každého z nich určuje cost. Nakonec goal nám říká, jestli chceme najít to s největší nebo s nejmenší cenou. Příklad 3. (a) Úloha batohu: je dána množina položek s různými váhami a kapacita batohu. Chceme nalézt takovou podmnožinu položek, která se do batohu vejde (součet vah těchto položek je nejvýše kapacita batohu). Současně chceme batoh zaplnit co nejvíce, tedy hledáme takovou množinu položek, která vede k největšímu možnému (menšímu než kapacita) součtu. Úloha batohu Instance: {(b, w 1,..., w n ) b, w 1,..., w n N} Přípustná řešení: sol(b, w 1,..., w n ) = {C {1,..., n} Cena řešení: cost(c, (b, w 1,..., w n )) = i C w i Cíl: maximum i C w i b} Čísla w i odpovídají objemům jednotlivých pytlů s pískem, b je kapacita batohu. Pro instanci I = (b, w 1,..., w 5 ), kde b = 29, w 1 = 3, w 2 = 6, w 3 = 8, w 4 = 7, w 5 = 12, existuje jediné optimální řešení C = {1, 2, 3, 5} s cenou cost(c, I) = 29. Lze snadno ověřit, že všechna ostatní přípustná řešení mají menší cenu. (b) Problém třídění lze také formulovat jako optimalizační problém. Pro sekvenci prvků a = a 1,..., a n a jejich uspořádání je počet inverzí definován jako Inv(a) = {(a i, a j ) i < j, a i a j }, tedy jako počet dvojic prvků, které jsou nejsou uspořádány ve správném pořadí. Pak je problém třídění definován následovně: Problém třídění Instance: Přípustná řešení: Cena řešení: Cíl: a = a 1,..., a n, uspořádání sol(a) = množina všech permutací prvků a 1,..., a n pro x sol(a) je cost(a, x) = Inv(x) minimum Algoritmus danému vstupu (instanci nějakého problému) přiřazuje výstup. Z vnějšku jej lze tedy chápat jako zobrazení. Formálně zapíšeme fakt, že algoritmus A pro vstup x vrátí y jako A(x) = y. Řekneme, že A řeší problém L, R pokud (x, A(x)) R pro každé x L, tedy pokud pro každou instanci problému vrací A správné řešení. 2
3 U optimalizačních problémů, pro které neznáme efektivní algoritmus pro nalezení optimálního řešení, se často spokojíme s algoritmem, který vrací řešení přípustné ne nutně optimální, ale současně pracuje efektivně. Takový algoritmus nazýváme aproximačním algoritmem. Časová složitost Časová složitost (dále jen složitost) algoritmu A je funkce Time A : N N přiřazující velikosti vstupní instance počet instrukcí, které musí algoritmus A během výpočtu provést. Protože obecně nemusí algoritmus pro dvě různé stejně velké instance provést stejné množství instrukcí, potřebujeme počty instrukcí pro instance stejné velikosti nějakým způsobem agregovat. Definice 5. Označme si t A (x) počet instrukcí, které algoritmus A provede pro instanci x L. Časová složitost v nejhorším případě je definovaná Time A (n) = max{t A (x) x L, x = n}. Složitost v průměrném případě je pak x L, x =n Time A (n) = t A(x). {x x = n} Jedním z využití složitosti (mimo zřejmé využití k porovnání algoritmů) je rozdělení problémů na prakticky řešitelné a na praktický neřešitelné. Jak ovšem přiřadit složitost k problému? Definice 6. Necht U je algoritmický problém. O(g(n)) je horním omezením složitosti problému U, pokud existuje algoritmus A řešící U takový, že Time A (n) O(g(n)). ω(f(n)) je dolním omezením složitosti problému U, pokud pro každý algoritmus B řešící U platí, že Time B (n) ω(f(n)) Za horní omezení složitosti problému bereme složitost nejlepšího známého algoritmu. Nalézt dolní omezení složitosti je oproti tomu mnohem komplikovanější. Musíme totiž vyloučit existenci algoritmu se složitostí danou dolní hranicí nebo lepší. To je netriviální a pro naprostou většinu problémů je taková hranice neznámá (vyloučíme-li například hranici danou tím, že algoritmus musí přečíst celý vstup). Příkladem problému, pro který je tato hranice známá je například třídění porovnáváním, pro které neexistuje algoritmus se složitostí lepší než O(n log n). Problémy rozdělujeme na prakticky řešitelné a prakticky neřešitelné pomocí jejich horního omezení složitosti. Rozdělení je následující problém považujeme za praktický řešitelný, pokud pro je jeho horní omezení složitost O(p(n)), kde p(n) je polynom. Tedy, problém je praktický řešitelný, pokud pro něj existuje algoritmus s nejhůře polynomickou složitostí. ostatní problémy považujeme za prakticky neřešitelné. Proč polynomická složitost? Polynom je největší funkce, která neroste rychle. U tohoto důvodu předpokládáme, že stupeň polynomu nebude extrémně velký (např. 100). U většiny známých algoritmů s polynomickou složitostí, není stupeň polynomu vyšší než 10. Druhým důvodem je to, že polynomy jsou uzavřené vzhledem k násobení (vynásobením dvou polynomů dostaneme zase polynom). Pokud uvnitř algoritmu A spouštíme nejvíše polynomický počet krát algoritmus B s nejhůře polynomickou složitostí, má tento algoritmus také nejhůře polynomickou složitost (přitom samozřejmě předpokládáme, že pokud bychom považovali složitost algoritmu B při analýze A za konstantu, bude složitost A mít nejhůře polynomickou složitost). V podstatě tedy můžeme efektivní algoritmy skládat do sebe (analogicky volání funkcí při programování) a získaný algoritmus bude také efektivní. 3
4 Asymptotická notace Definice 7. O(f(n)) je množina všech funkcí g(n) takových, že existují kladné konstanty c a n 0 takové, že 0 g(n) cf(n) pro všechna n n 0. Ω(f(n)) je množina všech funkcí g(n) takových, že existují kladné konstanty c a n 0 takové, že g(n) cf(n) 0 pro všechna n n 0. Θ(f(n)) je množina všech funkcí g(n) takových, že existují kladní konstanty c 1, c 2 a n 0 takové, že 0 c 1 f(n) g(n) c 2 f(n) všechna n n 0. Zápis g(n) = O(f(n)) je příkladem tzv. jednostranné rovnosti (v následujících úvahách lze zaměnit Ω a Θ za O). Rovnítko v ní interpretujeme jinak, než je obvyklé (což je zřejmé, na obou stranách rovnosti nejsou objekty stejného typu). Korektně by měl být vztah zapsán jako g(n) O(f(n)), nicméně použití rovnítka se již zažilo a stalo se de facto standardem. Pro pochopení významu rovností, ve kterých se asymptotická notace nachází na levé i na pravé straně, si stačí uvědomit, že výraz, ve kterém se tato notace nachází představuje množinu funkcí. Tedy například výraz n 3 + O(n) je množina {n 3 + f(n) f(n) O(n)}. Protože na obou stranách = jsou množiny a jedná se o jednosměrnou rovnost, interpretujeme = jako. Pro aritmetiku s množinami funkcí platí intuitivní pravidla. Uvážíme-li množiny funkcí S a T, pak platí S + T = {g + h g S, h T}, S T = {g h g S, h T}, S T = {g h g S, h T}, S T = {g h g S, h T}. Skládání funkce s množinou funkcí provedeme obdobně, f(o(g(n))) = {f(h(n)) h O(g(n))}. Například log O(n 2 ) je množina logaritmů z funkcí omezených shora kvadrikou. Pokud jsou asymptotické výrazy vnořeny, pak množiny sjednotíme, tedy například O(g(n) + O(f(n))) = {O(h) h g(n) + O(f(n))}. 4
5 Rozděl a panuj Základní kostra algoritmu RaP pro vstup I je následující: 1. Pokud je I < b pro pevně danou konstantu b, je výsledek triviální nebo jej počítáme jiným algoritmem. Algoritmus A tento výsledek jenom vrátí. 2. Z instance I vygenerujeme instance I 1, I 2,..., I k, takové, že I > I i pro všechna 1 i k. 3. Rekurzivně zavoláme algoritmus A pro I 1, I 2,..., I k. 4. Výsledky rekurzivních zavolání zkombinujeme do výsledku aktuálního zavolání a tento výsledek vrátíme. V algoritmech realizujících techniku Rozděl a panuj můžeme rozpoznat dvě oddělené fáze, které ji dali název. Během první fáze, které říkáme Rozděl, algoritmus vygeneruje množinu menších instancí. Během druhé fáze, pojmenované jako Panuj, sestavíme ze řešení vypočtených pro menší instance řešení instance původní. Příkladem algoritmu používající strategii rozděl a panuj je MergeSort (který již všichni znáte). Algoritmus 1 Mergesort 1: procedure MergeSort(A, l, p) 2: if p < l then 3: q (l + p)/2 rozděl 4: MergeSort(A, l, q) 5: MergeSort(A, q + 1, p) 6: Merge(A, l, q, p) panuj 1: procedure Merge(A, l, q, p) 2: n 1 q l + 1 3: n 2 r q 4: for i 0 to n 1 1 do 5: L[i] A[l + 1] 6: for i 0 to n 1 1 do 7: R[i] A[q + i + 1] 8: L[n 1 ] R[n 2 ] 9: i j 0 10: for k l to p do 11: if L[i] R[j] then 12: A[k] L[i] 13: i i : else 15: A[k] R[j] 16: j j + 1 Analýza časové složitosti Díky rekurzivním zavoláním se složitost nedá vyjádřit přímo, ale musíme ji vyjádřit pomocí rekurence. Označímeli tuto složitost T(n), pak T(b) = Θ(1), k T( I ) = T( I k ) + f( I ). i=1 Pro instanci o velikosti menší nebo rovno b je složitostí algoritmu konstanta (první řádek kostry algoritmu). Pro zbylé instance algoritmus spočítá instance menší (řádek 2) a kombinuje výsledky rekurzivních zavolání (řádek 4), složitost těchto řádků je vyjádřena funkcí f(n). Abychom spočetli složitost celého algoritmu, musíme ještě přičíst sumu složitostí rekurzivních zavolání, tedy sumu k i=1 T( I k ). Složitost chceme vyjádřit v uzavřené formě, to je ve formě, která neobsahuje rekurentní volání sebe sama na pravé straně rovnosti (hledání uzavřené formy se říká řešení rekurence). Rekurence můžeme vyřešit přesně, nebo pokud je přesné řešení obtížné se spokojíme s odhadem uzavřené formy. V takovém případě se spokojíme s výsledkem v asymptotické notaci. 5
6 Snadná rekurence 1: Hanojské věže T(n) = 2T(n 1) + 1 T(1) = 1 Hodnoty pro prvních pár čísel n T(n) Tipneme, že T(n) = 2 n 1, pokusíme se výsledek dokázat indukcí. Pro n = 1 rovnost triviálně platí. Předpokládejme, že platí pro n 1. Pak T(n) = 2T(n 1) 1 = 2(2 n 1 1) = 2 n 1. Snadná rekurence 2: Krájení Pizzy T(0) = 1 T(n) = T(n 1) + n Rekurenci rozvineme: T(n) = T(n 1) + n =. = T(n 2) + (n 1) + n = = n = = 1 + n(n + 1) 2 Výsledek ještě dokážeme indukcí. Pro n = 0 rovnost triviálně platí. Předpokládejme, že platí pro n 1, pak substituční metoda T(n) = T(n 1) + n = n(n 1) n = Postup pro odhad pomocí O notace (pro Ω notaci je postup analogický): n(n + 1) Odhadneme uzavřenou formu pomocí asymptotické notace, tj že uzavřená forma patří do O(g(n)) pro nějakou funkci g(n). 2. Vybereme jednu funkci f(n) z asymptotického odhadu, při specifikaci funkce můžeme využít konstant. Pro tuto funkci indukcí dokážeme, že T(n) f(n), čímž dokážeme, že T(n) = O(g(n)). Během důkazu lze zvolit vhodné hodnoty konstant. 6
7 Příklad 1: T(n) = T( n/2 ) + T( n/2 ) + 1 T(1) = 1 Odhadneme jako O(n). Vybereme funkci cn b = O(n), c > 0, b jsou konstanty. Chceme dokázat T(n) cn b pro nějaké hodnoty konstant b, c. To uděláme indukcí. Indukční předpoklady jsou: Dokážeme nerovnost pro T(n). T( n/2 ) c( n/2 ) b T( n/2 ) c( n/2 ) b T(n) = T( n/2 ) + T( n/2 ) + 1 c( n/2 ) b + c( n/2 ) b + 1 cn 2b + 1 = = cn b + ( b + 1) Zvolíme b = 1 a tím dostaneme T(n) cn 1, což jsme chtěli dokázat. Zbývá ověřit případ, kdy n = 1. Nerovnost T(1) = 1 cn 1 platí pro jakéhokoliv c 2. Dohromady jsme dokázali, že T(n) 2n 1 a tedy T(n) = O(n). Příklad 2: T(n) = 2T( n/2 ) + n T(1) = 1 Odhadneme je O(n lg n). Pokud vybereme funkci cn lg n můžeme dokázat správnost obecného indukčního kroku pro c 1 T(n) 2(c n/2 lg( n/2 ) + n cn lg(n/2) + n = cn lg n cn lg 2 + n cn lg n U okrajové podmínky ovšem narazíme na problém. T(1) = 1 1 lg 1 = 0 Můžeme využít toho, že dokazujeme asymptotický odhad a nerovnost proto může platit až od určitého n 0. Pro n > 3 už T(n) nezávisí na T(1), ale stačí znát T(2) a T(3). Volbou n 0 = 2 můžeme posunout okrajovou podmínku směrem nahoru (čímž případ n = 1, který způsobuje problémy, z důkazu vypustíme) a nahradit okrajovou podmínku pomocí s tím, že nyní musí být c 2. T(2) = 4, T(3) = 5, 7
8 f(n) f(n) f(n 1 ) f(n 2 ) f(n k ) + k i=1 f(n k) počet listů Obrázek 1: Idea metody odhadu pomocí stromu rekurze = výsledek Odhad pomocí stromu rekurze Metoda odhadu pomocí stromu rekurze je založená na jednoduché myšlence. Rekurentní vztah T(n) = k T(n i ) + f(n). i=1 si představíme jako strom. Uzly stromu odpovídají jednotlivým rekurzivním voláním. Každému uzlu přiřadíme množství práce, kterou pomyslný algoritmus při daném volání provede. Listové uzly tak budou mít přiřazenu konstantu, která odpovídá okrajovým podmínkám rekurentního vztahu. Množství práce vnitřních uzlů pak odpovídá aplikaci funkce f na argument daného rekurzivního volání. V kořenu tedy provedeme f(n) práce, v jeho i-tém potomku pak f(n i ). Přirozeně, pokud sečteme práci přiřazenou všem uzlům, dostaneme řešení rekurence. Součet provedeme ve dvou krocích. Nejdříve pro každou úroveň stromu sečteme práci provedenou v uzlech na oné úrovni, poté sečteme sumy z jednotlivých vrstev. Příklad: T(n) = 2T(n/4) + n 2 T(1) = 1 Začněme konstruovat strom rekurze. Kořenu přiřadíme n 2. Potomkům kořene, kteří odpovídají T(n/4) přiřadíme (n/4) 2. Uzlům v další vrstvě, odpovídajícím T(n/16) (rekurzivní volání s argumentem n/4) přiřadíme (n/16) 2. V první vrstvě se nachází 2 uzly, suma práce je tedy 2(n/4) 2, v druhé vrstvě se nachází 4 uzly, suma je tedy 4(n/16) 2. Nyní si můžeme všimnout určité pravidelnosti. Práce, kterou provedeme v jednom uzlu v i-té vrstvě (kořen je v nulté vrstvě) odpovídá (n/4 i ) 2, počet uzlů v i-té vrstvě je 2 i, suma přes všechny uzly v této vrstvě je tedy 2 i (n/4 i ) 2 = n 2 /8 i. Listy se nacházejí ve vrstvě log 4 n, jejich počet je tedy 2 log 4 n = n 1/2. Odvození tohoto: víme, že log 2 n = log 4 n log 4 2 a tedy log 4 n = log 2 n log 4 2. Dosadíme do 2 log 4 n a dostaneme 2 log 2 n log 4 2 = n log 4 2. Pokud nyní sečteme všechny vrstvy, dostaneme T(n) = log 4 n 1 i=0 (n 2 /8 i ) + n 1/2 log 4 n 1 = n 2 (1/8 i ) + n 1/2 i=0 8
9 n 2 n 2 n 2 16 n 2 16 n 2 8 n n n n n n log 4 2 Obrázek 2: Strom rekurze pro rekurenci T(n) = 2T(n/4) + n 2 Abychom se zbavili závislosti na n v sumě, nahradíme ji sumou celé geometrické posloupnosti. Dostaneme tedy log 4 n 1 T(n) = n 2 (1/8 i ) + n 1/2 n 2 i=0 i=0 (1/8 i ) + n 1/2 = n /8 + n1/2 Odhad řešení rekurence je O(n 2 ). Master theorem Pečlivé vyřešení metody stromu pro specifický druh rekurencí dá následující větu. Porovnáváme rychlost růstu strom (n log b a je počet listů) s rychlostí růstu funkce f(n) (ze znění věty). Věta 1. Necht a 1 a b 1 jsou konstanty a f(n) je funkce a T(n) je definovaná na nezáporných celých číslech pomocí rekurence T(n) = at(n/b) + f(n), přičemž n/b interpretujeme jako n/b nebo n/b. Pak můžeme T(n) následovně asymptoticky omezit. 1. Pokud f(n) = O(n log b a ɛ ) pro nějaké ɛ > 0, pak T(n) = Θ(n log b a ). 2. Pokud f(n) = Θ(n log b a ), pak T(n) = Θ(n log b a lg n). 3. Pokud f(n) = Ω(n log b a+ɛ ) pro nějaké ɛ > 0 a pokud af(n/b) cf(n) pro konstantu 0 < c < 1 a všechna dostatečně velká n, pak T(n) = Θ(f(n)). Rychlé násobení velkých čísel Jsou dána dvě čísla A a B (v binárním zápisu, celý postup lze upravit pro zápis čísel v jakékoliv soustavě), a chceme spočítat A B. Algoritmus násobení pod sebe ze základní školy má složitost O(n 2 ). Předpokládáme poziční reprezentaci kladných čísel ve dvojkové soustavě. Číslo A je reprezentováno sekvencí bitů a n 1 a n 2... a 0 (pro n, které je mocninou 2) pokud platí, že A = n i=0 a i2 i. Uvažme čísla A 1 dané 9
10 sekvencí bitů a n 1... a n/2 a A 2 dané sekvencí bitů a n/ a 0. Pak platí, že A = A 1 2 n/2 + A 2. Můžeme psát AB = (A 1 2 n/2 + A 2 )(B 1 2 n/2 + B 2 ) = A 1 B 1 2 n + (A 1 B 2 + B 1 A 2 )2 n/2 + A 2 B 2 Mohli bychom navrhnout rekurzivní algoritmus, který pro n-bitová čísla A, B určí A 1,A 2, B 1, B 2 (to jsou všechno (n/2)-bitová čísla), rekurzivně spočítá součiny A 1 B1, A 1 B 2, A 2 B 1, A 2 B 2 a s jejich pomocí pak spočte výsledek podle předchozího vztahu. Rekurzi ukončíme v momentě, kdy násobíme jednobitová čísla. Protože násobení mocninou dvou můžeme realizovat pomocí bitového posuvu, který má lineární složitost, a sčítání čísel má také lineární složitost, je složitost navrhovaného algoritmu dána rekurencí T(n) = 4T(n/2) + O(n) T(1) = O(1), jejímž řešením je Θ(n 2 ). Abychom dosáhli algoritmu s menší složitostí, musím ubrat rekurzivní zavolání. To můžeme provést díky následující úvaze: a proto A 1 B 2 + A 2 B 1 = A 1 B 2 + A 2 B 1 + A 1 B 1 A 1 B1 + A 2 B2 A2B2 = A 1 B 1 + A 2 B 2 + A 1 (B 2 B 1 ) + A 2 (B 2 B 1 ) = A 1 B 1 + A 2 B 2 + (A 1 A 2 )(B 2 B 1 ), AB = A 1 B 1 2 n + [A 1 B 1 + A 2 B 2 + (A 1 A 2 )(B 2 B 1 )]2 n/2 + A 2 B 2 Nyní stačí jenom tři rekurzivní zavolání, musíme spočítat A 1 B 1, A 2 B 2 a (A 1 A 2 )(B 2 B 1 ). Složitost algoritmu tak klesne na O(n log 2 3 ). Vzniklo nebezpečí, že budeme muset násobit záporná čísla. To lze ale snadno obejít tím, že si nejdříve spočítáme znaménko výsledku, a pak vynásobíme absolutní hodnoty čísel. Algoritmus 2 Násobení velkých čísel 1: procedure Multiply(X,Y,n) 2: s sign(x) sign(y) 3: X abs(x) 4: Y abs(y) 5: if n = 1 then 6: return X Y s 7: A číslo tvořené n/2 levými bity X 8: B číslo tvořené n/2 pravými bity X 9: C číslo tvořené n/2 levými bity Y 10: D číslo tvořené n/2 pravými bity Y 11: m 1 Multiply(A, C, n/2) 12: m 2 Multiply(A B, D C, n/2) 13: m 3 Multiply(B, D, n/2) 14: return s (shift(m 1, n) + shift(m 1 + m 2 + m 3, n/2) + m 3 ) Rychlé násobení polynomů Součin funkcí f a g je funkce f g definovaná jako (f g)(x) = f(x)g(x) pro každé x. Polynom je funkce A(x) = a 0 + a 1 x + a 2 x Číslům a 0, a 1,... říkáme koeficienty. Exponent nejvyšší mocniny mezi členy s nenulovým koeficientem je stupeň polynomu. Při zápisu polynomu můžeme všechny jeho členy s vyššími mocninami než je jeho stupeň vynechat. Součin AB(x) polynomů je definován jako součin funkcí. Algoritmus pro násobení polynomů roznásobením závorek má složitost O(n 2 ), kde n je maximum ze stupňů polynomů. Polynomy totiž mají maximálně n + 1 členů a násobíme každý člen s každým. 10
11 Reprezentace polynomů Polynom můžeme reprezentovat pomocí posloupnosti jeho koeficientů, tj. polynom A(x) = a 0 + a 1 x + a 2 x a d x d je lze reprezentovat jako [a 0, a 1, a 2... a d ] nebo [a 0, a 1, a 2... a d, 0, 0, 0] (napravo můžeme přidat tolik nul, kolik potřebujeme). Alternativní reprezentace polynomu je dána následující větou. Věta 2. Polynom stupně d je jednoznačně reprezentován svými hodnotami v alespoň d + 1 různých bodech. Polynom lze tedy reprezentovat i hodnotami tohoto polynomu v potředném počtu různých bodů. Tento počet musí být alespoň tak velký jako je počet koeficientů daného polynomu, ale může být větší. Mezi oběma reprezentacemi můžeme přecházet, jak je demostrováno na následujícím obrázku. Koeficienty a 0,a 1,...,a d Vyhodnocení Interpolace Hodnoty A(x 0 ),A(x 1 ),...,A(x d ) Příklad: Polynom x 3 +x+2 je reprezentován pomocí koeficientů jako [2, 1, 0, 3]. Pro reprezentaci pomocí hodnot musíme zvolit alespoň 4 různé body, zvolme tedy 1, 2, 3, 4. Reprezentace hodnotami potom je [4, 12, 32, 70]. Násobení v reprezentaci pomocí hodnot Máme-li polynomy A a B reprezentovány hodnotami ve stejných bodech, můžeme získat reprezentaci polynomu AB tak, že reprezentace polynomu A a B po složkách vynásobíme. Tato operace má lineární složitost. Musíme si ovšem dát pozor na to, aby výsledná reprezentace měla dostatečný počet položek. Tedy, pokud má A stupeň s a B stupeň t, má AB stupeň s + t, pak podle předchozí věty potřebujeme hodnoty polynomu AB v alespoň s+t+1 různých bodech. Odtud plyne, že i pro polynomy A a B musíme mít hodnoty v alespoň t+s+1 bodech. Idea algoritmu Algoritmus pro rychlé násobení by měl pracovat následovně. Pro vstupní polynomy A a B (stupňů s a t): 1. vybereme alespoň s + t + 1 různých bodů a spočteme hodnoty polynomů A a B v těchto bodech. 2. pro každý bod pak vynásobíme hodnotu polynomu A v tomto bodě a hodnotu polynomu B v tomto bodě. Dostaneme tak hodnotu polynomu AB v tomto bodě. 3. z hodnot polynomu AB interpolujeme koeficienty a vrátíme je jako výsledek. Bod 2 lze provést s lineární složitostí. Abychom dostali složitost lepší než O(n 2 ), potřebujeme provést body 1. a 3. se složitostí lepší než O(n 2 ). Vyhodnocení polynomu a rychlá fourierova transformace Problém vyhodnocení polynomu je následující: vstupem je polynom v reprezentaci pomocí n koeficientů. Výsledkem je jeho reprezentace pomocí hodnot v n různých bodech. Tyto body si můžeme zvolit libovolně. Algoritmus, ve kterém do polynomu příslušné hodnoty dosadíme a spočítáme výsledek, má složitost O(n 2 ). Pro každý bod totiž musíme spočítat hodnoty O(n) členů polynomu a bodů je n. Pro naše účely je tedy tento algoritmus nevyhovující. Pro rychlý výpočet hodnot polynomu i interpolaci lze použít Rychlou Fourierovu Transformaci (FFT). V dalším budeme předpokládat, že n je mocninou dvou. To nás nijak neomezuje: (a) reprezentace pomocí koefieficientů může rozšířít přidáním nul na konec, (b) pro reprezentaci pomocí hodnot můžeme použít větší než potřebný počet bodů. Protože body, pro které chceme hodnoty polynomu spočítat si můžeme zvolit libovolně, zvolíme body ±x 0, ±x 1, ± x n/2 1. (1) 11
12 Později uvidíme, proč je taková volba výhodná. Polynom rozdělíme na členy se sudými a s lichými mocninami A(x) = (a 0 + a 2 x ) + x(a 1 + a 3 x ) Všimneme si, že oba výrazy v závorkách jsou opět polynomy. Výraz (a 0 + a 2 x ) je polynom A S (z) = a 0 + a 2 z +..., do kterého dosadíme x 2 za z, a tedy (a 0 + a 2 x ) = A S (x 2 ). Stejnou úvahou dostaneme pro polynom v pravé závorce polynom A L (z) = a 1 + a 3 z +..., pro který platí (a 1 + a 3 x ) = A L (x 2 ). Polynomy A S a A L jsou reprezentovány n/2 koeficienty. Hodnoty polynomu A pro ±x i pak lze vyjádřit jako A(x i ) = A s (x 2 i) + x i A l (x 2 i), (2) A( x i ) = A s (x 2 i) x i A l (x 2 i). (3) Na vztazích vidíme, proč bylo výhodné zvolit si dvojice opačných bodů. Platí totiž, že x 2 = ( x) 2 a tedy i A S (x 2 ) = A S (( x) 2 ) a A L (x 2 ) = A L (( x) 2 ). K výpočtu hodnot polynomu A v n bodech tedy potřebujeme vypočítat hodnoty polynomů A S a A L v n/2 bodech. Na základě této úvahy můžeme sestavit algoritmus, který pracuje následovně: 1. určíme A S a A L 2. rekurzivně spočítáme hodnoty polynomů A S a A L v bodech x 2 0, x 2 1,..., x 2 n/ pomocí (2) a (3) spočteme hodnoty polynomu A v bodech ±x 0, ±x 1, ± x n/2 1 Příklad Uvažujme polynom 3x 3 + 2x 2 + x 3. Pak algoritmus projde postupně následující strom polynomů (A S vlevo, A L vpravo). Body, ve kterých se hodnoty počítají ještě neuvažujeme. 3x 3 + 2x 2 + x 3 2x 2 3; A s (z) = 2z 3 x(3x 2 + 1); A L (z) = 3z + 1 A S (z) = 3 A L (z) = 2 A S (z) = 1 A L (z) = 3 Řekněme, že v předchozím příkladě budeme chtít spočítat hodnoty polynomu pro body ±x 0, ±x 1. Při rekurzivním volání pak musíme spočítat hodnoty polynomů (2z 3) a (3z + 1) pro x 2 0 a x 2 1. Problém je, že x 2 0 a x 2 1 nemohou být opačná čísla, protože druhé mocniny reálných čísel jsou vždycky kladné. Abychom našli takové body, jejichž druhá mocnina je záporná, musíme přejít od reálných čísel ke komplexním. Nejjednodušší je případ, kdy je polynom stupně 1 a hodnoty počítáme pouze pro dvojici bodů (když je polynom jenom konstanta, je jeho hodnotou vždy tato konstanta a tedy nemá smysl volit body dvojici opačných bodů). Zvolme pro tuto úroveň rekurze (tedy úroveň stromu rekurze, na které se vyskytují polynomy stupně 1) body ±1. O úroveň výše (úroveň, na které se vyskytují polynomy stupně 3) potřebujeme 2 páry bodů, druhá mocnina jednoho páru se musí rovnat 1, druhá mocnina druhého páru se musí rovnat 1. Přirozeně tyto body jsou ±1, ±i, kde i je imaginární jednotka. Opakováním této konstrukce získáme body, pro které potřebujeme spočítat hodnoty polynomu v kořeni stromu rekurze (viz obrázek 3). Každá z úrovní stromu na obrázku 3 obsahuje právě všechny odmocniny z 1. Přesněji, je-li v dané úrovni n uzlů, obsahuje právě všechny n 1. Algoritmus FFT využívá následujících vlastností n 1. 12
13 ( i) ( i) ( i) ( i) i i 1 1 i i Obrázek 3: Idea nalezení bodů pro výpočet hodnoty polynomu pomocí FFT. Potomci každého uzlu jsou jeho druhé odmocniny. 1 Pro n = 2 k platí, že (a) n-té odmocniny jedné jsou ω 0 = 1, ω, ω 2,..., ω n 1, kde ω = e 2πi n. (b) ω n 2 +j = ω j (c) Množina druhých mocnin n 1 jsou právě {1, ω 2, (ω 2 ) 2,..., (ω 2 ) n/2 1 }, tedy n/2-té odmocniny 1. Tyto vlastnosti nám umožňují iterovat přes všechny n 1. Stačí spočítat ω a pak iterovat přes její mocniny. Konec iterace poznáme podle toho, že se dostaneme na hodnotu 1. Například pro n = 4 je ω = i a jednotlivé mocniny jsou postupně ω 2 = 1, ω 3 = i, ω 4 = 1. Vlastnost (b) říká, že množina všech n 1 tvoří opravdu dvojice opačných bodů a k jejich nalezení stačí iterovat pouze přes polovinu mocnin. Druhá polovina jsou právě opačné body. Například pro n = 4 máme ω = i a opačný bod je ω 1+2 = ω 3 = i, pro ω 2 = 1 je opačný bod ω 2+2 = ω 4 = 1. Díky (c) v rekurzivních voláních skutečně počítáme s druhými mocninami bodů. Algoritmus 3 Rychlá Fourierova transformace 1: procedure FFT(A[0,..., n 1], ω) n je mocnina dvou 2: if ω = 1 then V tomto případě už A = 1 3: return A 4: for i 0 to n/2 1 do 5: A S [i] A[i 2] Koeficienty pro sudé mocniny 6: A L [i] A[i 2 + 1] Koeficienty pro liché mocniny 7: S FFT(A S, ω 2 ) 8: L FFT(A L, ω 2 ) 9: x 1 Začínáme od ω 0 10: for j 0 to n/2 1 do 11: R[j] S[j] + x L[j] Rovnice (2) 12: R[j + n/2] S[j] x L[j] Rovnice (3) 13: x x ω Další mocnina ω 14: return R Složitost FFT vyjádříme pomocí rekurence. V algoritmu jsou dvě rekurzivní volání, každému z nich předáváme instanci o velikosti n/2. Zbývající část algoritmu (tedy cykly na řádcích 4 až 6 a 10 az 13) má složitost O(n). Rekurence je tedy T(n) = 2T(n/2) + O(n) T(1) = O(1) Podle master theoremu je pak složitost FFT vyjádřena Θ(n log n). Připomeňme si, že algoritmus přímým dosazením do polynomu má složitost O(n 2 ). Nyní si můžeme ukázat rychlý algoritmus pro násobení polynomů. Necht A a B jsou polynomy, které chceme násobit se stupni s a t. Výsledný polynom AB bude mít stupeň s+t. Abychom tedy mohli interpolovat z hodnot 13
14 výsledného polynomu jeho koeficienty, potřebujeme jich znát nejméně s + t + 1. Pro potřeby FFT ovšem musí být počet hodnot mocninou dvou, proto je skutečně počítaný počet hodnot roven n = 2 log 2(s+t+1), tedy nejbližší větší mocnině dvou. Algoritmus nejdříve volá FFT, aby spočítal hodnoty A a B v n bodech, poté tyto body vynásobí a získá hodnoty v těchto bodech pro AB. Posledním krokem je interpolace koeficientů. Díky vlastnostem n 1 ji lze vypočítat také pomocí FFT. Pro hodnoty AB(ω 0 ), AB(ω), AB(ω 2 ),..., AB(ω n 1 ) dostaneme koeficienty ab 0, ab 1,..., ab n 1 pomocí [ab 0, ab 1,..., ab n 1 ] = 1 n FFT([AB(ω0 ), AB(ω), AB(ω 2 ),..., AB(ω n 1 )], ω 1 ). Algoritmus 4 Rychlé násobení polynomů 1: procedure FastPolyMultiply(A[0,..., s], B[0,..., t]) 2: n 2 log 2(s+t+1) 3: ω e 2πi n 4: Doplň pomocí nul A i B na n prvků. Nuly přidávám na konec 5: V A FFT(A, ω) Hodnoty pro A 6: V B FFT(B, ω) Hodnoty pro B 7: for i 0 to n 1 do 8: V AB [i] V A [i] V B [i] Násobení polynomů 9: return 1 n FFT(V AB, ω 1 ) Interpolace pomocí FFT Složitost FastPolyMultiply je O(n log n). Algoritmus třikrát volá FFT se složitostí O(n log n). Zbylé části mají složitost O(n). Celkově je tedy složitost dominována FFT. 14
15 Dynamické programování Jak dynamické programování funguje? Princip demonstrujeme na problému výpočtu n-tého Fibonacciho čísla. Je to příklad specifický v tom, že ukazuje princip dynamického programování v kontrastu k principu rozděl a panuj. Není ovšem obecné pravidlo, že dynamické programování lze použít pouze na problémy, pro které princip rozděl a panuj vede k neefektivnímu algoritmu. Viz kapitola Proč dynamické programování funguje. Připomeňme si, že Fibonacciho čísla je definována následujícím rekurentním vztahem { F(n 1) + F(n 2) n 2 F(n) = n n {0, 1} Nabízí se použít algoritmus rozděl a panuj, který následuje Algoritmus 5 n-té Fibonacciho číslo pomocí rozděl a panuj 1: procedure FibDQ(n) 2: if n = 0 or n = 1 then 3: return n 4: return FibDQ(n 1) + FibDQ(n 2) (4) Složitost FibDQ můžeme vyjádřit jako rekurenci T(n) = T(n 1) + T(n 2) + O(1), odhadem jejíhož řešení je O(2 n ) (lze snadno vidět metodou stromu). Algoritmus má tedy velmi nevýhodnou složitost. Pokud si visualizujeme strom rekurzivního volání, zjistíme, že problém je v opakovaném volání procedury pro stejný argument, viz. obrázek 4 (a). Problém odstraníme tak, že si pro každé číslo, pro které jednou zavoláme FibDQ, zapamatujeme výsledek, který vrátil. Při opakovaném rekurzivním volání pro tuto podinstanci zapamatovanou hodnotu použijeme. Algoritmus 6 n-té Fibbonaciho číslo s pamatováním si mezivýsledků 1: procedure PrepareTable(n) 2: t[0] 0 3: t[1] 1 4: for i 2 to n do 5: t[i] 1 6: return t 7: 8: procedure FibHelp(n, t) 9: if t[n] = 1 then 10: t[n] FibTab(n 1) + FibTab(n 2) 11: return t[n] 12: 13: procedure FibTab(n) 14: return FibHelp(n, PrepareTable(n)) Složitost FibTab je lineární. Lze snadno vidět, že k rekurzivnímu volání na řádku 10 dojde pro každé číslo (a tedy pro každou podinstanci) maximálně jedenkrát. Ve zbylých případech je vrácena v tabulce zapamatovaná hodnota. Strom rekurzivních volání pak vypadá jako na obrázku 4 (b). Složitost algoritmu můžeme ještě zlepšit: časovou složitost o faktor 2, který z pohledu asymptotické notace nezanedbatelný (dostaneme ale mnohem hezčí algoritmus); pamět ovou složitost zlepšíme z lineární (velikost tabulky) na konstantní. Pozorování z předchozího příkladu: 1. Omezíme opakovaný výpočet pro stejné instance, ke kterému dochází u přístupu rozděl a panuj tak, že si výsledky pamatujeme (například v tabulce). 15
16 F(6) F(6) F(5) F(4) F(5) F(4) F(4) F(3) F(3) F(2) F(4) F(3) F(3) F(2) F(2) F(1) F(2) F(1) F(1) F(0) F(3) F(2) F(2) F(1) F(1) F(0) F(1) F(0) F(1) F(0) F(2) F(1) F(1) F(1) (a) FibDQ (b) FibTab Obrázek 4: Rekurzivní strom volání výpočtu Fibbonaciho čísla 2. instance, které se v průběhu výpočtu vyskytnou, vhodně uspořádáme. Označme jako I i I j situaci, kdy k výpočtu výsledku instance I j potřebujeme znát řešení instance I i. Dynamické programování můžeme použít pouze tehdy, pokud v množině všech instancí uspořádané podle nejsou cykly. To znamená, že neexistuje žádná instance, k jejímuž výpočtu potřebujeme znát výsledek jí samotné. Situaci lze visualizovat pomocí orientovaného grafu. Za vrcholy grafu vezmeme všechny instance, z I i vede hrana do I j právě když I i I j. Pak lze dynamické programování použít, právě když nejsou v tomto grafu cykly. Graf bez cyklů totiž lze linearizovat. To znamená, že nalezneme takové lineární uspořádání instancí, že pro každé dvě instance platí, že pokud I i I j, pak i I i I j. Graf odpovídající je pak řetěz. Situace je demonstrována na obrázku Instance řešíme od nejmenší podle jejich lineárního uspořádání. Předchozí bod zajišt uje, že vždy známe řešení všech instancí, které jsou k sestavení řešení pro aktuální instanci potřeba. 4. Ze vstupní instance jsme schopni najít nejmenší instance, přesněji pro takové, které jsou podle minimální (v grafu do nich nevede žádná hrana). Toto je potřeba, abychom mohli výpočet spustit. Hledat další instance není nutné, lze je sestavovat až v průběhu výpočtu. Proč dynamické programování funguje? Pokud pro výpočet výsledku pro instanci I potřebujeme znát výsledky instancí I j (pro nějaká j, těchto instancí může být více), tak se řešení instance I překrývá s řešeními instancí I j. Například pro problém Fibonacciho čísel: F(2) = F(0) + F(1) = F(3) = F(1) + F(2) = 1 + (0 + 1) F(4) = F(2) + F(3) = (0 + 1) + (1 + (0 + 1)) F(5) = F(3) + F(4) = [1 + (0 + 1)] + [(0 + 1) + (1 + (0 + 1))] Algoritmus 7 n-té Fibonacciho číslo pomocí dynamického programování 1: procedure FibIdeal(n) 2: if n = 0 then 3: return n 4: a 0 5: b 1 6: for n 2 to n 1 do 7: c a + b 8: a b 9: b c 16
17 c d a b c a e d b c a e d b e (a) Orientovaný graf bez cyklů (b) Lineární uspořádání vrcholů (c) Jeden z možných průběhů výpočtu Obrázek 5: Linearizovaná podoba grafu F(5) se překrývá s F(4) a F(3) (překrývá se i s menšími instancemi, to ale pro výpočet F(5) není podstatné). V průběhu výpočtu, kdy počítáme směrem od menších instancí k větším (ve smyslu grafu závislostí mezi instancemi, viz obrázek 5), můžeme využít řešení menších instancí (které už máme spočítané) jako části řešení větších instancí. Úloha batohu Úloha batohu (KNAPSACK), jejíž definice následuje, je optimalizačním problémem. Formálně je úloha batohu určena následovně: Úloha batohu Instance: {(b, w 1,..., w n ) b, w 1,..., w n N} Přípustná řešení: sol(b, w 1,..., w n ) = {C {1,..., n} Cena řešení: cost(c, (b, w 1,..., w n )) = i C w i Cíl: maximum i C w i b} Pro instanci I = (b, w 1,..., w 5 ), kde b = 29, w 1 = 3, w 2 = 6, w 3 = 8, w 4 = 7, w 5 = 12, existuje jediné optimální řešení C = {1, 2, 3, 5} s cenou cost(c, I) = 29. Lze snadno ověřit, že všechna ostatní přípustná řešení mají menší cenu. Uvažujme vstupní instanci I = (b, w 1,..., w n ). Jako I(i, c), kde 0 i n a 0 c b, označíme instanci (c, w 0,..., w i ). Přitom platí, že I = I(n, b) Mezi optimálními řešeními instancí I(i, c) s i > 0 platí: 1. Pokud položka i nepatří do optimálního řešení instance I(i, c), pak je toto řešení shodné s optimálním řešením instance I(i 1, c). 2. Pokud položka i patří do optimálního řešení instance I(i, c) (a tedy nutně platí w i c), pak toto řešení obdržíme tak, že k optimálnímu řešení instance I(i 1, c w i ) přidáme položku i. Pokud známe optimální řešení instancí I(i 1, c) a I(i 1, c w i ), můžeme spočítat optimální řešení instance I(i, c). K tomu musíme rozhodnout, jestli položka i do tohoto řešení patří. To můžeme udělat na základě cen optimálních řešení instancí I(i 1, c) a I(i 1, c w i ). Označme jako OPT(i, c) cenu optimálního řešení instance I(i, j). Pak platí: 1. Pokud položka i do optimálního řešení nepatří, pak OPT(i, c) = OPT(i 1, c) 2. Pokud položka i do optimálního řešení patří, pak OPT(i, c) = OPT(i 1, c w i ) + w i. 17
18 Pokud w i > c, pak položku i do řešení nemůžeme dát, protože se tam nevejde. Jinak se rozhodneme na základě toho, které z čísel OPT(i 1, c) a OPT(i 1, c w i ) + w i je větší. Protože úloha batohu je maximalizační problém, vybereme tu možnost, která vede k řešení s větší cenou. Z předchozího jde vidět, že instance lze uspořádat bez cyklů. Platí totiž, že I(i 1, c w i ) I(i, c) a současně I(i 1, c) I(i, c). Minimální prvky vzhledem k tomuto uspořádání jsou vždycky I(0, d) pro nějakou kapacitu d, což odpovídá instanci, kde nemáme žádné položky pro vkládání do batohu. I(i, 0) pro nějaké i, což odpovídá prázdné kapacitě (a nemá cenu řešit, které prvky z w 1,..., w i 1 dám do řešení, protože kapacita je prázdná) Algoritmus můžeme rozdělit do dvou částí: 1. Spočítám OPT(i, j) pro 0 i n a 0 c b a výsledky uložím do tabulky. 2. Na základě tabulky spočítám optimální řešení. Z cen optimálního řešení instancí I(i 1, c) a I(i 1, c w i ) dostaneme cenu optimálního řešení instance I(i, c): { max(opt(i 1, c), OPT(i 1, c wi ) + w OPT(i, c)) = i ) pokud w i c OPT(i 1, c) jinak (5) Dále pro minimální prvky platí, že cost(i(0, d)) = 0 (nemám prvky, které bych do řešení zařadil) a cost(i(i, 0)) = 0 (prázdná kapacita a nemůžu do řešení zařadit žádné prvky). Nyní si už můžeme napsat algoritmus, s pomocí kterého spočítáme cenu řešení I(n, b). Algoritmus si vytváří tabulku, jejíž řádky odpovídají jednotlivým položkám, které chceme vložit do batohu, uvažujeme i jeden řádek odpovídající žádné položce. Sloupce tabulky odpovídají číslům 0, 1,..., b, tedy všem číslům potenciálně se vyskytujícím jako kapacita některé instance. Na místo v tabulce na řádku odpovídajícím položce i a číslu c spočítáme cenu optimálního řešení instance I(i, c). To můžeme tak, že první řádek a první sloupec vyplníme nulami. Poté můžeme po řádcích doplňovat další místa tabulky podle vztahu (5). Nakonec na místě odpovídajícím I(n, b) je cena řešení vstupní instance I(n, b). Zbývá si říci, jak nalézt skutečné řešení, nikoliv jeho cenu. Toho lze dosáhnout zpětným inženýrstvím vztahu (5). Vezmeme cenu I(n, b), pokud b w n < 0, pak n do řešení nepatří a posuneme se k podinstanci I(n 1, b); v opačném případě se podíváme na ceny x = OPT(n 1, b w n ) a y = OPT(n 1, b). Pokud platí, že x+w n > y, pak w n do řešení patří, pokud x + w n < y, pak w n do řešení nepatří. Jsou-li si x a y rovny, můžeme zvolit jak chceme. Postup poté opakujeme pro tu podinstanci, jejíž cena byla větší. KnapsackDP vytváří tabulku o rozměrech n b. Pro vyplnění každého políčka je potřeba konstantní počet operací. Složitost nalezení řešení v hotové tabulce je je lineární vzhledem k n. Můžeme tedy konstatovat, že složitost algoritmu je O(n b). Složitost algoritmu tedy není závislá jenom na velikosti instance měřené jako počet čísel w 1,..., w n, ale i na velikosti největšího čísla se v instanci vyskytujícího. Toto je zajímavá vlastnost. Pokud bychom například vynásobili všechna čísla v instanci, kterou jsme si uvedli jako příklad, milionem, KnapsackDP by počítal řešení milionkrát déle. Intuitivně bychom však řekli, že obě dvě instance jsou stejně komplikované. 18
19 Algoritmus 8 Úloha batohu pomocí dynamického programování 1: procedure KnapsackDP(w 1,..., w n, b) 2: for i 0 to b do 3: M[0, i] 0 4: for i 0 to n do 5: M[i, 0] 0 6: for i 1 to n do 7: for c 1 to b do 8: if c < w i then 9: M[i, c] M[i 1, c] 10: else 11: M[i, c] max(m[i 1, c], M[i 1, c w i ] + w i ) 12: S 13: c b 14: for i n to 0 do 15: if c w i 0 and M[i 1, c] < M[i 1, c w i ] + w i then 16: S S {i} 17: c c w i 18: return S Hledání nejkratších cest v grafu Definice 8. Cesta z uzlu s do uzlu t v orientovaném grafu G je posloupnost vrcholů a hran P = u 0, e 0,..., e n 1, u n taková, že e i = (u i 1, u i ), u 0 = s, u n = t, a každý uzel u P se vyskytuje v cestě právě jednou. Definice 9. Cena c(p) cesty P v ohodnoceném grafu (G = (V, E), c) je suma ohodnocení všech hran vyskytujících se v cestě. Definice 10. Nejkratší cesta z uzlu s do uzlu t v grafu G je taková cesta P, pro kterou platí, že c(p) c(r) pro každou cestu R z uzlu s do uzlu t. Nalezení nejkratší cesty Instance: orientovaný graf (G = (V, E), c), s, t V Přípustná řešení: sol(g, s, t) = {P P je cesta z uzlu s do uzlu t} Cena řešení: Cíl: cost(p, G, s, t) = c(p) minimum Floyd-Warshall algoritmus Vrcholy grafu označíme V = {1, 2,..., n}. Jako I(i, j, k) označíme instanci, s následujícími vlastnostmi: Grafem je podgraf grafu G indukovaný vrcholy {1,..., k} {i, j}. Podgraf grafu G indukovaný množinou vrcholů F je graf s množinou vrcholů F a všemi hranami z grafu G, které mají oba koncové vrcholy v množině F. Počáteční vrchol je i, cílový vrchol je j. Cenu optimálního řešení I(i, j, k) označíme jako OPT(i, j, k). Optimální řešení instance I(i, j, k) můžeme určit na základě následující úvahy. Pokud je nejkratší cesta pro I(i, j, k) rozdílná (tj. kratší) než nejkratší cestav pro I(i, j, k 1), pak musí nutně vést přes uzel k a platí OPT(i, j, k) = OPT(i, k, k 1) + OPT(k, j, k 1), 19
20 protože nová cesta se skládá z cesty z uzlu i do uzlu k a z cesty z uzlu k do uzlu j. Pokud tedy známe nejkratší cesty (a jejich ceny) pro instance I(s, t, k 1) pro všechna s a t, můžeme rozhodnout o tom, jestli nejkratší cesta pro I(s, t, k) vede přes uzel k. Je tomu tak, právě když platí, že OPT(i, k, k 1) + OPT(k, j, k 1) < OPT(i, j, k 1). (6) V tomto případě je totiž cesta, kterou obdržíme spojením optimálního řešení instancí I(i, k, k 1) a I(k, j, k 1), kratší než cesta, která nevede přes uzel k. Musíme se vyrovat se situací, kdy cesta z i do j v instanci I(i, j, k) neexistuje. Uděláme to následovně: pokud cesta z i do j v instanci I(i, j, k) neexistuje, pak nastavíme OPT(i, j, k) =. Při reálné implementaci nahradíme nějakým dostatečně velkým číslem, například číslem větším než suma ohodnocení všech hran v grafu. Platí pak, že pokud OPT(i, j, k) =, cesta mezi i a j neexistuje, protože všechny cesty v grafu mají menší cenu. Představme si nyní situaci, kdy cesta v instanci I(i, j, k 1) neexistuje, tedy platí OPT(i, j, k 1) =. Pak Pokud OPT(i, k, k 1) a OPT(k, j, k 1) pak nerovnost (6) platí, a najdeme cestu. Ve všech zbývajících případech nerovnost neplatí a dostaneme, že OPT(i, j, k) =. Nerovnost (6) se tedy chová správně vzhledem k neexistujícím cestám. Z předchozí diskuze je vidět, že instance lze uspořádat podle třetí komponenty: k výpočtu pro instanci I(,, k), potřebujeme znát řešení instancí I(,, k 1). Minimální prvky jsou pak instance I(i, j, 0). Pokud existuje hrana mezi uzly i a j, máme OPT(i, j, 0) = c((i, j)), jinak nastavíme OPT(i, j, 0) =. Algoritmus 9 Nejkratší cesty v grafu 1: procedure Floyd-Warshall(G = (V, E), c) 2: for i 1 to n do: 3: for j 1 to n do: 4: D[i, j] = 5: P[i, j] = 6: for (i, j) E do: 7: D[i, j] = c((i, j)) 8: for k 1 to n do: 9: for i 1 to n do: 10: for j 1 to n do: 11: x D[i, k] + D[k, j] 12: if x < D[i, j] then 13: D[i, j] x 14: P[i, j] k 15: return D, P 16: 17: procedure GetPath(P,i,j) 18: mid P[i, j] 19: if mid = then i a j jsou spojeny jednou hranou 20: return [] 21: else 22: return GetPath(P, i, mid) + [mid]+getpath(p, mid, j) + je zřetezení seznamů Algoritmus Floyd-Warshall pro vstupní graf s n uzly vrátí matici D o velikosti n n, kde je na pozici (i, j) cena nejkratší cesty mezi uzly i a j. Dále vrací matici P o rozměrech n n, která na pozici (i, j) obsahuje uzel, přes který nejkratší cesta z i do j vede. Tuto matici poté využívá procedura GetPath, která s její pomocí cestu sestaví. Lze snadno vidět, že algoritmus má kubickou složitost Algoritmus nefunguje pro grafy, které obsahují tzv. záporné cykly. Záporný cyklus je takový cyklus, jehož suma hran je menší než 0. Opakováním tohoto cyklu můžeme získat potenciálně nekonečný tah. Záporný cyklus lze detekovat tak, že zkontrolujeme diagonálu matice D. Pokud se na ní nachází záporné číslo, leží uzel, který danému místu v matici odpovídá, na záporném cyklu. 20
21 Problém obchodního cestujícího Problém si lze představit následovně. Je dána množina měst a pro každá dvě města vzdálenost mezi nimi. Úkolem je nalézt takové uspořádání měst, že pokud je v tomto pořadí navštívíme a pak se vrátíme do počátečního města, urazíme nejkratší možnou vzdálenost. Problém obchodního cestujícícho Instance: Přípustná řešení: Cena řešení: Cíl: úplný neorientovaný graf s množinou uzlů V = {c 1,..., c n } a ohodnocením hran δ kružnice (cyklus) procházející přes všechny uzly (tzv. Hamiltonovy kružnice) součet ohodnocení hran na dané kružnici minimum Algoritmus využívá následujícího poznatku. Pokud pro každý uzel c V {c 1 } označíme cenu nejkratší cesty z c 1 do c vedoucí přes všechny uzly jako OPT[V {c 1 }, c], pak jistě můžeme cenu optimální cesty obchodního cestující nalézt jako min {OPT[V {c 1 }, c] + δ(c, c 1 ) c V {c 1, c}}. Označme jako S libovolnou neprázdnou podmnožinu množiny V {c 1 }. Jako OPT[S, c] označíme délku nejkratší cesty začínající v uzlu c 1, procházející všemi uzly v S a končící v uzlu c (přičemž předpokládáme, že c S). Hodnotu OPT[S, c] můžeme spočítat podle následujícího vztahu { δ(c 1, c) pokud S = 1 (tj. S = {c}), OPT[S, c] = (7) min {OPT[S {c}, c j ] + δ(c j, c) c j S {c}} jinak. První řádek předchozího vztahu je triviální. Z uzlu c 1 do uzlu c existuje jenom jedna cesta (hrana z c 1 do c) a její délka je δ(c 1, c). Ve druhém řádku předpokládáme, že známe délky nejkratších cest z c 1 do c j pro každé c j (tyto cesty vedou přes všechny uzly v množině S {c}). Tedy nevedou přes c. Každou z takových cest můžeme prodloužit na cestu z c 1 do c (ted cesta vede přes uzly v S) tak, že přidáme hranu z c j do c. Z takto vzniklých cest (pro každý uzel c i máme jednu) vybereme tu nejkratší (tj. ve vztahu určíme její cenu). Předchozí úvahy vedou k následujícímu algoritmu k výpočtu ceny optimální cesty obchodního cestujícího. Vlastní cestu lze určit pomocí pamatování si uzlu c j, pro který byl druhý řádek (7) minimální, pro každou dvojici S, c a poté zpětné projití tabulky (analogicky předchozím dvěma algoritmům). Algoritmus 10 Problém obchodního cestujícího 1: procedure DynamicTSP(V = {c 1,..., c n }, δ) 2: for all c V {c 1 } do 3: OPT[{c}, c] = δ(c 1, c) 4: for j 2 to n 1 do 5: for all S V {c 1 } such that S = j do 6: for all c S do 7: OPT[S, c] = min {OPT[S {c}, d] + δ(d, c) d S {c}} 8: return min{opt[v {c 1 }, c] + δ(c, c 1 ) c V {c 1 }} Protože algoritmus prochází všechny podmnožiny množiny V {c 1 } a pro každou z nich provede operace se složitostí omezenou O(n 2 ), je složitost algoritmu O(n 2 2 n ). 21
22 (a) Ohodnocený graf (b) Kostra s cenou 11 (c) Kostra s cenou 12 (d) Neni kostra Greedy algoritmy Obrázek 6: Příklady pojmů z definice 11. Algoritmus navržený touto technikou prochází při svém běhu sérií voleb, při každé z nichž vybírá tu možnost, která je v momentálně nejlepší (formulace toho, co znamená nejlepší záleží na konkrétním problému). Volba není založena na jejích možných důsledcích pro další běh algoritmu, je založena pouze na její ceně v momentě volby. Odtud pochází označení greedy (žravé) algoritmy. Algoritmus bez rozmyslu, žravě, vybírá tu aktuálně nejlepší možnost. Obecné schéma greedy algoritmu se dá shrnout do následujících kroků: 1. Pro vstupní instanci I algoritmus provede volbu x a na jejím základě vytvoři jednu menší instanci I. (Volba x je v tomto popisu abstraktní pojem, v reálném algoritmu to je reálný objekt, např. hrana grafu, číslo, množina, posloupnost bitů apod.) 2. Algoritmus poté rekurzivně aplikujeme na I. Řešení, které získáme pro I pak zkombinujeme s volbou x z předchozího kroku a obdržíme tak řešení pro I. 3. Rekurze končí v okamžiku, kdy je vstupní instance dostatečně malá. Protože rekurze ve naznačeném schématu je koncová (a je to tedy v podstatě jenom cyklus), lze algoritmus jednoduše převést do iterativní verze. Algoritmus pak tedy iterativně provádí kroky 1 a 2, přičemž si zapamatuje jednotlivé volby z kroku 1 a zkombinuje je do řešení až po ukončení cyklu (tedy v momentě, kdy už zpracováváme dostatečně malou podinstanci a rekurze by už skončila). Někdy lze jednotlivé volby kombinovat do řešení průběžně (např. pokud je řešením množina prvků a volby v jednotlivých krocích jsou prvky této množiny). Minimální kostra grafu Definice 11. Necht G = (V, E) je neorientovaný spojitý graf. Ohodnocení hran grafu G je zobrazení c : E Q přiřazující hranám grafu jejich racionální hodnotu, c(e) je pak ohodnocení hrany e E. Dvojici (G, c) říkáme hranově ohodnocený graf. Kostra grafu G je podgraf G = (V, E ) (G má stejnou množinu uzlů jako G!) takový, že (a) G neobsahuje kružnici, (b) G je spojitý graf. Pro každou dvojici uzlů u, v platí, že mezi nimi existuje cesta Cena kostry G = (V, E ) v ohodnoceném grafu je součet ohodnocení jejích hran, tj. e E c(e). Na obrázku 6 můžeme vidět konkrétní příklady pojmů z předchozí definice. V příkladu jsou dvě kostry s různými cenami. Vyřešit problém minimální kostry grafu znamená najít takovou kostru, jejíž cena je minimální, tj. takovou, že neexistuje jiná kostra s menší cenou. Následuje formální definice problému: 22
KMI/ALM3 Mgr. Petr Osička, Ph.D. ZS ANO je slovo 1 a kódováním NE je slovo 0, pak je problém popsán pomocí dvojice L, R takové, že:
Algoritmická matematika 3 KMI/ALM3 Mgr. Petr Osička, Ph.D. ZS 2014 Algoritmický problém Přednáška 1 Definice 1. Abeceda Σ je konečná neprázdná množina. Prvkům Σ říkáme symboly. Slovo (řetězec) nad abecedou
NÁVRH ALGORITMŮ. poznámky pro Algoritmickou matematiku 3. Petr Osička
NÁVRH ALGORITMŮ poznámky pro Algoritmickou matematiku 3 Petr Osička i Text obsahuje poznámky ke kurzu Algoritmická matematika 3. Petr Osička Olomouc, podzim 2017 Obsah 1 Úvod 1 2 Rozděl a panuj 6 3 Dynamické
Dynamické programování
Algoritmická matematika 3 KMI/ALM3 Mgr. Petr Osička, Ph.D ZS 2014 1 Základní princip Dynamické programování Princip dynamického programování je založen na podobné myšlence jako rozděl a panuj. Vstupní
Algoritmická matematika 3 Mgr. Petr Osička, Ph.D. ZS 2014. Rozděl a panuj
Algoritmická matematika 3 KMI/ALM3 Mgr. Petr Osička, Ph.D. ZS 2014 1 Základní princip Rozděl a panuj Technika rozděl a panuj je založená na následující myšlence. Z dané vstupní instance I vygenerujeme
Algoritmická matematika 3 Mgr. Petr Osička, Ph.D. ZS Základní pojmy
Algoritmická matematika 3 KMI/ALM3 Mgr. Petr Osička, Ph.D. ZS 2014 1 Pojmy problém a algoritmus Základní pojmy V této kapitole zavedeme dva základní pojmy potřebné pro kurz, problém a algoritmus. Slovo
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)
Algoritmizace složitost rekurzivních algoritmů. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010
složitost rekurzivních algoritmů Jiří Vyskočil, Marko Genyg-Berezovskyj 2010 Vyjádřen ení složitosti rekurzivního algoritmu rekurentním m tvarem Příklad vyjádření složitosti rekurzivního algoritmu rekurencí:
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)
YZTI - poznámky ke složitosti
YZTI - poznámky ke složitosti LS 2018 Abstrakt Poznámky k přednášce YZTI zabývající se složitostí algoritmických problémů a teorií NP-úplnosti. Složitost algoritmu a problému Zabýváme se už pouze rekurzivními
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í
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...
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
Polynomy. Mgr. Veronika Švandová a Mgr. Zdeněk Kříž, Ph. D. 1.1 Teorie Zavedení polynomů Operace s polynomy...
Polynomy Obsah Mgr. Veronika Švandová a Mgr. Zdeněk Kříž, Ph. D. 1 Základní vlastnosti polynomů 2 1.1 Teorie........................................... 2 1.1.1 Zavedení polynomů................................
9 Kolmost vektorových podprostorů
9 Kolmost vektorových podprostorů Od kolmosti dvou vektorů nyní přejdeme ke kolmosti dvou vektorových podprostorů. Budeme se zabývat otázkou, kdy jsou dva vektorové podprostory na sebe kolmé a jak to poznáme.
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:
1 Mnohočleny a algebraické rovnice
1 Mnohočleny a algebraické rovnice 1.1 Pojem mnohočlenu (polynomu) Připomeňme, že výrazům typu a 2 x 2 + a 1 x + a 0 říkáme kvadratický trojčlen, když a 2 0. Číslům a 0, a 1, a 2 říkáme koeficienty a písmenem
ALGORITMY A DATOVÉ STRUKTURY
Název tématického celku: Cíl: ALGORITMY A DATOVÉ STRUKTURY Metodický list č. 1 Časová složitost algoritmů Základním cílem tohoto tematického celku je vysvětlení potřebných pojmů a definic nutných k popisu
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
3. Třídy P a NP. Model výpočtu: Turingův stroj Rozhodovací problémy: třídy P a NP Optimalizační problémy: třídy PO a NPO MI-PAA
Jan Schmidt 2011 Katedra číslicového návrhu Fakulta informačních technologií České vysoké učení technické v Praze Zimní semestr 2011/12 MI-PAA EVROPSKÝ SOCIÁLNÍ FOND PRAHA & EU: INVESTUJENE DO VAŠÍ BUDOUCNOSTI
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
Třídy složitosti P a NP, NP-úplnost
Třídy složitosti P a NP, NP-úplnost Cíle přednášky: 1. Definovat, za jakých okolností můžeme problém považovat za efektivně algoritmicky řešitelný. 2. Charakterizovat určitou skupinu úloh, pro které není
Parametrické programování
Parametrické programování Příklad 1 Parametrické pravé strany Firma vyrábí tři výrobky. K jejich výrobě potřebuje jednak surovinu a jednak stroje, na kterých dochází ke zpracování. Na první výrobek jsou
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
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
Zpracoval: hypspave@fel.cvut.cz 7. Matematická indukce a rekurse. Řešení rekurentních (diferenčních) rovnic s konstantními koeficienty.
Zpracoval: hypspave@fel.cvut.cz 7. Matematická indukce a rekurse. Řešení rekurentních (diferenčních) rovnic s konstantními koeficienty. (A7B01MCS) I. Matematická indukce a rekurse. Indukční principy patří
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
IB112 Základy matematiky
IB112 Základy matematiky Řešení soustavy lineárních rovnic, matice, vektory Jan Strejček IB112 Základy matematiky: Řešení soustavy lineárních rovnic, matice, vektory 2/53 Obsah Soustava lineárních rovnic
Lingebraické kapitolky - Počítání s maticemi
Lingebraické kapitolky - Počítání s maticemi Jaroslav Horáček KAM MFF UK 20 Rozehřívačka: Definice sčítání dvou matic a násobení matice skalárem, transpozice Řešení: (A + B ij A ij + B ij (αa ij α(a ij
Vektorové podprostory, lineární nezávislost, báze, dimenze a souřadnice
Vektorové podprostory, lineární nezávislost, báze, dimenze a souřadnice Vektorové podprostory K množina reálných nebo komplexních čísel, U vektorový prostor nad K. Lineární kombinace vektorů u 1, u 2,...,u
Definice. Vektorový prostor V nad tělesem T je množina s operacemi + : V V V, tj. u, v V : u + v V : T V V, tj. ( u V )( a T ) : a u V které splňují
Definice. Vektorový prostor V nad tělesem T je množina s operacemi + : V V V, tj. u, v V : u + v V : T V V, tj. ( u V )( a T ) : a u V které splňují 1. u + v = v + u, u, v V 2. (u + v) + w = u + (v + w),
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
1 Lineární prostory a podprostory
Lineární prostory a podprostory Přečtěte si: Učebnice AKLA, kapitola první, podkapitoly. až.4 včetně. Cvičení. Které z následujících množin jsou lineárními prostory s přirozenými definicemi operací?. C
Složitost algoritmů. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol.
Složitost algoritmů Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol., 2017 Datové struktury a algoritmy, B6B36DSA 02/2017, Lekce 3
Interpolace Uvažujme třídu funkcí jedné proměnné ψ(x; a 0,..., a n ), kde a 0,..., a n jsou parametry, které popisují jednotlivé funkce této třídy. Mějme dány body x 0, x 1,..., x n, x i x k, i, k = 0,
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,
i=1 Přímka a úsečka. Body, které leží na přímce procházející body a a b můžeme zapsat pomocí parametrické rovnice
I. Funkce dvou a více reálných proměnných 1. Úvod Značení: V textu budeme používat označení: N pro množinu všech přirozených čísel; R pro množinu všech reálných čísel; R n pro množinu všech uspořádaných
Lineární algebra : Lineární prostor
Lineární algebra : Lineární prostor (3. přednáška) František Štampach, Karel Klouda LS 2013/2014 vytvořeno: 17. dubna 2014, 14:43 1 2 3.1 Aximotické zavedení lineárního prostoru Číselné těleso Celou lineární
1 Mnohočleny a algebraické rovnice
1 Mnohočleny a algebraické rovnice 1.1 Pojem mnohočlenu (polynomu) Připomeňme, že výrazům typu a 2 x 2 + a 1 x + a 0 říkáme kvadratický trojčlen, když a 2 0. Číslům a 0, a 1, a 2 říkáme koeficienty a písmenem
0.1 Úvod do lineární algebry
Matematika KMI/PMATE 1 01 Úvod do lineární algebry 011 Lineární rovnice o 2 neznámých Definice 011 Lineární rovnice o dvou neznámých x, y je rovnice, která může být vyjádřena ve tvaru ax + by = c, kde
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
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
příkladů do cvičení. V textu se objeví i pár detailů, které jsem nestihl (na které jsem zapomněl) a(b u) = (ab) u, u + ( u) = 0 = ( u) + u.
Několik řešených příkladů do Matematiky Vektory V tomto textu je spočteno několik ukázkových příkladů které vám snad pomohou při řešení příkladů do cvičení. V textu se objeví i pár detailů které jsem nestihl
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
KOMPLEXNÍ ČÍSLA INVESTICE DO ROZVOJE VZDĚLÁVÁNÍ
KOMPLEXNÍ ČÍSLA Gymnázium Jiřího Wolkera v Prostějově Výukové materiály z matematiky pro vyšší gymnázia Autoři projektu Student na prahu 21. století - využití ICT ve vyučování matematiky na gymnáziu INVESTICE
Úvod do lineární algebry
Úvod do lineární algebry 1 Aritmetické vektory Definice 11 Mějme n N a utvořme kartézský součin R n R R R Každou uspořádanou n tici x 1 x 2 x, x n budeme nazývat n rozměrným aritmetickým vektorem Prvky
1. Několik základních pojmů ze středoškolské matematiky. Na začátku si připomeneme následující pojmy:
Opakování středoškolské matematiky Slovo úvodem: Tato pomůcka je určena zejména těm studentům presenčního i kombinovaného studia na VŠFS, kteří na středních školách neprošli dostatečnou průpravou z matematiky
0.1 Úvod do lineární algebry
Matematika KMI/PMATE 1 01 Úvod do lineární algebry 011 Vektory Definice 011 Vektorem aritmetického prostorur n budeme rozumět uspořádanou n-tici reálných čísel x 1, x 2,, x n Definice 012 Definice sčítání
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ů,
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
úloh pro ODR jednokrokové metody
Numerické metody pro řešení počátečních úloh pro ODR jednokrokové metody Formulace: Hledáme řešení y = y() rovnice () s počáteční podmínkou () y () = f(, y()) () y( ) = y. () Smysl: Analyticky lze spočítat
Matematika (CŽV Kadaň) aneb Úvod do lineární algebry Matice a soustavy rovnic
Přednáška třetí (a pravděpodobně i čtvrtá) aneb Úvod do lineární algebry Matice a soustavy rovnic Lineární rovnice o 2 neznámých Lineární rovnice o 2 neznámých Lineární rovnice o dvou neznámých x, y je
PŘEDNÁŠKA 2 POSLOUPNOSTI
PŘEDNÁŠKA 2 POSLOUPNOSTI 2.1 Zobrazení 2 Definice 1. Uvažujme libovolné neprázdné množiny A, B. Zobrazení množiny A do množiny B je definováno jako množina F uspořádaných dvojic (x, y A B, kde ke každému
Kapitola 1. Úvod. 1.1 Značení. 1.2 Výroky - opakování. N... přirozená čísla (1, 2, 3,...). Q... racionální čísla ( p, kde p Z a q N) R...
Kapitola 1 Úvod 1.1 Značení N... přirozená čísla (1, 2, 3,...). Z... celá čísla ( 3, 2, 1, 0, 1, 2,...). Q... racionální čísla ( p, kde p Z a q N) q R... reálná čísla C... komplexní čísla 1.2 Výroky -
(Cramerovo pravidlo, determinanty, inverzní matice)
KMA/MAT1 Přednáška a cvičení, Lineární algebra 2 Řešení soustav lineárních rovnic se čtvercovou maticí soustavy (Cramerovo pravidlo, determinanty, inverzní matice) 16 a 21 října 2014 V dnešní přednášce
Výroková a predikátová logika - II
Výroková a predikátová logika - II Petr Gregor KTIML MFF UK ZS 2017/2018 Petr Gregor (KTIML MFF UK) Výroková a predikátová logika - II ZS 2017/2018 1 / 17 Předběžnosti Základní pojmy n-ární relace a funkce
1 Vektorové prostory.
1 Vektorové prostory DefiniceMnožinu V, jejíž prvky budeme označovat a, b, c, z, budeme nazývat vektorovým prostorem právě tehdy, když budou splněny následující podmínky: 1 Je dáno zobrazení V V V, které
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
1 Řešení soustav lineárních rovnic
1 Řešení soustav lineárních rovnic 1.1 Lineární rovnice Lineární rovnicí o n neznámých x 1,x 2,..., x n s reálnými koeficienty rozumíme rovnici ve tvaru a 1 x 1 + a 2 x 2 +... + a n x n = b, (1) kde koeficienty
Vrcholová barevnost grafu
Vrcholová barevnost grafu Definice: Necht G = (V, E) je obyčejný graf a k N. Zobrazení φ : V {1, 2,..., k} nazýváme k-vrcholovým obarvením grafu G. Pokud φ(u) φ(v) pro každou hranu {u, v} E, nazveme k-vrcholové
sin(x) x lim. pomocí mocninné řady pro funkci sin(x) se středem x 0 = 0. Víme, že ( ) k=0 e x2 dx.
Použití mocniných řad Nejprve si ukážeme dvě jednoduchá použití Taylorových řad. Příklad Spočtěte následující limitu: ( ) sin(x) lim. x x ( ) Najdeme lim sin(x) x x pomocí mocninné řady pro funkci sin(x)
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
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
Těleso racionálních funkcí
Těleso racionálních funkcí Poznámka. V minulém semestru jsme libovolnému oboru integrity sestrojili podílové těleso. Pro libovolné těleso R je okruh polynomů R[x] oborem integrity, máme tedy podílové těleso
Vztah teorie vyčíslitelnosti a teorie složitosti. IB102 Automaty, gramatiky a složitost, /31
Vztah teorie vyčíslitelnosti a teorie složitosti IB102 Automaty, gramatiky a složitost, 2. 12. 2013 1/31 IB102 Automaty, gramatiky a složitost, 2. 12. 2013 2/31 Časová složitost algoritmu počet kroků výpočtu
Přijímací zkouška - matematika
Přijímací zkouška - matematika Jméno a příjmení pište do okénka Číslo přihlášky Číslo zadání 1 Grafy 1 Pro který z následujících problémů není znám žádný algoritmus s polynomiální časovou složitostí? Problém,
10 Přednáška ze
10 Přednáška ze 17. 12. 2003 Věta: G = (V, E) lze nakreslit jedním uzavřeným tahem G je souvislý a má všechny stupně sudé. Důkaz G je souvislý. Necht v je libovolný vrchol v G. A mějme uzavřený eurelovský
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
Limita a spojitost funkce a zobrazení jedné reálné proměnné
Přednáška 4 Limita a spojitost funkce a zobrazení jedné reálné proměnné V několika následujících přednáškách budeme studovat zobrazení jedné reálné proměnné f : X Y, kde X R a Y R k. Protože pro každé
Lineární funkce, rovnice a nerovnice 4 lineární nerovnice
Lineární funkce, rovnice a nerovnice 4 lineární nerovnice 4.1 ekvivalentní úpravy Při řešení lineárních nerovnic používáme ekvivalentní úpravy (tyto úpravy nijak neovlivní výsledek řešení). Jsou to především
Parametrická rovnice přímky v rovině
Parametrická rovnice přímky v rovině Nechť je v kartézské soustavě souřadnic dána přímka AB. Nechť vektor u = B - A. Pak libovolný bod X[x; y] leží na přímce AB právě tehdy, když vektory u a X - A jsou
2. Určete jádro KerL zobrazení L, tj. nalezněte alespoň jednu jeho bázi a určete jeho dimenzi.
Řešené příklady z lineární algebry - část 3 Typové příklady s řešením Příklad 3.1: Zobrazení L: P 3 R 23 je zobrazení z prostoru P 3 všech polynomů do stupně 3 (včetně nulového polynomu) do prostoru R
Dosud jsme se zabývali pouze soustavami lineárních rovnic s reálnými koeficienty.
Kapitola 4 Tělesa Dosud jsme se zabývali pouze soustavami lineárních rovnic s reálnými koeficienty. Všechna čísla byla reálná, vektory měly reálné souřadnice, matice měly reálné prvky. Také řešení soustav
Soustavy lineárních rovnic a determinanty
Soustavy lineárních rovnic a determinanty Petr Hasil Přednáška z matematiky Podpořeno projektem Průřezová inovace studijních programů Lesnické a dřevařské fakulty MENDELU v Brně (LDF) s ohledem na discipĺıny
NP-úplnost problému SAT
Problém SAT je definován následovně: SAT(splnitelnost booleovských formulí) Vstup: Booleovská formule ϕ. Otázka: Je ϕ splnitelná? Příklad: Formule ϕ 1 =x 1 ( x 2 x 3 )jesplnitelná: např.přiohodnocení ν,kde[x
Necht tedy máme přirozená čísla n, k pod pojmem systém lineárních rovnic rozumíme rovnice ve tvaru
2. Systémy lineárních rovnic V této kapitole se budeme zabývat soustavami lineárních rovnic s koeficienty z pole reálných případně komplexních čísel. Uvádíme podmínku pro existenci řešení systému lineárních
Modely Herbrandovské interpretace
Modely Herbrandovské interpretace Petr Štěpánek S využitím materialu Krysztofa R. Apta 2006 Logické programování 8 1 Uvedli jsme termové interpretace a termové modely pro logické programy a také nejmenší
Matematika III přednáška Aplikace vytvořujících funkcí - další úlohy
S Matematika III - 14. přednáška Aplikace vytvořujících funkcí - další úlohy Michal Bulant Masarykova univerzita Fakulta informatiky 18. 12. 2007 Obsah přednášky Řešení rekurencí Q Exponenciální vytvořující
Funkce pro studijní obory
Variace 1 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 Funkce je přiřazení,
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)
Zavedení a vlastnosti reálných čísel
Zavedení a vlastnosti reálných čísel jsou základním kamenem matematické analýzy. Konstrukce reálných čísel sice není náplní matematické analýzy, ale množina reálných čísel R je pro matematickou analýzu
VEKTORY. Obrázek 1: Jediný vektor. Souřadnice vektoru jsou jeho průměty do souřadných os x a y u dvojrozměrného vektoru, AB = B A
VEKTORY Vektorem se rozumí množina všech orientovaných úseček, které mají stejnou velikost, směr a orientaci, což vidíme na obr. 1. Jedna konkrétní orientovaná úsečka se nazývá umístění vektoru na obr.
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,
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
. je zlomkem. Ten je smysluplný pro jakýkoli jmenovatel různý od nuly. Musí tedy platit = 0
Příklad 1 Určete definiční obor funkce: a) = b) = c) = d) = e) = 9 f) = Řešení 1a Máme určit definiční obor funkce =. Výraz je zlomkem. Ten je smysluplný pro jakýkoli jmenovatel různý od nuly. Musí tedy
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é
VYBRANÉ PARTIE Z NUMERICKÉ MATEMATIKY
VYBRANÉ PARTIE Z NUMERICKÉ MATEMATIKY Jan Krejčí 31. srpna 2006 jkrejci@physics.ujep.cz http://physics.ujep.cz/~jkrejci Obsah 1 Přímé metody řešení soustav lineárních rovnic 3 1.1 Gaussova eliminace...............................
Nejdřív spočítáme jeden příklad na variaci konstant pro lineární diferenciální rovnici 2. řádu s kostantními koeficienty. y + y = 4 sin t.
1 Variace konstanty Nejdřív spočítáme jeden příklad na variaci konstant pro lineární diferenciální rovnici 2. řádu s kostantními koeficienty. Příklad 1 Najděte obecné řešení rovnice: y + y = 4 sin t. Co
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é
Afinita je stručný název pro afinní transformaci prostoru, tj.vzájemně jednoznačné afinní zobrazení bodového prostoru A n na sebe.
4 Afinita Afinita je stručný název pro afinní transformaci prostoru, tj.vzájemně jednoznačné afinní zobrazení bodového prostoru A n na sebe. Poznámka. Vzájemně jednoznačným zobrazením rozumíme zobrazení,
Složitost 1.1 Opera ní a pam ová složitost 1.2 Opera ní složitost v pr rném, nejhorším a nejlepším p ípad 1.3 Asymptotická složitost
1 Složitost 1.1 Operační a paměťová složitost Nezávislé určení na konkrétní implementaci Několik typů operací = sčítání T+, logické T L, přiřazení T A(assign), porovnání T C(compare), výpočet adresy pole
vyjádřete ve tvaru lineární kombinace čtverců (lineární kombinace druhých mocnin). Rozhodněte o definitnosti kvadratické formy κ(x).
Řešené příklady z lineární algebry - část 6 Typové příklady s řešením Příklad 6.: Kvadratickou formu κ(x) = x x 6x 6x x + 8x x 8x x vyjádřete ve tvaru lineární kombinace čtverců (lineární kombinace druhých
Věta 12.3 : Věta 12.4 (princip superpozice) : [MA1-18:P12.7] rovnice typu y (n) + p n 1 (x)y (n 1) p 1 (x)y + p 0 (x)y = q(x) (6)
1. Lineární diferenciální rovnice řádu n [MA1-18:P1.7] rovnice typu y n) + p n 1 )y n 1) +... + p 1 )y + p 0 )y = q) 6) počáteční podmínky: y 0 ) = y 0 y 0 ) = y 1 y n 1) 0 ) = y n 1. 7) Věta 1.3 : Necht
[1] Determinant. det A = 0 pro singulární matici, det A 0 pro regulární matici
[1] Determinant je číslo jistým způsobem charakterizující čtvercovou matici det A = 0 pro singulární matici, det A 0 pro regulární matici používá se při řešení lineárních soustav... a v mnoha dalších aplikacích
MATICE. a 11 a 12 a 1n a 21 a 22 a 2n A = = [a ij]
MATICE Matice typu m/n nad tělesem T je soubor m n prvků z tělesa T uspořádaných do m řádků a n sloupců: a 11 a 12 a 1n a 21 a 22 a 2n A = = [a ij] a m1 a m2 a mn Prvek a i,j je prvek matice A na místě
Operace s maticemi. 19. února 2018
Operace s maticemi Přednáška druhá 19. února 2018 Obsah 1 Operace s maticemi 2 Hodnost matice (opakování) 3 Regulární matice 4 Inverzní matice 5 Determinant matice Matice Definice (Matice). Reálná matice
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é
NP-ÚPLNÉ PROBLÉMY. Doc. RNDr. Josef Kolář, CSc. Katedra teoretické informatiky, FIT České vysoké učení technické v Praze
NP-ÚPLNÉ PROBLÉMY Doc. RNDr. Josef Kolář, CSc. Katedra teoretické informatiky, FIT České vysoké učení technické v Praze BI-GRA, LS 2010/2011, Lekce 13 Evropský sociální fond Praha & EU: Investujeme do
Dijkstrův algoritmus
Dijkstrův algoritmus Hledání nejkratší cesty v nezáporně hranově ohodnoceném grafu Necht je dán orientovaný graf G = (V, H) a funkce, která každé hraně h = (u, v) H přiřadí nezáporné reálné číslo označované
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?
Matice přechodu. Pozorování 2. Základní úkol: Určete matici přechodu od báze M k bázi N. Každou bázi napíšeme do sloupců matice, např.
Matice přechodu Základní úkol: Určete matici přechodu od báze M k bázi N. Každou bázi napíšeme do sloupců matice, např. u příkladu 7 (v ) dostaneme: Nyní bychom mohli postupovat jako u matice homomorfismu