1. Binomiální haldy Zavedení binomiální haldy

Rozměr: px
Začít zobrazení ze stránky:

Download "1. Binomiální haldy Zavedení binomiální haldy"

Transkript

1 1. Binomiální haldy V této kapitole popíšeme datovou strukturu zvanou binomiální halda. Základní funkcionalita binomiální haldy je podobná binární haldě, nicméně jí dosahuje jinými metodami a navíc podporuje funkci BHMerge, která umí rychle sloučit dvě binomiální haldy do jedné. Shrňme na začátek podporované operace spolu s jejich časy. Číslo N udává počet prvků v haldě a haldu zde chápeme jako minimovou. Operace Čas Komentář BHInsert Θ(log N), Θ (1) Vloží nový prvek. BHGetMin Θ(1) Vrátí minimum množiny. BHExtractMin Θ(log N) Vrátí a odstraní minimum množiny. BHMerge Θ(log N) Sloučí dvě haldy do jedné. BHBuild Θ(N) Postaví z N prvků haldu. BHDecreaseKey Θ(log N) Sníží hodnotu klíče prvku. BHIncreaseKey Θ(log 2 N) Zvýší hodnotu klíče prvku. BHDelete Θ(log N) Smaže prvek. Notací Θ (1) rozumíme amortizovanou složitost Zavedení binomiální haldy Namísto jediného stromu (jako má binární halda) sestává binomiální halda ze sady tzv. binomiálních stromů. Binomiální stromy Definice: Binomiální strom řádu k (značíme B k ) je zakořeněný strom, pro který platí následující pravidla. 1 strom B 0 (řádu 0) obsahuje pouze kořen 2 strom B k pro k > 0 má kořen, který má právě k synů, přičemž tito synové jsou zároveň kořeny binomiálních stromů po řadě B 0, B 1 až B k 1. Náhled na strukturu binomiálního stromu získáme z obrázku 1.1. Také se podívejme, jak budou vypadat některé nejmenší binomiální stromy (viz obr. 1.2). B 0 B 1 B 2 B 3 B 4 Obr. 1.2: Příklady binomiálních stromů

2 B k... B 0 B 1 B k 2 B k 1 Obr. 1.1: Binomiální strom řádu k Podáme ještě jednu definici binomiálních stromů (tzv. rekurzivní definici binomiálních stromů), pro níž následně ukážeme její ekvivalenci s předchozí definicí. Definice: Zakořeněné stromy B k jsou definovány takto: B 0 obsahuje pouze kořen a pro k > 0 se B k skládá ze stromu B k 1, pod jehož kořenem je napojený další strom B k 1. = B k 1 B k B k 1 Obr. 1.3: Rekurzivní definice binomiálního stromu Lemma 1: Stromy B k a B k jsou izomorfní. Důkaz: Postupujme matematickou indukcí. Pro k = 0 tvrzení zjevně platí. Zvolme k > 0. Pod kořenem stromu B k jsou dle definice zavěšeny stromy B 0,..., B k 1. Odtržením posledního podstromu B k 1 od B k však dostáváme strom B k 1. To dává přesně definici stromu B k. Naopak, uvážíme-li strom B k, z indukce vyplývá, že B k 1 je izomorfní B k 1, pod jehož kořen jsou dle definice napojeny stromy B 0,..., B k 2. Pod kořen B k jsou tudíž napojeny stromy B 0,..., B k 1. Lemma 2: Počet hladin stromu B k je roven k + 1 a počet jeho vrcholů je roven 2 k. Důkaz: Dokážeme matematickou indukcí. Strom B 0 má jistě 1 hladinu a 2 0 = 1 vrchol. Zvolme k > 0. Z indukčního předpokladu vyplývá, že hloubka B k 1 je k a počet vrcholů je 2 k 1. Užitím předchozího lemmatu dostáváme, že strom B k je složený ze dvou stromů B k 1, z nichž jeden je o hladinu níže než druhý, což dává počet hladin k + 1 stromu B k. Složením dvou stromu B k 1 dostáváme 2 2 k 1 = 2 k vrcholů. Důsledek: Binomiální strom s N vrcholy má hloubku O(log N) a počet synů kořene je taktéž O(log N)

3 Od stromu k haldě Z binomiálních stromů nyní zkonstruujeme binomiální haldu. Pro uložení N = 2 l prvků stačí zvolit strom B l. Pro N 2 l využijeme vlastností dvojkového zápisu čísla N: haldu sestavíme z binomiálních stromů takový řádů, pro něž jsou nastaveny příslušné bity v čísle N. Definice: Binomiální halda obsahující N prvků se skládá ze souboru stromů T = T 1,..., T l, kde 1 Uchovávané prvky jsou uloženy ve vrcholech stromů T i. Prvek uložený ve vrcholu v V (T i ) značíme h(v). 2 Pro každý strom T i platí tzv. haldová podmínka, neboli pro každý v V (T i ) a jeho syny s 1,..., s k platí h(v) h(s j ), j = 1,..., k. 3 Každý strom T i je binomiální strom. 4 V souboru T se žádné dva řády binomiálních stromů nevyskytují dvakrát. 5 Soubor stromů T je uspořádán vzestupně podle řádu binomiálního stromu. Jako vhodný způsob uložení souboru stromů T tedy poslouží například spojový seznam. Ve spojovém seznamu lze i jednoduše udržovat seznamy synů jednotlivých vrcholů v binomiálním stromě. Tvrzení: Binomiální strom řádu k se vyskytuje v souboru stromů N-prvkové binomiální haldy právě tehdy, když je v dvojkovém zápisu čísla N nastavený k-tý nejnižší bit na 1. Důkaz: Z definice binomiální haldy vyplývá, že binomiální stromy dohromady dávají k i=1 b i2 i = N, kde k je maximální řád stromu v T a b i = 0 nebo b i = 1. Z vlastností zápisu čísla v dvojkové soustavě vyplývá, že pro dané N jsou čísla b i (a tím i řády binomiálních stromů v T ) určena jednoznačně. Čísla b k, b k 1,..., b 1 tedy tvoří zápis N v dvojkové soustavě. Důsledek: N-prvková binomiální halda sestává z O(log N) binomiálních stromů Operace s binomiální haldou Nalezení minima Jak jsme již ukázali u binární haldy, pokud strom splňuje haldovou podmínku, musí se minimum v něm uložené nacházet v jeho kořeni. Minimum cele haldy se tedy musí nacházet v jednom kořenů stromů T i. Operaci BHGetMin tedy postačí projít seznam T, což bude trvat čas O(log N). Operaci BHGetMin lze urychlit na čas Θ(1) tím, že binomiální haldu rozšíříme o ukazatel na globální minimum. Při každé další operaci nad binomiální haldou potom tento ukazatel přepočítáme, například průchodem seznamu T. Čtenář nechť si povšimne, že s vyjímkou amortizovaného BHInsert na to každá operace bude mít dostatek času

4 Slévání Operaci BHMerge poněkud netypicky popíšeme jako jednu z prvních, protože ji budeme nadále používat jako podproceduru ostatních operací. Algoritmus slévání vezme dvě binomiální haldy a vytvoří z nich jedinou, která obsahuje prvky obou hald a přitom zachovává všechny vlastnosti haldy popsané výše. V první fázi provedeme klasické slití dvou uspořádaných seznamů. Takto slitý seznam bude obsahovat stromy z obou hald, takže se může stát, že od některých řádů budou v seznamu stromy dva. V druhé fázi provedeme konsolidaci, která pospojuje stromy stejných řádů tak, aby zbyl od každého nejvýše jeden. Konsolidace bude probíhat následovně. Připravíme pomocné pole obsahující log 2 N +1 přihrádek (číslovaných od 0). Stromy ze seznamu rozdělíme do přihrádek tak, že v i-té přihrádce jsou všechny stromy řádu i. Poté projdeme všechny přihrádky počínaje od 0. Pokud v některé nalezneme alespoň dva stromy, spojíme tyto stromy do jednoho o řád většího stromu a nový strom vložíme do přihrádky s o jedna vyšším indexem. Na konec obsahy přihrádek pospojujeme ve správném pořadí do výsledného spojového seznamu. Algoritmus BHMerge Vstup: Binomiální haldy H 1, H 2 Výstup: Binomiální halda H out poskládaná z prvků H 1 a H 2 1. Pokud H 1 nebo H 2 je prázdná: 2. Vyřešíme triviálně a skončíme. (Slévání se nekoná.) 3. Slij seznamy H 1 a H 2 setříděně do H tmp. 4. Připrav pole P [0... log 2 H tmp ] spojových seznamů. 5. Pro všechny stromy s H tmp : 6. Odtrhni s ze seznamu H tmp. 7. Vlož s do P [řád(s)]. 8. H out nová prázdná halda 9. Pro všechny přihrádky i v P (počínaje od 0): 10. Pokud má P [i] alespoň dva stromy: 11. b 1, b 2 odtrhni první dva stromy z P [i]. 12. b BHMergeTree(b 1, b 2 ) 13. Vlož b do P [i + 1]. 14. Obsah P [i] připoj na konec H out. 15. Přepočítej v H out ukazatel na minimální prvek Spojení dvou stromů, které používáme v předchozím algoritmu je velice jednoduché. Při spojování je potřeba napojit kořen jednoho stromu jako posledního syna kořene druhého stromu. Přitom musíme dát pozor, aby zůstala zachována haldová podmínka, takže vždy zapojujeme kořen s větším prvkem pod kořen s menším prvkem

5 Procedura MergeTree Vstup: Stromy b 1, b 2 z binomiální haldy (řád(b 1 ) = řád(b 2 )) Výstup: Výsledný strom b out 1. Pokud kořen(b 1 ) kořen(b 2 ): 2. Připoj kořen(b 2 ) jako posledního syna pod kořen(b 1 ). 3. b out b 1 4. Jinak: 5. Připoj kořen(b 1 ) jako posledního syna pod kořen(b 2 ). 6. b out b 2 Tvrzení: Algoritmus BHMerge je korektní a jeho časová složitost je Θ(log N). Důkaz: Algoritmus konsolidace používá pouze cykly pevných délek (přes všechny prvky resp. přes všechny přihrádky), takže je zcela jistě konečný. Ukažme, že po konsolidaci nebudou ve výsledném spojovém seznamu dva stromy stejného řádu: V každé přihrádce se nikdy nevyskytují více než tři stromy. Na začátku mohou být nejvýše dva a nejvýše jeden může být přidán po slévání z přihrádky s o jedna menším indexem. Díky tomu je jasné, že po průchodu přihrádkami bude v každé nejvýše jeden strom, takže ve výsledné haldě se nemohou vyskytovat dva stromy se stejným řádem. Složitost slévání je přímo úměrná počtu přihrádek, které vytvoříme. V každé přihrádce jsou nejvýše 3 stromy (tedy konstantní počet) a za každou přihrádku provedeme také nejvýše jedno spojení stromů. Celková složitost v nejhorším případě bude tedy Θ(log N). Vkládání prvků a postavení haldy Operaci BHInsert vyřešíme snadno. Vytvoříme novou binomiální haldu obsahující pouze vkládaný prvek a následně zavoláme slévání hald. Snadno nahlédneme, že pouhé přeuspořádání stromů při přidání nového prvku tak, aby v seznamu nebyly dva stromy stejného řádu, může v nejhorším případě vyžadovat čas Θ(log N) operací. Algoritmus BHInsert Vstup: Binomiální halda H, vkládaný prvek x Výstup: Binomiální halda H s vloženým prvkem 1. Vytvoř binomiální haldu H tmp s jediným prvkem x. 2. H BHBHMerge(H, H tmp ) Tvrzení: Operace BHInsert má časovou složitost Θ(log N) worst-case. Pro na počátku N-prvkovou haldu trvá libovolná posloupnost K volání operace BHInsert čas O(N + K); BHInsert má tedy amortizovanou časovou složitost Θ(1). Důkaz: Jednoprvkovou haldu umíme určitě vytvořit v konstantním čase, takže těžiště práce bude ve slévání hald. Slévání zvládneme v čase Θ(log N), tedy i vkládání prvku bude mít v nejhorším případě logaritmickou časovou složitost

6 Slévání dvou hald skutečně pracuje v logaritmickém čase, avšak při vkládání má jedna ze slévaných hald pouze jeden prvek. V nejhorším případě se samozřejmě může stát, že původní halda má všechny stromy od B 0 až po B log2 N 1, takže při slévání dojde k řetězové reakci a postupně se všechny stromy sloučí do jediného, což si vyžádá Θ(log N) operací. Nicméně pokud je například počet prvků v původní haldě sudý, pak strom B 0 v jejím spojovém seznamu chybí a slévání s jednoprvkovou haldou je možné provést v konstantním čase. Poznamenejme ještě, že při slévání původní a nové jednoprvkové haldy, lze spojení seznamů provést v konstantním čase, takže nás budou z hlediska asymptotické složitosti zajímat pouze operace spojení dvou stromů. Pro amortizovanou analýzu využijeme skutečností dokázaných pro binární sčítačku. Připomeňme, že posloupnost K inkrementů v N-bitové binární sčítačce trvá čas O(N + K). Nyní si všimněme, že slití dvou binomiálních stromů přesně nastane v okamžiku, kdy se v inkrementované binární sčítačče dojde k součtu dvou jedničkových bitu. Počet bitových změn je tak úměrný počtu spojení binomiálních stromů. Z toho už jednoduše vyplývá celková časová složitost O(N + K) pro K volání operace BHInsert. Předešlá amortizovaná analýza operace BHInsert dává návod na realizaci rychlé operace BHBuild pro postavení binomiální haldy opakovaným voláním operace BHInsert. Důsledek: Posloupnost N volání operace BHInsert trvá čas Θ(N). Všimněme si, že narozdíl od binární haldy, jejíž rychlá stavba vyžadovala speciální postup, zde nám pro rychlé postavení binomiální haldy stačilo pouze lépe analyzovat časovou složitost. Odstranění minima Odstranění minima je nepatrně komplikovanější než vkládání prvků, nicméně opět použijeme operaci BHMerge. Při odstraňování nejprve nalezneme strom M, jehož kořen je minimem, a tento strom odpojíme z haldy. Následně odtrhneme všechny syny (včetně jejich podstromů) kořene M a vložíme je do nové binomiální haldy. Tato operace je poměrně jednoduchá, neboť se mezi syny dle definice binomiálního stromu nikdy nevyskytují dva stromy stejného řádu. Na konec slijeme novou haldu s původní, čímž se odtržené prvky začlení zpět. Algoritmus BHExtractMin Vstup: Binomiální halda H Výstup: Binomiální halda H s odstraněným minimem 1. m strom s nejmenším kořenem v haldě H. 2. Odeber m z H. 3. Vytvoř prázdnou binomiální haldu H tmp. 4. Pro každého syna s kořene stromu m:

7 5. Odtrhni podstrom s kořenem v s a vlož jej do H tmp. 6. Odstraň m. (Zbyde nám jen kořen, který odstraníme.) 7. H BHBHMerge(H, H tmp ) Tvrzení: Časová složitost operace BHExtractMin v N-prvkové binomiální haldě je Θ(log N). Lepší časové složitosti nelze dosáhnout. Důkaz: Vytvoření dočasné haldy pro podstromy odstraňovaného kořene zabere nejvýše tolik času, kolik podstromů do ni vkládáme tedy O(log N). Slévání hald má také logaritmickou složitost, takže celková složitost algoritmu v nejhorším případě je Θ(log N). Nemůžeme činit žádné předpoklady o tom, kolik synů má kořen obsahující minimum (nejvýše však O(log N), takže na rozdíl od vkládání zde bude amortizovaná složitost rovna složitosti v nejhorším případě. Dolní odhad složitosti odstraňování minima získáme z dolního odhadu složitosti třídění. Kdyby existoval rychlejší algoritmus na odstranění minima, zkonstruovali bychom rychlejší třídicí algoritmus než O(N log N) vložením tříděných prvků operací BHBuild do haldy a následně N-násobým odstraněním minima, což by dalo lepší časovou složitost než O(N log N). V úvodu této kapitoly jsme uvedli ještě operace BHDecreaseKey, BHIncreaseKey a BHDelete, které dostanou ukazatel na binomiální haldu a ukazatel na prvek v ní, a provedou po řadě snížení jeho klíče, zvýšení klíče a smazání prvku. Tyto operace přenecháme čtenáři jako cvičení 7, 8 a 9. Implementace a srovnání s regulární haldou Nyní je správný čas zeptat se, jaké výhody nám přinese binomiální halda oproti např. klasické binární. Pomineme-li, že binomiální haldy jsou zajímavé z hlediska teoretického, zbývají nám poměrně jasné ukazatele kvality časová a paměťová složitost. Časové složitosti základních operací přehledně shrnuje následující tabulka (hvězdičkou jsou označeny amortizované složitosti). Operace binární d-regulární binomiální Přístup k minimu Θ(1) Θ(1) Θ(1) Vkládání prvku Θ(log N) Θ(log d N) Θ(log N), Θ (1) Odstranění minima Θ(log N) Θ(d log d N) Θ(log N) Binomiální halda se od klasické binární haldy liší pouze v amortizované složitosti vkládání. Zde se ještě sluší připomenout, že binární haldu umíme postavit v lineárním čase, takže pokud bychom prvky nejprve vkládali do prázdné haldy a až po vložení všech prvků je začali odebírat, dostaneme se i s binární haldou na konstantní amortizovanou složitost vkládání. Binomiální halda může mít na druhou stranu navrch v situacích, kdy se často střídají operace vkládání a vypouštění prvků. Abychom mohli řádně porovnat paměťové nároky, potřebujeme nejprve upřesnit jak reprezentovat binomiální strom v paměti. Regulární haldy jsme bez potíží

8 zvládli uložit do pole. Pokud bychom se pokusili vtěsnat do pole binomiální strom, některé operace (např. spojení dvou stromů) nám značně podraží co do časové složitosti. Zkusíme tedy přímočarý přístup. Jednotlivé uzly stromu budou dynamicky alokované struktury, které provážeme ukazateli. Každý uzel pak bude obsahovat jeden prvek a pole odkazů na všechny své syny. Na první pohled by se mohlo zdát, že na takovou reprezentaci budeme potřebovat poměrně velké množství paměti. Každý uzel může mít až O(log N) synů, takže celý strom pak zabere O(N log N) paměti. Pozorný čtenář už jistě tuší, že se jedná pouze o hrubý horní odhad a že by mohl jít ještě vylepšit. Právě polovina uzlů jsou 1 totiž listy a nepotřebují tedy žádnou paměť na odkazy na syny. Naopak pouze jeden uzel (kořen) bude mít log 2 N synů. Zkusme se podívat, kolik takových ukazatelů bude v jednom binomiálním stromě. Na každý prvek odkazuje právě jeden ukazatel, takže bez ohledu na to, kolik má který uzel synů, v celém stromě je Θ(N) ukazatelů. Celková složitost pak bude Θ(N) na reprezentaci stromů a Θ(log N) na spojový seznam kořenů, což je ve výsledku Θ(N + log N) = Θ(N). V asymptotické paměťové složitosti si tedy binomiální halda v ničem nezadá s klasickou, avšak kvůli potřebě ukazatelů na prvky bude mít binomiální halda horší multiplikativní konstantu. Poslední věc, kterou je třeba vzít v úvahu je složitost implementace. Naprogramovat operace na klasické haldě je mnohem snazší, než naprogramovat haldu binomiální. Je tedy potřeba zvážit, zda se tato práce navíc vyplatí. Cvičení 1. Přeformulujte všechny definice a operace pro maximovou haldu. 2. Dokažte, že libovolné přirozené číslo x lze zapsat jako konečný součet mocnin dvojky 2 k1 + 2 k tak, že každé k i k j pro různá i, j. 3. Ukažte, že sčítanců v předchozím cvičení je nejvýše log 2 x 4. Upravte algoritmus BHMerge tak, aby nepotřeboval pole přihrádek, ale vystačil s konstantní pomocnou pamětí. Časovou složitost musíte pochopitelně zachovat. 5. U binomiální haldy jsme naznačili, že minimum (přesněji referenci na kořen obsahující minimum) můžeme udržovat stranou, abychom k němu mohli přistupovat v konstantním čase. Upravte operace slití, vkládání prvků a vypouštění minima tak, aby zároveň udržovali odkaz na minimum. Ukažte, že tato práce navíc nezhorší časové složitosti operací. 6. Mějme modifikaci binomiální haldy, ve které jsou stromy setříděné sestupně podle řádu (nikoli vzestupně). Opravte operaci slévání hald pro tuto reprezentaci, abyste přitom zachovali její časovou i paměťovou složitost. 7. Navrhněte operaci BHDecreaseKey s časovou složitostí Θ(log N). 8. Navrhněte operaci BHIncreaseKey s časovou složitostí Θ(log 2 N). 9. Navrhněte operaci BHDelete s časovou složitostí Θ(log N). 1 Pokud má strom řád alespoň

9 1.3. Líná binomiální halda Alternativou k pilné binomiální haldě je tzv. líná ( lazy ) binomiální halda. Její princip spočívá v odložení některých úkonů při vkládání prvků a odstranění minima, dokud nejsou opravdu potřeba. Změny v reprezentaci Líná binomiální halda se téměř neliší od pilné. Pouze povolíme, že se ve v souboru stromů může vyskytovat více stromů stejného řádu. Pro jednoduchost budeme navíc předpokládat, že soubor stromů je uložen v obousměrném kruhovém seznamu. Podívejme se, jaké výhody nám to přinese. Operace slití dvou hald, kterou využívá vkládání prvku i vypuštění minima se značně zjednoduší. Vzhledem k tomu, že se stromy mohou v haldě opakovat, slití není ničím jiným než spojením dvou seznamů, což jistě zvládneme v konstantním čase. Aby ale halda nezdegenerovala v obyčejný spojový seznam, musíme čas od času provést konsolidaci a stromy sloučit tak, aby jich bylo v seznamu co nejméně. Nejvhodnější čas na tento úklid je při hledání minima. Při hledání beztak procházíme všechny stromy v seznamu, takže je můžeme zároveň spojovat. Pozorný čtenář jistě nad předchozím odstavcem pozvedne obočí. Proč bychom nemohli použít stejný trik jako u pilné haldy a pamatovat si neustále ukazatel na strom s nejmenším kořenem? Takové vylepšení by bylo samozřejmě možné a konsolidaci bychom pak prováděli při odstranění minima (místo při hledání). Tímto vylepšením se však nebudeme zabývat a ponecháme jej na rozmyšlenou do cvičení. Konsolidace Konsolidace je velice podobná druhé fázi algoritmu Merge. Všechny stromy rozdělíme do log N + 1 přihrádek (číslovaných od 0) tak, že v i-té přihrádce se budou nacházet všechny stromy řádu i. Bohužel již nemůžeme činit žádné předpoklady o počtech stromů v jednotlivých přihrádkách. Z každé přihrádky budeme tedy odebírat stromy po dvou a slučovat je dokud to bude možné (zbude pouze jeden nebo žádný strom). Algoritmus LazyHeapConsolidation Vstup: Líná implementace binomiální haldy H o N prvcích Výstup: Zkonsolidovaná halda H 1. Pokud je H prázdná: Konec. 2. Připrav pole P [0... log N ] spojových seznamů. 3. Pro všechny stromy s v H: 4. Odtrhni s z H. 5. Vlož s do P [řád(s)]. 6. Pro všechny přihrádky i v P : 7. Dokud má P [i] alespoň dva stromy: 8. b 1, b 2 odtrhni první dva stromy z P [i]. 9. b BHBHMergeTree(b 1, b 2 )

10 10. Vlož b do P [i + 1]. 11. Pokud v P [i] zbyl strom s: 12. Odtrhni s z P [i] a vlož jej do H. Funkčnost algoritmu dokážeme velmi podobně, jako u slévání hald. V každé přihrádce nám zbude nejvýš jeden strom, takže se ve výsledné haldě nemohou nacházet dva stromy stejného řádu. O něco komplikovanější bude analyzovat časovou složitost. Časová složitost konsolidace Tvrzení: Časová složitost konsolidace líné binomiální haldy je Θ(N) v nejhorším případě a Θ(log N) amortizovaně. Důkaz: Pokud jsme do haldy jen vkládali, bude se skládat z N jednoprvkových stromů. Všechny stromy musíme nejprve vložit do správných přihrádek (což nám zabereθ(n)). Následně každý strom buď sloučíme s jiným (tzn. zapojíme pod kořen jiného stromu), nebo jej vložíme do výsledného spojového seznamu. Na to budeme potřebovat opět právě Θ(N) operací. Samozřejmě bychom neměli zapomenout na inicializaci a procházení všech přihrádek, avšak to nám zabere pouze Θ(log N), což je menší než výsledná lineární složitost. Na první pohled vidíme, že zřídka kdy bude konsolidace skutečně trvat Θ(N). Vždy musíme alespoň inicializovat a projít všechny přihrádky, takže konsolidace bude trvat nejméně Ω(log N). Amortizovanou složitost analyzujeme penízkovou metodou. Zavedeme pravidlo, že každý strom v haldě musí mít neustále uložen na svém účtu jeden peníz. Za tento peníz zvládne zaplatit libovolnou konstantní operaci 2. Spočteme, kolik operací se bude s každým stromem provádět při konsolidaci. Nejprve vložíme každý strom do příslušné přihrádky, což je určitě trvá Θ(1). Na následné spojování stromů můžeme nahlížet tak, že napojujeme jeden strom pod jiný (tedy jeden zanikne a jeden se pouze zvětší). Práci za toto napojení a následný přesun vzniklého stromu do nové přihrádky zaplatíme penízem stromu, který je napojován. Obě tyto operace jsou konstantní a každý strom může být napojen nejvýše jednou. Každý strom tedy ze svého konta zaplatí nejvýše konstantní počet operací. Na konci je potřeba ještě přesunout zbývající stromy do spojového seznamu a také zajistit, aby na svých kontech měly znovu jeden peníz. Na to již nemáme nikde našetřeno a budeme muset tuto složitost vykázat. Zbývajících stromů je však již nejvýš Θ(log N). Příprava a úklid přihrádek nám zabere také logaritmický čas, takže i vykázaná složitost bude Θ(log N). Na závěr se ještě podívejme, jak se nám promítnou tyto předpoklady do ostatních operací (vkládání prvku a odstranění minima). 2 Dokonce libovolné (konstantní) množství konstantních operací, neboť k Θ(1) = Θ(k) = Θ(1)

11 Důsledek: Časová složitost vkládání prvku do N-prvkové líné binomiální haldy je Θ(1) worst-case a časová složitost odstraňování minima je Θ (log N) amortizovaně. Důkaz: Při vkládání prvku vytvoříme jeden strom B 0, kterému dáme do vínku jeden peníz, a ten vložíme do haldy. Všechny úkony zvládneme v konstantním čase, takže celková složitost vkládání je Θ(1). Zde bychom měli zdůraznit, že se jedná o složitost v nejhorším případě, nikoli o amortizovanou složitost, jako tomu bylo u pilné haldy. Při odstraňování minima budeme předpokládat, že neustále udržujeme ukazatel na strom s nejmenším kořenem. Po odebrání minima a opětovném začlenění odtržených podstromů do haldy provedeme konsolidaci, při které ukazatel na minimum aktualizujeme. Po odtržení synů nejmenšího kořene musíme každému z nich dát na konto jeden peníz a vložit je do spojového seznamu. To nám zabere právě Θ(log N) času. Následná konsolidace bude trvat nejdéle Θ(N), avšak amortizovaně pouze Θ(log N), jak jsme již ukázali dříve. Srovnání pilné a líné binomiální haldy Líná binomiální halda má na rozdíl od pilné rychlejší vkládání prvků a garantuje, že i v nejhorším případě nebudeme potřebovat na vložení víc než konstantně mnoho času. Naproti tomu odebrání minima se může díky konsolidaci zpomalit až na Θ(N) v nejhorším případě. Naštěstí amortizovaná složitost odebírání zůstane na Θ(log N). Pro přehlednost se podívejme do následující tabulky (hvězdičkou jsou označeny amortizované složitosti): Operace Pilná halda Líná halda Vkládání prvku Θ(log N), Θ (1) Θ(1) Odstranění minima Θ(log N) Θ(N), Θ (log N) Význam líné binomiální haldy vzroste především v další kapitole, kde slouží jako předstupeň pro návrh tzv. Fibonacciho haldy. Cvičení 1. Zjistěte, jak by se změnily složitosti jednotlivých operací, kdybychom v implementaci používali místo obousměrného kruhového seznamu pouze jednosměrný lineární. 2. Zjistěte, jak by se změnily složitosti jednotlivých operací, kdybychom v implementaci používali místo obousměrného kruhového seznamu pouze jednosměrný lineární a udržovali zároveň ukazatel na poslední prvek seznamu. 3. Předpokládejme, že bychom chtěli neustále udržovat ukazatel na strom obsahující minimum jako v pilné implementaci. Upravte podle toho všechny operace s haldou. 4. Ukažte, že provedené modifikace nezhoršily časové složitosti jednotlivých operací

12 2. Fibonacciho haldy FIXME: motivace a intro 2.1. Denice haldy Modifikace binomiální haldy Fibonacciho haldy vychází z líné reprezentace binomiálních hald, avšak s lehce upravenou definicí binomiálního stromu. Pro efektivní implementaci DecreaseKey povolíme odtrhávání podstromů. Aby nám ale nevznikaly stromy, které budou příliš široké a málo hluboké (tedy stromy vysokého řádu s malým počtem prvků), zavedeme ještě pravidlo, že od každého vrcholu vyjma kořene může být odtržen nejvýše jeden syn. Pokud je odtržen druhý syn, odtrhneme zároveň vrchol samotný, čímž se z něj stane kořen. Jednotlivé stromy budeme udržovat v obousměrném spojovém seznamu stejně jako v případě binomiální haldy. Podívejme se, jak bude situace vypadat v nejhorším případě, kdy je ve stromě nejméně prvků. Představme si klasický binomiální strom řádu k. Každému vrcholu vyjma kořene odtrhneme syna s největším řádem. Takto očesaný strom budeme nazývat Fibonacciho strom a označíme jej F k, aby se nám nepletl s binomiálními stromy B k. F k... F 0 F 0 F 1 F k 3 F k 2 Obr. 2.1: Fibonacciho strom řádu k Povšimněme si, že kořen tohoto stromu má všechny syny kromě prvního snížené o jeden řád. Díky tomu má také dva syny řádu 0 a nejvyšší řád je k 2 (nikoli k 1 jak tomu bylo u binomiálních stromů). Podívejme se, jak bude vypadat několik Fibonacciho stromů nejnižších řádů. F 0 a F 1 jsou totožné s B 0 resp. B 1 a první změna je patrná až u F 2. Zamysleme se, zda by se Fibonacciho stromy nedaly popsat podobnou rekurzivní definicí, jako binomiální stromy. U binomiálních platilo, že strom řádu k je složen ze dvou stromů řádu k 1. V případě Fibonacciho stromů platí, že strom řádu k je složen ze stromů F k 1 a F k

13 F 0 F 1 F 2 F 3 F 4 Obr. 2.2: Příklady Fibonacciho stromů = F k F k 1 F k 2 Obr. 2.3: Rekurzivní definice Fibonacciho stromu Z rekurzivní definice je nejlépe vidět, proč jsou stromy pojmenovány po Fibonaccim. Stromy řádu 0 a 1 mají právě jeden prvek. Strom řádu k má potom F k 1 + F k 2 prvků. Jinými slovy, počet prvků Fibonacciho stromu řádu k odpovídá k-tému Fibonacciho číslu 1. Měli bychom také ukázat, že ani Fibonacciho stromů nebudeme potřebovat více než O(log N) na reprezentaci N prvků. Počet prvků stromu řádu k můžeme spočítat pomocí vzorečku na výpočet Fibonacciho čísel: ( F k = ) k+2 ( ) k Všimněme si exponenciálních členů první má základ a druhý První tedy bude asymptoticky dominantní, zatím co druhý bude konvergovat k 0. Vzhledem k tomu, že počet prvků roste exponenciálně s řádem stromu, řád závisí logaritmicky na počtu prvků. Podrobné odvození si dovolíme ponechat do cvičení. Než se pustíme do výkladu základních operací, připomeňme, že Fibonacciho stromy představují dolní odhad na naplnění stromů. Naopak binomiální stromy tvoří horní odhad naplnění a v běžných situacích budou stromy něčím mezi Základní operace Základní operace Fibonacciho haldy se téměř neliší od haldy binomiální. Hlavním rozdílem a zároveň motivací pro použití Fibonacciho haldy je přidání operace 1 Přesněji řečeno Fibonacciho číslu k + 2, neboť první dva stromy mají velikosti 1 a 2, zatímco Fibonacciho posloupnost obvykle začíná prvky 0,

14 snížení hodnoty klíče. Pro úplnost ještě připomeňme, že pracujeme s minimovými haldami. Analogicky bychom řešili operaci zvýšení hodnoty klíče v maximové haldě. Algoritmus DecreaseKey je velice přímočarý. Pokud dojde ke snížení klíče, může vzniknout porucha v uspořádání haldy mezi modifikovaným prvkem a jeho otcem. U regulární nebo binomiální haldy bychom tuto poruchu vyřešili vybubláním sníženého klíče nahoru. Zde ale využijeme modifikaci popsanou výše a prvek se sníženým klíčem včetně podstromu jehož je kořenem odtrhneme a vložíme do spojového seznamu mezi ostatní stromy haldy. Algoritmus FibDecreaseKey Vstup: Fibonacciho halda H, prvek x jehož klíč byl snížen Výstup: Upravená halda H 1. Pokud je x kořen nebo otec(x) x: Konec. 2. o otec(x) 3. Odtrhni x i s podstromem a vlož jej do H. 4. Dokud o není kořen a o již přišel o jednoho syna: 5. tmp otec(o) 6. Odtrhni o i s podstromem a vlož jej do H. 7. o tmp Nyní se podíváme na časovou složitost. Kdybychom měli velkou smůlu, dojde při snížení klíče k rozpadu větší části stromu. Po odtržení modifikovaného uzlu odtrhneme také jeho otce, děda atd. Zastavíme se až u kořene, který nemá smysl trhat (stejně bychom ho hned zase vložili). Pokud byl modifikovaný uzel listem, mohli jsme provést až tolik trhání, kolik je výška stromu. Díky tomu, že trhání samotné zvládneme v konstantním čase a strom má nejvýše logaritmickou výšku, bude mít celý algoritmus složitost Θ(logN). Tím jsme si příliš nepolepšili oproti ostatním haldám. Podívejme se, co nám na to řeknou ještě páni účetní z oddělení amortizace. Stále musíme dodržovat pravidlo, že každý strom v haldě musí mít na svém kontě alespoň jeden peníz, aby mohl zaplatit případnou konsolidaci. Za odtržení podstromu zaplatíme vždy 4 peníze. Jeden peníz bude stát skutečná práce odpojení uzlu ze stromu a jeho opětovné vložení do haldy. Další peníz dostane odtržený strom jako počáteční vklad na svůj účet, aby měl z čeho zaplatit konsolidační poplatek. Zbývající dva peníze dostane bývalý otec odtrženého uzlu jako finanční kompenzaci za odebraného potomka. Všimněme si, že pokud nějakému uzlu odtrhneme dva syny, tento uzel bude mít na svém kontě čtyři peníze (dva za každého syna), takže bude mít dostatek peněz, aby se mohl postavit na vlastní nohy a odtrhnout se od svého otce. Díky tomu zaplatíme za operaci FibDecreaseKey pouze za odtržení snižovaného vrcholu (a to pouze konstantní částku). Všechna další řetězová odtržení budou zaplacena z naspořených peněz jednotlivých vrcholů. Amortizovaná složitost tohoto algoritmu je tedy konstantní

15 2.3. Srovnání hald Na závěr ještě shrňme rozdíly časových složitostí všech hald, které jsme zde představili. Amortizované složitosti jsou uvedeny pouze tam, kde to má smysl, a značíme je hvězdičkou. Operace 2-regulární d-regulární binomiální Fibonacciho Vkládání prvku Θ(log N) Θ(log d N) Θ(log N), Θ(1) Θ(1) Odstranění minima Θ(log N) Θ(d log d N) Θ(log N) Θ(N), Θ(log N) Snížení prvku Θ(log N) Θ(log d N) Θ(log N) Θ(1) Fibonacciho halda přinesla konstantní implementace operací vkládání a snížení prvku, a to i v nejhorším případě. Nevýhodou ovšem je, že odstranění minima může v nejhorším případě zabrat až Θ(N). Cvičení 1. Dokažte, že na reprezentaci libovolného počtu prvků potřebujeme O(log N) Fibonacciho stromů různých řádů. Pro jednoduchost předpokládejte, že počet prvků N jde rozložit na součet různých fibonacciho čísel. 2. Předpokládejme, že u Fibonacciho haldy používáme drobnou implementační optimalizaci popsanou dříve halda si udržuje odkaz na strom s nejmenším kořenem, aby k němu mohla přistupovat v konstantním čase. Upravte algoritmus FibDecreaseKey, aby tuto hodnotu aktualizoval. 3. V algoritmu FibDecreaseKey testujeme podmínku, zda daný uzel neměl již odtrženého syna. Navrhněte, jak takovou informaci u každého uzlu udržovat, a upravte všechny operace (zejména konsolidaci), aby tuto hodnotu korektně aktualizovaly. 4*. Bylo by možné ve Fibonacciho haldě také zrychlit operaci zvýšení klíče (pro minimovou haldu), aby fungovala v konstantním čase? Složitosti ostatních operací musíte zachovat Pou¾ití Fibonacciho hald v grafových algoritmech Na závěr se podívejme na některé příklady použití Fibonacciho hald v klasických grafových algoritmech. Než se do toho pustíme, měli bychom také zvážit praktickou stránku věci. Implementace Fibonacciho hald je značně komplikovanější oproti klasickým 2-regulárním haldám. Navíc spotřebovává více paměti a časové složitosti operací mají výrazně větší konstanty. Jejich použití se tedy zpravidla nevyplatí na malých nebo řídkých grafech, kde nemusí být velký rozdíl mezi konstantní a logaritmickou složitostí

16 Hledání nejkratších cest Dijkstrův algoritmus jsme podrobně popsali v kapitole??. Velmi stručně shrň- Fix! me jeho činnost. Algoritmus hledá nejkratší cestu v grafu bez záporných hran. Pro každý vrchol udržujeme délku nejlepší dosud nalezené cesty z počátečního vrcholu. Na počátku jsou tyto délky nastaveny na nekonečno, vyjma počátečního vrcholu, který má hodnotu 0. Algoritmus v každém kroku zafixuje vrchol s nejmenší dočasnou vzdáleností od počátku a přepočítá jeho sousedy. Zafixování vrcholu odpovídá nalezení a odebrání minima. Přepočítání sousedů může hodnoty pouze snižovat, na což se hodí operace DecreaseKey. Pokud udržujeme dočasné vzdálenosti v poli, trvá nám nalezení a odstranění minima Θ(N). Naopak snížení hodnoty v důsledku přepočítávání zabere Θ(1). Celková složitost algoritmu je pak Θ(N 2 + M). V případě úplného grafu si již moc polepšit nemůžeme, ale pokud je graf řidší (což např. mapy silničních sítí bývají), mohlo by se vyplatit použít haldu. Udržujeme-li dočasné vzdálenosti vrcholů v klasické haldě, zrychlí se nám operace nalezení a odstranění minima na Θ(log N). Naopak přepočítání každého souseda zafixovaného vrcholu nám podraží rovněž na Θ(log N). V konečném důsledku bude složitost Θ((N +M) log N). S Fibonacciho haldami na tom budeme ještě o něco lépe. Operaci nalezení a odstranění minima provádíme často (N krát), takže si můžeme dovolit počítat s amortizovanou složitostí Θ(log N). Snížení klíče zvládne Fibonacci v konstantním čase, takže celková složitost bude Θ(N log N + M). Minimální kostry Dalším příkladem použití je algoritmus na hledání minimální kostry známý jako Jarníkův (Primův) a funguje následovně. Na začátku vezmeme libovolný vrchol, který prohlásíme za základ kostry. K tomuto základu přidáme v každém kroku jeden vrchol a jednu hranu, která do něj vede, dokud nebude obsahovat všechny vrcholy grafu. Přitom vybíráme vždy takovou hranu, která je nejkratší možná. Algoritmus tedy potřebuje neustále udržovat seznam vrcholů, které je možné připojit k základu kostry a nejkratší hrany, které do nich vedou. Při klasické reprezentaci těchto vrcholů v poli nás bude stát nalezení nejbližšího vrcholu Θ(N) a aktualizace po přidání tohoto vrcholu do základu kostry zvládneme konstantně za každou hranu. Celková složitost tedy bude Θ(N 2 + M). Opět se zde vynoří otázka velikosti grafu. V případě úplného grafu si opět příliš nepolepšíme. U řídkých grafů můžeme zkusit použít klasickou haldu. S ní se nám operace nalezení nejbližšího vrcholu zrychlí na Θ(log N). Naopak při procházení sousedů nově přidaného vrcholu můžeme buď přidávat další vrcholy do haldy nebo jim snižovat klíče. Obě tyto operace potřebují Θ(log N), takže celková složitost bude Θ((N + M) log N). Konečně použijeme-li Fibonacciho haldy, zvládneme nalezení vrcholu v Θ(log N) (amortizovaně) a aktualizace spojené se zpracováním hrany ať už přidání vrcholu nebo snížení klíče v čase konstantním. Výsledkem tedy bude složitost Θ(N log N + M). Fix: ref na kapitolu

17 Cvičení 1. Naprogramujte Dijkstrův algoritmus s polem, 2-regulární haldou a Fibonacciho haldou. Vyzkoušejte je na různých grafech a sledujte, který bude nejefektivnější. 2. Nalezněte ještě nějaký algoritmus (nemusí být nutně grafový), kde by mohly Fibonacciho haldy přinést užitek

1. Binomiální haldy. 1.1. Zavedení binomiální haldy

1. Binomiální haldy. 1.1. Zavedení binomiální haldy 1. Binomiální haldy V této kapitole popíšeme datovou strukturu zvanou binomiální halda. Základní funkcionalita binomiální haldy je podobná binární haldě, nicméně jí dosahuje jinými metodami a navíc podporuje

Více

Amortizovaná složitost. Prioritní fronty, haldy (binární, d- regulární, binomiální, Fibonacciho), operace nad nimi a jejich složitost

Amortizovaná složitost. Prioritní fronty, haldy (binární, d- regulární, binomiální, Fibonacciho), operace nad nimi a jejich složitost Amortizovaná složitost. Prioritní fronty, haldy binární, d- regulární, binomiální, Fibonacciho), operace nad nimi a jejich složitost 1. Asymptotické odhady Asymptotická složitost je deklarována na základě

Více

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 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

Více

Prioritní fronta, halda

Prioritní fronta, halda Prioritní fronta, halda Priority queue, heap Jan Kybic http://cmp.felk.cvut.cz/~kybic kybic@fel.cvut.cz 2016 2018 1 / 26 Prioritní fronta Halda Heap sort 2 / 26 Prioritní fronta (priority queue) Podporuje

Více

Stromy, haldy, prioritní fronty

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

Více

Základní datové struktury III: Stromy, haldy

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í

Více

Padovan heaps Vladan Majerech

Padovan heaps Vladan Majerech Padovan heaps Vladan Majerech Základní princip velmi drahé porovnávání Porovnáváme jen když musíme (v podstatě veškerou práci dělá FindMin) Výsledky porovnávání nezahazujeme Nesmíme organizací porovnávání

Více

prioritu a vždy je třeba začít pracovat na úkolu, který ma v daný okamžik

prioritu a vždy je třeba začít pracovat na úkolu, který ma v daný okamžik 1. Binární halda Uvažme následující problém ze života: jsme velmi vytíženým manažerem, kterému se plánovací diář stále plní obrovským množstvím úkolů. Každý úkol má předepsanou prioritu a vždy je třeba

Více

TGH07 - Chytré stromové datové struktury

TGH07 - Chytré stromové datové struktury TGH07 - Chytré stromové datové struktury Jan Březina Technical University of Liberec 1. dubna 2014 Prioritní fronta Datová struktura s operacemi: Odeber Minum (AccessMin, DeleteMin) - vrat prvek s minimálním

Více

Výhody a nevýhody jednotlivých reprezentací jsou shrnuty na konci kapitoly.

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?

Více

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 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

Více

a) b) c) Radek Mařík

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

Více

V každém kroku se a + b zmenší o min(a, b), tedy vždy alespoň o 1. Jestliže jsme na začátku dostali 2

V každém kroku se a + b zmenší o min(a, b), tedy vždy alespoň o 1. Jestliže jsme na začátku dostali 2 Euklidův algoritmus Doprovodný materiál pro cvičení Programování I. NPRM044 Autor: Markéta Popelová Datum: 31.10.2010 Euklidův algoritmus verze 1.0 Zadání: Určete největšího společného dělitele dvou zadaných

Více

zejména Dijkstrův algoritmus pro hledání minimální cesty a hladový algoritmus pro hledání minimální kostry.

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

Více

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í. 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,

Více

Algoritmus pro hledání nejkratší cesty orientovaným grafem

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

Více

TGH07 - Chytré stromové datové struktury

TGH07 - Chytré stromové datové struktury TGH07 - Chytré stromové datové struktury Jan Březina Technical University of Liberec 5. dubna 2017 Prioritní fronta Datová struktura s operacemi: Odeber Minum (AccessMin, DeleteMin) - vrat prvek s minimálním

Více

Algoritmy na ohodnoceném grafu

Algoritmy na ohodnoceném grafu Algoritmy na ohodnoceném grafu Dvě základní optimalizační úlohy: Jak najít nejkratší cestu mezi dvěma vrcholy? Dijkstrův algoritmus s t Jak najít minimální kostru grafu? Jarníkův a Kruskalův algoritmus

Více

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 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í

Více

PQ-stromy a rozpoznávání intervalových grafů v lineárním čase

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

Více

Prohledávání do šířky = algoritmus vlny

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é

Více

Dijkstrův algoritmus

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íce

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. 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

Více

Stromy. Jan Hnilica Počítačové modelování 14

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

Více

Mimo samotné správnosti výsledku vypočteného zapsaným algoritmem je ještě jedno

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íce

Pokročilá algoritmizace amortizovaná složitost, Fibonacciho halda, počítačová aritmetika

Pokročilá algoritmizace amortizovaná složitost, Fibonacciho halda, počítačová aritmetika amortizovaná složitost, Fibonacciho halda, počítačová aritmetika Jiří Vyskočil, Marko Genyg-Berezovskyj 2009 Amortizovaná složitost Asymptotická složitost často dostatečně nevypovídá o složitosti algoritmů,

Více

Stromové rozklady. Definice 1. Stromový rozklad grafu G je dvojice (T, β) taková, že T je strom,

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é

Více

Algoritmizace složitost rekurzivních algoritmů. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

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í:

Více

4 Stromy a les. Definice a základní vlastnosti stromů. Kostry grafů a jejich počet.

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

Více

Union-Find problém. Kapitola 1

Union-Find problém. Kapitola 1 Kapitola 1 Union-Find problém Motivace: Po světě se toulá spousta agentů. Často se stává, že jeden agent má spoustu jmen/přezdívek, které používá například při rezervaci hotelu, restaurace, na návštěvě

Více

DobSort. Úvod do programování. DobSort Implementace 1/3. DobSort Implementace 2/3. DobSort - Příklad. DobSort Implementace 3/3

DobSort. Úvod do programování. DobSort Implementace 1/3. DobSort Implementace 2/3. DobSort - Příklad. DobSort Implementace 3/3 DobSort Úvod do programování Michal Krátký 1,Jiří Dvorský 1 1 Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programování, 2004/2005 V roce 1980 navrhl Dobosiewicz variantu (tzv. DobSort),

Více

Cílem kapitoly je seznámit studenta se seznamem a stromem. Jejich konstrukci, užití a základní vlastnosti.

Cílem kapitoly je seznámit studenta se seznamem a stromem. Jejich konstrukci, užití a základní vlastnosti. Seznamy a stromy Cílem kapitoly je seznámit studenta se seznamem a stromem. Jejich konstrukci, užití a základní vlastnosti. Klíčové pojmy: Seznam, spojový seznam, lineární seznam, strom, list, uzel. Úvod

Více

IB108 Sada 1, Příklad 1 Vypracovali: Tomáš Krajča (255676), Martin Milata (256615)

IB108 Sada 1, Příklad 1 Vypracovali: Tomáš Krajča (255676), Martin Milata (256615) IB108 Sada 1, Příklad 1 ( ) Složitost třídícího algoritmu 1/-Sort je v O n log O (n.71 ). Necht n = j i (velikost pole, které je vstupním parametrem funkce 1/-Sort). Lehce spočítáme, že velikost pole předávaná

Více

ADT prioritní fronta. Haldy. Další operace nad haldou. Binární halda. Binomické stromy. Časová složitost jednotlivých operací.

ADT prioritní fronta. Haldy. Další operace nad haldou. Binární halda. Binomické stromy. Časová složitost jednotlivých operací. ADT prioritní fronta Haldy množina M operace Přidej(M,x) přidá prvek x do množiny M Odeber(M) odeber z množiny M prvek, který je na řadě Zásobník (LIFO), Fronta (FIFO) Prioritní fronta: Přidej(M,x) přidá

Více

Náplň. v.0.03 16.02.2014. - Jednoduché příklady na práci s poli v C - Vlastnosti třídění - Způsoby (algoritmy) třídění

Náplň. v.0.03 16.02.2014. - Jednoduché příklady na práci s poli v C - Vlastnosti třídění - Způsoby (algoritmy) třídění Náplň v.0.03 16.02.2014 - Jednoduché příklady na práci s poli v C - Vlastnosti třídění - Způsoby (algoritmy) třídění Spojení dvou samostatně setříděných polí void Spoj(double apole1[], int adelka1, double

Více

Modely Herbrandovské interpretace

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ší

Více

Konstrukce relace. Postupně konstruujeme na množině všech stavů Q relace i,

Konstrukce relace. Postupně konstruujeme na množině všech stavů Q relace i, [161014-1204 ] 11 2.1.35 Konstrukce relace. Postupně konstruujeme na množině všech stavů Q relace i, kde i = 0, 1,..., takto: p 0 q právě tehdy, když bud p, q F nebo p, q F. Dokud i+1 i konstruujeme p

Více

Pokročilé haldy. prof. Ing. Pavel Tvrdík CSc. Fakulta informačních technologií České vysoké učení technické v Praze c Pavel Tvrdík, 2010

Pokročilé haldy. prof. Ing. Pavel Tvrdík CSc. Fakulta informačních technologií České vysoké učení technické v Praze c Pavel Tvrdík, 2010 Pokročilé 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 (I-EFA) ZS 2010/11,

Více

1. Minimální kostry. 1.1. Od mìsteèka ke kostøe

1. Minimální kostry. 1.1. Od mìsteèka ke kostøe . Minimální kostry Napadl sníh a přikryl peřinou celé městečko. Po ulicích lze sotva projít pěšky, natož projet autem. Které ulice prohrneme, aby šlo dojet odkudkoliv kamkoliv, a přitom nám házení sněhu

Více

Vrcholová barevnost grafu

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é

Více

Binární vyhledávací stromy pokročilé partie

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

Více

ADT STROM Lukáš Foldýna

ADT STROM Lukáš Foldýna ADT STROM Lukáš Foldýna 26. 05. 2006 Stromy mají široké uplatnění jako datové struktury pro různé algoritmy. Jsou to matematické abstrakce množin, kterou v běžném životě používáme velice často. Příkladem

Více

Složitosti základních operací B + stromu

Složitosti základních operací B + stromu Složitosti základních operací B + stromu Radim Bača VŠB Technická univerzita Ostrava Fakulta elektrotechniky a informatiky Katedra informatiky ŠKOMAM 2010-1- 28/1/2010 Složitosti základních operací B +

Více

Algoritmizace Dynamické programování. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

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

Více

Datové struktury Úvod

Datové struktury Úvod Datové struktury Úvod Navrhněte co nejjednodušší datovou strukturu, která podporuje následující operace: 1. Insert a Delete v O(n), Search v O(log n); Datové struktury Úvod Navrhněte co nejjednodušší datovou

Více

Řešení: PŘENESVĚŽ (N, A, B, C) = přenes N disků z A na B pomocí C

Ř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

Více

Lineární spojový seznam (úvod do dynamických datových struktur)

Lineární spojový seznam (úvod do dynamických datových struktur) Lineární spojový seznam (úvod do dynamických datových struktur) Jan Hnilica Počítačové modelování 11 1 Dynamické datové struktury Definice dynamické struktury jsou vytvářeny za běhu programu z dynamicky

Více

TGH05 - aplikace DFS, průchod do šířky

TGH05 - aplikace DFS, průchod do šířky TGH05 - aplikace DFS, průchod do šířky Jan Březina Technical University of Liberec 31. března 2015 Grafová formulace CPM (critical path method) Orientovaný acyklický graf (DAG) je orientovaný graf neobsahující

Více

Výroková a predikátová logika - V

Výroková a predikátová logika - V Výroková a predikátová logika - V Petr Gregor KTIML MFF UK ZS 2015/2016 Petr Gregor (KTIML MFF UK) Výroková a predikátová logika - V ZS 2015/2016 1 / 21 Dokazovací systémy VL Hilbertovský kalkul Hilbertovský

Více

TGH06 - Hledání nejkratší cesty

TGH06 - Hledání nejkratší cesty TGH06 - Hledání nejkratší cesty Jan Březina Technical University of Liberec 26. března 2013 Motivační problémy Silniční sít reprezentovaná grafem. Najdi nejkratší/nejrychlejší cestu z místa A do místa

Více

[1] Determinant. det A = 0 pro singulární matici, det A 0 pro regulární matici

[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

Více

Datový typ prioritní fronta Semestrální práce z předmětu 36PT

Datový typ prioritní fronta Semestrální práce z předmětu 36PT Datový typ prioritní fronta Semestrální práce z předmětu 36PT Martin Tůma Cvičení 113, Út 18:00 22. května 2004 Specifikace problému Často potřebujeme přístup k informacím, tak aby tyto byly seřazeny podle

Více

které je z různých pohledů charakterizují. Několik z nich dokážeme v této kapitole.

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ě

Více

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. 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ří

Více

Algoritmizace prostorových úloh

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

Více

Druhá skupina zadání projektů do předmětu Algoritmy II, letní semestr 2014/2015

Druhá skupina zadání projektů do předmětu Algoritmy II, letní semestr 2014/2015 Druhá skupina zadání projektů do předmětu Algoritmy II, letní semestr 2014/2015 doc. Mgr. Jiří Dvorský, Ph.D. 6. dubna 2015 Verze zadání 6. dubna 2015 První verze 1 1 Sledování elektroměrů V panelovém

Více

6 Ordinální informace o kritériích

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í

Více

8. Geometrie vrací úder (sepsal Pavel Klavík)

8. Geometrie vrací úder (sepsal Pavel Klavík) 8. Geometrie vrací úder (sepsal Pavel Klavík) Když s geometrickými problémy pořádně nezametete, ony vám to vrátí! Ale když užzametat,takurčitěnepodkoberecamístosmetákupoužijtepřímku.vtéto přednášce nás

Více

Dynamické datové struktury III.

Dynamické datové struktury III. Dynamické datové struktury III. Halda. Tomáš Bayer bayertom@natur.cuni.cz Katedra aplikované geoinformatiky a kartografie, Přírodovědecká fakulta UK. Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované

Více

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. 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

Více

1. D Y N A M I C K É DAT O V É STRUKTUR Y

1. D Y N A M I C K É DAT O V É STRUKTUR Y 1. D Y N A M I C K É DAT O V É STRUKTUR Y Autor: Petr Mik Abychom se mohli pustit do dynamických datových struktur, musíme se nejdřív podívat na datový typ ukazatel. 1. D AT O V Ý TYP U K A Z AT E L Datové

Více

1 Lineární prostory a podprostory

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

Více

Minimalizace KA - Úvod

Minimalizace KA - Úvod Minimalizace KA - Úvod Tyto dva KA A,A2 jsou jazykově ekvivalentní, tzn. že rozpoznávají tentýž jazyk. L(A) = L(A2) Názorně lze vidět, že automat A2 má menší počet stavů než A, tudíž našim cílem bude ukázat

Více

3. Prohledávání grafů

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

Více

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 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)

Více

Základy algoritmizace a programování

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;

Více

Teorie informace a kódování (KMI/TIK) Reed-Mullerovy kódy

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:

Více

NEJKRATŠÍ CESTY I. Doc. RNDr. Josef Kolář, CSc. Katedra teoretické informatiky, FIT České vysoké učení technické v Praze

NEJKRATŠÍ CESTY I. Doc. RNDr. Josef Kolář, CSc. Katedra teoretické informatiky, FIT České vysoké učení technické v Praze NEJKRATŠÍ CESTY I Doc. RNDr. Josef Kolář, CSc. Katedra teoretické informatiky, FIT České vysoké učení technické v Praze BI-GRA, LS 2010/2011, Lekce 7 Evropský sociální fond Praha & EU: Investujeme do vaší

Více

přirozený algoritmus seřadí prvky 1,3,2,8,9,7 a prvky 4,5,6 nechává Metody řazení se dělí:

přirozený algoritmus seřadí prvky 1,3,2,8,9,7 a prvky 4,5,6 nechává Metody řazení se dělí: Metody řazení ve vnitřní a vnější paměti. Algoritmy řazení výběrem, vkládáním a zaměňováním. Heapsort, Shell-sort, Radix-sort, Quicksort. Řazení sekvenčních souborů. Řazení souborů s přímým přístupem.

Více

Časová složitost / Time complexity

Časová složitost / Time complexity Časová složitost / Time complexity Jan Kybic http://cmp.felk.cvut.cz/~kybic kybic@fel.cvut.cz 2016 2018 1 / 24 Složitost algoritmů Algorithm complexity Časová a paměťová složitost Trvání výpočtu v závislosti

Více

TGH05 - aplikace DFS, průchod do šířky

TGH05 - aplikace DFS, průchod do šířky TGH05 - aplikace DFS, průchod do šířky Jan Březina Technical University of Liberec 28. března 2017 Grafová formulace CPM (critical path method) Orientovaný acyklický graf (DAG) je orientovaný graf neobsahující

Více

NPRG030 Programování I, 2018/19 1 / :03:07

NPRG030 Programování I, 2018/19 1 / :03:07 NPRG030 Programování I, 2018/19 1 / 20 3. 12. 2018 09:03:07 Vnitřní třídění Zadání: Uspořádejte pole délky N podle hodnot prvků Měřítko efektivity: * počet porovnání * počet přesunů NPRG030 Programování

Více

12. Lineární programování

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)

Více

TGH05 - Problém za milion dolarů.

TGH05 - Problém za milion dolarů. TGH05 - Problém za milion dolarů. Jan Březina Technical University of Liberec 20. března 2012 Časová složitost algoritmu Závislost doby běhu programu T na velikosti vstupních dat n. O(n) notace, standardní

Více

Matematika III 10. přednáška Stromy a kostry

Matematika III 10. přednáška Stromy a kostry Matematika III 10. přednáška Stromy a kostry Michal Bulant Masarykova univerzita Fakulta informatiky 20. 11. 2007 Obsah přednášky 1 Izomorfismy stromů 2 Kostra grafu 3 Minimální kostra Doporučené zdroje

Více

3. úloha - problém batohu metodami branch & bound, dynamické programování, heuristika s testem

3. úloha - problém batohu metodami branch & bound, dynamické programování, heuristika s testem ČVUT FEL X36PAA - Problémy a algoritmy 3. úloha - problém batohu metodami branch & bound, dynamické programování, heuristika s testem Jméno: Marek Handl Datum: 1. 1. 2009 Cvičení: Pondělí 9:00 Zadání Naprogramujte

Více

Maturitní téma: Programovací jazyk JAVA

Maturitní téma: Programovací jazyk JAVA Maturitní téma: Programovací jazyk JAVA Insert Sort (třídění vkládáním) 1. Jako setříděnou část označíme první prvek pole. Jako nesetříděnou část označíme zbytek pole. 2. Vezmeme první (libovolný) prvek

Více

Kolik existuje různých stromů na pevně dané n-prvkové množině vrcholů?

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

Více

Maturitní témata. IKT, školní rok 2017/18. 1 Struktura osobního počítače. 2 Operační systém. 3 Uživatelský software.

Maturitní témata. IKT, školní rok 2017/18. 1 Struktura osobního počítače. 2 Operační systém. 3 Uživatelský software. Maturitní témata IKT, školní rok 2017/18 1 Struktura osobního počítače Von Neumannova architektura: zakreslete, vysvětlete její smysl a popište, jakým způsobem se od ní běžné počítače odchylují. Osobní

Více

bfs, dfs, fronta, zásobník, prioritní fronta, halda

bfs, dfs, fronta, zásobník, prioritní fronta, halda bfs, dfs, fronta, zásobník, prioritní fronta, halda Petr Ryšavý 19. září 2017 Katedra počítačů, FEL, ČVUT prohledávání grafů Proč prohledávání grafů Zkontrolovat, zda je sít spojitá. Hledání nejkratší

Více

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.

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

Více

Analýza Petriho sítí. Analýza Petriho sítí p.1/28

Analýza Petriho sítí. Analýza Petriho sítí p.1/28 Analýza Petriho sítí Analýza Petriho sítí p.1/28 1. Základní pojmy Základní problémy analýzy bezpečnost (safeness) omezenost (boundness) konzervativnost (conservation) živost (liveness) Definice 1: Místo

Více

Algoritmy a datové struktury

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

Více

Radek Mařík

Radek Mařík 2012-03-20 Radek Mařík 1. Pravá rotace v uzlu U a) v podstromu s kořenem U přemístí pravého syna U.R uzlu U do kořene. Přitom se uzel U stane levým synem uzlu U.R a levý podstrom uzlu U.R se stane pravým

Více

2. Složitost, grafové algoritmy (zapsal Martin Koutecký)

2. Složitost, grafové algoritmy (zapsal Martin Koutecký) 2. Složitost, grafové algoritmy (zapsal Martin Koutecký) Model Ram Při analýze algoritmu bychom chtěli nějak popsat jeho složitost. Abychom mohli udělat toto, potřebujeme nejprve definovat výpočetní model.

Více

Naproti tomu gramatika je vlastně soupis pravidel, jak

Naproti tomu gramatika je vlastně soupis pravidel, jak 1 Kapitola 1 Úvod V přednášce se zaměříme hlavně na konečný popis obecně nekonečných množin řetězců symbolů dané množiny A. Prvkům množiny A budeme říkat písmena, řetězcům (konečným posloupnostem) písmen

Více

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 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.

Více

Nechť je číselná posloupnost. Pro všechna položme. Posloupnost nazýváme posloupnost částečných součtů řady.

Nechť je číselná posloupnost. Pro všechna položme. Posloupnost nazýváme posloupnost částečných součtů řady. Číselné řady Definice (Posloupnost částečných součtů číselné řady). Nechť je číselná posloupnost. Pro všechna položme. Posloupnost nazýváme posloupnost částečných součtů řady. Definice (Součet číselné

Více

Suffixové stromy. Osnova:

Suffixové stromy.  Osnova: Suffixové stromy http://jakub.kotrla.net/suffixtrees/ Osnova: Motivační příklad Přehled možných řešení Definice suffixového stromu Řešení pomocí suffixových stromů Konstrukce suffixového stromu Další použití,

Více

1 Linearní prostory nad komplexními čísly

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)

Více

Časová a prostorová složitost algoritmů

Č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á

Více

STROMOVE ALGORITMY Prohledavani do sirky (level-order) Po vodorovnejch carach fronta

STROMOVE ALGORITMY Prohledavani do sirky (level-order) Po vodorovnejch carach fronta STROMOVE ALGORITMY Prohledavani do sirky (level-order) Po vodorovnejch carach vlož do fronty kořen opakuj, dokud není fronta prázdná 1. vyber uzel z fronty a zpracuj jej 2. vlož do fronty levého následníka

Více

Množinu všech slov nad abecedou Σ značíme Σ * Množinu všech neprázdných slov Σ + Jazyk nad abecedou Σ je libovolná množina slov nad Σ

Množinu všech slov nad abecedou Σ značíme Σ * Množinu všech neprázdných slov Σ + Jazyk nad abecedou Σ je libovolná množina slov nad Σ Abecedou se rozumí libovolná konečná množina Σ. Prvky abecedy nazýváme znaky (symboly) Slovo (řetězec) v nad abecedou Σ je libovolná konečná posloupnost znaků této abecedy. Prázdné posloupnosti znaků odpovídá

Více

bfs, dfs, fronta, zásobník, prioritní fronta, halda

bfs, dfs, fronta, zásobník, prioritní fronta, halda bfs, dfs, fronta, zásobník, prioritní fronta, halda Petr Ryšavý 20. září 2016 Katedra počítačů, FEL, ČVUT prohledávání grafů Proč prohledávání grafů Zkontrolovat, zda je sít spojitá. Hledání nejkratší

Více

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í 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),

Více

HEURISTICKÉ ALGORITMY PRO ŘEŠENÍ ÚLOH OBCHODNÍHO CESTUJÍCÍHO

HEURISTICKÉ ALGORITMY PRO ŘEŠENÍ ÚLOH OBCHODNÍHO CESTUJÍCÍHO HEURISTICKÉ ALGORITMY PRO ŘEŠENÍ ÚLOH OBCHODNÍHO CESTUJÍCÍHO Heuristické algoritmy jsou speciálními algoritmy, které byly vyvinuty pro obtížné úlohy, jejichž řešení je obtížné získat v rozumném čase. Mezi

Více

Složitost algoritmů. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava

Složitost algoritmů. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Složitost algoritmů doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 27. prosince 2015 Jiří Dvorský (VŠB TUO) Složitost algoritmů

Více

Tento text je stručným shrnutím těch tvrzení Ramseyovy teorie, která zazněla

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í

Více

Na začátku rozdělíme práci a určíme, které podproblémy je potřeba vyřešit. Tyto

Na začátku rozdělíme práci a určíme, které podproblémy je potřeba vyřešit. Tyto Kapitola 1 Rozděl a panuj Rozděl a panuj je programovací metoda. Často se označuje latinsky Divide et Empera nebo anglicky Divide and Conquer. Vychází z toho, že umíme zadaný problém rozložit na menší

Více

2. přednáška 8. října 2007

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) =

Více