Uživatelské nástroje

Nástroje pro tento web


teaching:ads11516

Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

Obě strany předchozí revizePředchozí verze
Následující verze
Předchozí verze
teaching:ads11516 [2016/04/04 13:04] Martin Kouteckyteaching:ads11516 [2020/04/01 15:50] (aktuální) – stará verze byla obnovena (2019/09/24 11:18) Martin Koutecky
Řádek 12: Řádek 12:
   * {{:teaching:ads1_2016:ads1_02-cv.pdf|4. cvičení}}   * {{:teaching:ads1_2016:ads1_02-cv.pdf|4. cvičení}}
     * [[http://people.ksp.sk/~kuko/bak/index.html|Applet na hraní si s BVS + hezký souhrn/srovnání BVS a dalších datových struktur.]]     * [[http://people.ksp.sk/~kuko/bak/index.html|Applet na hraní si s BVS + hezký souhrn/srovnání BVS a dalších datových struktur.]]
 +  * {{:teaching:ads1_2016:ads1_03-cv.pdf|5. cvičení}}
 +  * {{:teaching:ads1_2016:ads1_04-cv.pdf|6. cvičení}}
 +  * {{:teaching:ads1_2016:ads1_05-cv.pdf|7. cvičení}}
 +  * {{:teaching:ads1_2016:ads1_06-cv.pdf|8. cvičení}}
 +  * {{:teaching:ads1_2016:ads1_07-cv.pdf|9. cvičení}}
 +
 +===== Co se (údajně) dělalo na přednášce =====
 +
 +  * 6. přednáška
 +    * quicksort je velmi podobný jako vkládání prvků do BVS 
 +    * B-stromy (jak vypadají, insert, delete)
 +    * úvod do třídících algoritmů (časová složitost bubble sortu, merge sortu a quicksortu)
 +  * 7. přednáška
 +    * znovu B-stromy
 +    * halda (k čemu je + operace hledání min, sjednocení dvou hald, insert, delete)
 +    * opět třídění (jak průměrně funguje bubble sort, quick sort, merge sort; důkaz toho, že když máme jakýkoli algoritmus, který třídí na základě porovnávání prvků, tak musí provést alespoň $O(n \log n)$ porovnání --> důsledek: nemůžeme vymyslet třídící algoritmus, kterému stačí méně než $\log_2 n$ operací pro jeden prvek)
 +  * 8. přednáška
 +    * detailně důkaz dolního odhadu třídích algoritmů ([[http://kam.mff.cuni.cz/~ludek/NTIN060texty/AverageLowerBoundSorting.pdf|zde]])
 +    * radix sort (popis a ukázka toho, že pokud máme nějakou přiměřenou množinu malých čísel, tak algoritmus tohoto sortu beží v $O(n)$)
 +  * 9. přednáška
 +    * pokračování radix sort (změna oproti minulé přednášce - závěrečný for cyklus pozpátku, abychom měli stabilní uspořádání, tj. uspořádání, kde prvky se stejným klíčem budou po setřídění ve stejném pořadí jako před tříděním; zmínka o třídění stabilním tříděním pozpátku - odzadu podle poslední cifry)
 +    * hashování (základní popis, co říká (bez důkazu) ([[http://kam.mff.cuni.cz/~ludek/NTIN060texty/hash.pdf|zde]]) 
 +    * implementace hashování (otevřené hashování = hashovací pole minimálně 2x větší než počet prvků, pokud by více prvků hashovací funkce namířila do jednoho políčka v hashovacícm poli, tak ho uložíme do nejblížšího volného políčka napravo, v hashovací tabulce vyhledáváme standardně, ale musíme se koukat i na prvky napravo od místa, kam nás poslala hash funkce, dokud nenarazíme na mezeru nebo hledané číslo --> implementace se hodí jen pro ukládání a vyhledávání - pokud v ní začneme mazat, nesmíme místo mazaného prvku nechat volné políčko, protože by se mohlo stát, že nějaké prvky už při hledání nikdy nenalezneme)
 +   * 10. přednáška
 +     * univerzální hashování (kde počet prvku universa je prvočíslo)
 +     * perfektní hashování (snaha vyhnout se kolizím -- máme k dispozici více hashovacích funkcí a vybíráme si tu, která danou podmnožinu množiny universa zobrazí bez kolizí) 
 +
 +
  
 ===== Domácí úkoly ===== ===== Domácí úkoly =====
Řádek 32: Řádek 60:
 //Hint:// Hledejte rekurzivně $k$-tý nejmenší ze dvou podposloupností. //Hint:// Hledejte rekurzivně $k$-tý nejmenší ze dvou podposloupností.
  
-**Úloha rovnováha (8b, plný počet do 28. 3.)**+**Úloha rovnováha (9b, plný počet do 28. 3.)**
  
 Vymyslete algoritmus, který v lineárním čase přebuduje vyhledávací strom na dokonale vyvážený. Nemáte dost paměti na to, abyste si mohli pořídit ještě jednu kopii prvků – kromě stromu si smíte pamatovat $O(1)$ hodnot (pointerů, počitadel do $n$, kopií hodnot). Vymyslete algoritmus, který v lineárním čase přebuduje vyhledávací strom na dokonale vyvážený. Nemáte dost paměti na to, abyste si mohli pořídit ještě jednu kopii prvků – kromě stromu si smíte pamatovat $O(1)$ hodnot (pointerů, počitadel do $n$, kopií hodnot).
  
-**Úloha merge (8b, plný počet do 28. 3.)**+**Úloha merge (10b, plný počet do 28. 3.)**
  
 Navrhněte algoritmus pro sloučení dvou AVL stromů $A$ a $B$, kde všechny prvky $A$ leží před všemi prvky $B$, do jediného AVL stromu $C$. Hledáme řešení s lepší složitostí než $O(min(|A|,|B|))$. Navrhněte algoritmus pro sloučení dvou AVL stromů $A$ a $B$, kde všechny prvky $A$ leží před všemi prvky $B$, do jediného AVL stromu $C$. Hledáme řešení s lepší složitostí než $O(min(|A|,|B|))$.
Řádek 65: Řádek 93:
  
 Pro 5 bodů navíc dokažte, že rychleji toto není možné zjistit. Pro plný počet by tento důkaz měl být jasný a úplný. Pro 5 bodů navíc dokažte, že rychleji toto není možné zjistit. Pro plný počet by tento důkaz měl být jasný a úplný.
 +
 +**Úloha housenka (9b, plný počet do 2. 5.)**
 +Najděte v zadaném stromě housenku na co nejvíce vrcholech. //Housenka// je podgraf, který se skládá z cesty
 +na jejímž každém vrcholu jsou až čtyři listy (nožičky), ale můžou tam být i vrcholy bez nožiček. Není to totéž,
 +co nejdelší cesta, protože nejde o housenku co nejdelší, ale na největším počtu vrcholů (tedy i s nožičkami). Řešení by mělo být v $O(n)$.
 +
 +**Úloha kůň (8b, plný počet do 2. 5.)**
 +Na jedné šachovnici $N\times N$ žil byl kulhavý kůň. To je je šachová figurka, která v sudém tahu táhne
 +jako jezdec, v lichém jako pěšec (o 1 dopředu, vždy stejným směrem). Jak pro zadaná dvě políčka najít nejkratší cestu kulhavým koněm?
 +
 +**Úloha zakázka (10b, plný počet do 11. 5.)**
 +
 +Olga Opatrná najala Láďu Lenocha, aby ji pro daný neorientovaný graf $G=(V,E)$, vrchol $s\in V$ a //nezáporné// celočíselné váhy hran $w(u,v)$ (kde $w(u,v)=w(v,u)$) spočítal nejkratší cesty z vrcholu $s$ do všech ostatních vrcholů. Konkrétně má Láďa spočíst dvě funkce: $d(v)$ má být délka nejkratší cesty z $s$ do $v$ (nebo $\infty$, pokud taková není), a $\pi(v)$ má být předposlední vrchol na nějaké nejkratší cestě z $s$ do $v$ (nebo $\mathrm{NIL}$, pokud taková není).
 +
 +Olga ale moc nevěří Láďově pečlivosti, a tak si chce výsledky ověřit, což se jí zdá jednodušší, než si je spočíst sama. Konkrétně ověří následující podmínky:
 +
 +  - $d(s)=0$
 +  - $\pi(s)=\mathrm{NIL}$
 +  - $\forall (u,v)\in E: d(v) \leq d(u) + w(u, v)$
 +  - $\forall v\in V: \pi(v)\neq\mathrm{NIL}\Rightarrow d(v) = d(\pi(v)) + w(\pi(v),v)$
 +  - $\forall v\in V, v\neq s: d(v) < \infty \Rightarrow \pi(v) \neq\mathrm{NIL}$
 +  
 +Jak může Láďa Olze dát data $d$ a $\pi$, která nejsou korektní podle Olžina zadání, ale splňují tyto ověřovací podmínky? Konkrétně: najděte takový graf, funkci $w$, vrchol $s$ a funkce $d$ a $\pi$, nebo ještě lépe popište takové případy obecněji. Za druhé upravte či doplňte podmínky tak, aby už každé řešení splňující tyto podmínky popisovalo nejkratší vzdálenosti a cesty.
 +
 +
 +**Úloha abeceda (9b, plný počet do 11. 5.)**
 +Nalezli jste knihovnu ztracené civilizace a zkoumáte její abecedu o $n$ prapodivných znacích.
 +Každá kniha má na svém hřbetu nápis touto abecedou a doufáte, že jsou knihy seřazené abecedně (lexikograficky).
 +Rádi byste věděli, jestli z pořadí knížek lze zjistit jednoznačné pořadí znaků abecedy, jestli je pro to
 +informací málo, či zda dokonce takové pořadí nemůže existovat (a knihovnu tedy někdo přeházel).
 +
 +Zadání si představte třeba jako seznam slov bez mezer z abecedy "a-z", otázkou je pak pořadí znaků "a-z"
 +v hledané abecedě. Zkuste najít algoritmus, který to zvládne v lineárním čase s velikostí vstupu. Můžete
 +předpokládat, že se každé písmeno mezi nápisy vyskytne.
 +
 +
 +
 +
 +**Úloha polosouvislost (9b, plný počet do 30. 5.)**
 +
 +Řekněme, že orientovaný graf $G$ je //polosouvislý//, když pro každé dva vrcholy $u$ a $v$ platí, že existuje orientovaná cesta z $u$ do $v$ nebo orientovaná cesta z $v$ do $u$. Toto je silnější vlastnost, než slabá souvislost grafu, ale slabší vlastnost, než silná souvislost grafu. Jak v čase $O(m+n)$ zjistit, zda je $G$ polosouvislý?
 +
 +**Úloha holubi (9b, plný počet do 30. 5.)**
 +Každý poštovní holub, je-li vypuštěn se zprávou, s ní doletí jen na jedno místo, které je pro konkrétního holuba pevné. Ve spolku pěstitelů holubů má každý člen holuby, kteří mohou doručit zprávu k několika dalším členům. Svolat všepěstitelské setkání je možné jen tak, že ho jeden ze členů vyhlásí rozesláním zpráv všem členům, na které má holuby, a ti pak pošlou zprávu dál svými holuby.
 +
 +Když znáte strukturu spolku, v čase lineárním s počtem zúčastněných holubů a členů zjistěte, zda vůbec existuje někdo, kdo má možnost setkání všech členů svolat.
 +
 +**Úloha cheating (7b, plný počet do 30. 5.)**
 +
 +Závod bludištěm z živých plotů! Jste rozhodnuti vyhrát a to i za cenu malé ... zkratky, kterou
 +pravidla zapomněla zmínit. Nejste ale ochotni se křovím prodrat víc než jednou, ještě by si toho někdo
 +všiml a mohl by to ... špatně pochopit.
 +
 +Bludiště je popsáno grafem se startem, cílem, délkami hran a dvěma typy hran; chodby bludištěm
 +a zkratky křovím, kterými se ještě jde prodrat. Navrhněte algoritmus pro nejkratší cestu do cíle
 +v co nejlepším čase.
 +
 +**Úloha listy-kostry (8b, plný počet do 30. 5.)**
 +
 +Máme dánu $U$ jako podmnožinu vrcholů souvislého grafu $G$ s váhami hran $w$.
 +Najděte minimální kostru $G$ ze všech takových koster, které mají vrcholy z $U$ jako listy.
 +Algoritmus by měl být stejně rychlý jako jiné vám známé algoritmy na min. kostru a měl by
 +rozpoznat situaci, že taková kostra neexistuje.
 +
 +
 +
  
  
Řádek 103: Řádek 197:
  
  
 +{{page>teaching:bits:ads_zapoctaky}}
  
-==== Nápady na zápočťáky ==== 
  
-  - [[https://en.wikipedia.org/wiki/Shellsort|Shellsort]] je velice zajímavý třídící algoritmus. Je v jistém smyslu zkřížením bubblesortu a insertsortu, ale může mít lepší časovou složitost. Možností, co byste s ním mohli dělat, je několik: 
-    - <del>Implementovat ho pro několik variant parametru mezery ([[https://en.wikipedia.org/wiki/Shellsort#Gap_sequences|Gap sequences]]) a porovnat jeho chování pro tyto parametry experimentálně.</del> **(Hotovo, [[https://github.com/Salmelu/Sorts|github]])** 
-    - Nejlepší posloupnost mezer v průměrném případě je prý 1, 4, 10, 23, ... (vizte [[https://en.wikipedia.org/wiki/Shellsort#Gap_sequences|poslední odstavec této podkapitoly]]); toto bylo zjištěno experimentálně. Ověřte správnost těchto výsledků pro co největší čísla (aktuálně je známo jen prvních osm členů této posloupnosti, kdybyste přišli na devátý, dostanete celý zápočet ;). Pokud byste si vybrali toto témai, jistě by nebylo těžké vám zařídit přístup k výpočetní kapacitě fakulty.) 
-    - Co kdyby se měl Shellsort přednášet? Sestavte co nejzajímavěji materiál k výkladu na hodinu a půl (jako přednáška z ADS), kde se ukáže princip fungování tohoto sortu a pak dokáže několik (jednodušších) odhadů na časovou složitost pro různé hodnoty parametru mezery. Nejvhodnějším médiem by byl [[http://ipython.org/notebook.html|IPython notebook]] (rád předvedu, jak funguje), protože do něj lze psát matematickou notaci i kód a interaktivně vše zkoušet. 
-  - [[https://en.wikipedia.org/wiki/Splay_tree|Splay tree]] je velice zajímavá datová struktura. Jedná se o binární vyhledávací strom, který se přizpůsobuje dotazům, které na něj přichází -- pokud přichází mnoho dotazů na tytéž prvky, strom je vynese blízko ke kořeni, aby se k nim dalo přistupovat rychle. Samozřejmě má i svoje nevýhody. Implementujte ho a napište k němu několik generátorů posloupnosti operací, které budou demonstrovat, v čem je Splay strom lepší než jiné stromy (AVL, R-B, ...) a kde naopak selhává. (Generátorem posloupnosti operací myslím nějakou funkci, které řeknu, kolik operací INSERT/FIND/DELETE chci na stromu udělat [třeba za účelem testování] a on mi je vygeneruje.) 
-  - Implementujte [[https://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm|Tarjanův algoritmus na hledání silně souvislých komponent]] v orientovaném grafu. 
-  - Implementujte [[https://en.wikipedia.org/wiki/Rabin%E2%80%93Karp_string_search_algorithm|Rabinův-Karpův algoritmus]] na vyhledávání podřetězce v řetězci pomocí hashování. 
-  - Implementujte kterýkoliv exponenciální algoritmus z [[http://www.cs.uiuc.edu/~jeffe/teaching/algorithms/notes/04-fastexpo.pdf|přednáškových poznámek Jeffa Ericksona]] a pochopte důkaz správnosti a časové/prostorové složitosti dostatečně, abyste mi ho uměli vysvětlit na tabuli. 
  
  
teaching/ads11516.1459767898.txt.gz · Poslední úprava: 2016/04/04 13:04 autor: Martin Koutecky