60. ročník Matematické olympiády 2010/2011
|
|
- Marian Urban
- před 6 lety
- Počet zobrazení:
Transkript
1 60. ročník Matematické olympiády 2010/2011 Řešení úloh ústředního kola kategorie P 1. soutěžní den P-III-1 Básník Honzík Pokud bychom hledali libovolné slovo s nejdelším společným koncovým úsekem, stačilo by použít datovou strukturu trie(neboli písmenkový strom to je zakořeněný strom, v jehož kořeni se rozhodujeme podle prvního písmene slova, na další hladině podle druhého, pak podle třetího, atd.). Do trie bychom přidali všechna slova ze seznamu pozpátku a stejně tak požadované slovo bychom hledali od konce. Ve chvíli, kdy se dostaneme do uzlu u, který nemá vhodného následníka, nebo nalezneme vyhledávané slovo celé, známe nejdelší koncový úsek, kterého můžeme dosáhnout(odpovídá písmenům na cestě z kořene trie do u). Tento koncový úsek všakmůžesdíletvíceslov takováslovajsouprávěta,kterákončívunebovjeho podstromě. Jak ale vybrat lexikograficky nejmenší? Přímočaré řešení by spočívalo v nalezení všech slov, která se nachází v podstromu u, a následném výběru lexikografického minima. Nalezení všech slov se dá udělat průchodem do hloubky, avšak uvědomíme- -li si, že počet takových slov může být srovnatelný s velikostí celého seznamu slov, zjistíme, že jsme si moc nepomohli oproti triviálnímu řešení, které vždy projde celý seznam a má složitost O(maximální délka slova velikost seznamu). Pokusme se trii upravit tak, abychom se časově náročnému výběru lexikografického minima vyhnuli. Zapamatujme si v každém uzlu u trie lexikograficky nejmenší slovo(resp. ukazatel na něj, abychom neplýtvali pamětí), mající koncovýúsekodpovídajícícestězkořenetriedo u.vtaktoupravenétriibudememoci nalézt lexikograficky nejmenší slovo s maximálním společným úsekem v čase O(délka hledaného slova) a vypsat v čase O(délka minimálního slova), což je jistě optimální, protože to odpovídá času na načtení vstupu a vypsání výsledku. Stejně tak paměťová složitost bude lineární vzhledem k velikosti seznamu, protože velikost abecedy je konstantní a v každém uzlu trie je navíc pouze jeden ukazatel. Konstrukce takovýchto ukazatelů je celkem jednoduchá, pokud si uvědomíme následující nechť v a, v b,...v z jsousynyuzlu u.paklexikografickynejmenšíslovovuzlu ustačívybíratznejmenšíchslovvuzlech v a, v b,... v z apřípadněslova, kterékončívu.stačítedyprocházettriidohloubkyavždypřinávratuzrekurze spočítat pro daný vrchol minimální slovo(těch je maximálně 26, což odpovídá velikostiabecedy,atedyipočtusynůuzlůtrie).jedinýzádrheljeukrytvporovnávání minimálních slov v každém uzlu trie. Je totiž potřeba si uvědomit, že synů uzlu je sice konstantní počet, nicméně minimální slova mohou být relativně dlouhá, a tak nalezení všech minimálních slov může trvat až O(maximální délka slova velikost seznamu)(velikost trie je lineární vzhledem k velikosti slovníku). To je trochu škoda. My ale naštěstí známe slova dopředu, a tak si je můžeme očíslovat podle lexikografického pořadí a porovnávat jen jejich indexy. Hledané lexikografické pořadí jsme schopni získat za pomoci jiné 1
2 trie v čase O(velikost seznamu), což je zjevně optimální, a to tak, že nejprve vložíme všechna slova do trie(tentokrát odpředu) a tu pak šikovně celou projdeme(vždy budemevolit nejmenšího ještěnepoužitéhosyna).takjsmeschopnipředzpracovat seznam slov v celkovém čase O(velikost seznamu). #include <stdio.h> #include <string.h> #define ALPHABET_SIZE ( z - a +1) // Velikost abecedy #define MAX_WORD_LEN // Maximální velikost dotazu nebo slova v seznamu struct WORD char *word; // Vlastní slovo int lex_id; // Jeho lexikografické pořadí ; struct TRIE_NODE TRIE_NODE() for (int i=0; i<alphabet_size; i++) sons[i] = NULL; word = NULL; TRIE_NODE *sons[alphabet_size]; // Synové uzlu WORD *word; // Obsahuje pointer na slovo, které v daném uzlu končí, nebo NULL WORD *min_word; // Minimální slovo v postromu uzlu ; // Přidání slova do trie void trie_add(trie_node *root, WORD *word) char *word_iter = word->word; while (*word_iter) int son_id = *word_iter- a ; if (root->sons[son_id] == NULL) root->sons[son_id] = new TRIE_NODE; root = root->sons[son_id]; word_iter++; root->word = word; // Lexikografické očíslování slov přidaných do trie void trie_sort(trie_node *root, int &id) if (root->word) root->word->lex_id = id++; for (int i=0; i<alphabet_size; i++) if (root->sons[i]) trie_sort(root->sons[i], id); // Pro každý uzel najdeme nejmenší slovo v jeho podstromu void trie_construct_min_words(trie_node *root) 2
3 WORD *min_word = NULL; for (int i=0; i<alphabet_size; i++) if (root->sons[i]) trie_construct_min_words(root->sons[i]); if (min_word==null min_word->lex_id>root->sons[i]->min_word->lex_id) min_word = root->sons[i]->min_word; if (min_word==null (root->word!=null && min_word->lex_id>root->word->lex_id)) min_word = root->word; root->min_word = min_word; // Otočení slova void reverse_word(char *word) char *start = word; char *end = word + strlen(word) - 1; while (start < end) char tmp = * *end = *start; *start = tmp; start++; end--; // Nalezení minimálního slova s nejdelším společným úsekem k danému slovu void trie_find_min(trie_node *root, char *to_search) while (root->sons[*to_search- a ]) root = root->sons[*to_search++ - a ]; char to_print[max_word_len]; strcpy(to_print, root->min_word->word); reverse_word(to_print); printf("%s\n", to_print); int main() int dict_size, query_count; scanf("%d %d", &dict_size, &query_count); WORD *dictionary = new WORD[dict_size]; TRIE_NODE *sorting_trie = new TRIE_NODE; char input[max_word_len]; for (int i=0; i<dict_size; i++) scanf("%s", input); dictionary[i].word = new char[strlen(input)+1]; strcpy(dictionary[i].word, input); trie_add(sorting_trie, &dictionary[i]); int lex_id = 0; trie_sort(sorting_trie, lex_id); 3
4 TRIE_NODE *searching_trie = new TRIE_NODE; for (int i=0; i<dict_size; i++) reverse_word(dictionary[i].word); trie_add(searching_trie, &dictionary[i]); trie_construct_min_words(searching_trie); char fake_nelze[] = "EZLEN"; WORD fake_root_min_word; fake_root_min_word.word = fake_nelze; searching_trie->min_word = &fake_root_min_word; for (int i=0; i<query_count;i++) scanf("%s", input); reverse_word(input); trie_find_min(searching_trie, input); return 0; P-III-2 Úřad Úlohu bychom řešit mohli přímočaře: Nejprve odstraňme úředníky, kteří nemají žádného(ani nepřímého) podřízeného schopného styku s veřejností(to lze snadno udělatjednímprůchodemvčase O(N)).Prokaždéhoúředníka ksipakspočítáme množinuúkonů U k,kteréponěmnějakýzájemcemůžepožadovat,amnožinuúkonů V k,kterémůžepřeposlatsvémunadřízenému. Smí-liúředníkvykonávatúkon u,pakzjevně V k = U k \ u.má-liúředník nastarostistyksveřejností,pakponěmmůžebýtpožadovánlibovolnýúkona U k = 1,2,3,..., M.Jinakponěmmůžebýtpožadovánlibovolnýúkon,kterýmu přepošlejedenzjehopřímýchpodřízených.proto U k jesjednocenímvšechmnožin V i proúředníky i,kteříjsoupřímípodřízeníúředníka k.množiny U k a V k tedy můžeme spočítat jedním průchodem stromu úředníků od listů. Přímotakémůžemevypisovatúředníky,kteřínicnedělají,tj.takové,že u U k. Množiny U k a V k simůžemereprezentovatnapříkladpolem,vněmžjena i-tépozici true, jestliže i patří do množiny, a jinak false. Pak sjednocení dvou množin zabere čas O(M) a počet provedených sjednocení je úměrný počtu úředníků, tedy celková časovásložitostbude O(MN). Totořešenísedáurychlit,kdyžsimístomnožin U k a V k budemepamatovat jejichdoplňky U k a V k.pak V k = U k ua U k = V i. i je přímý podřízený k Pro zrychlení výpočtu průniku si pro každou množinu budeme pamatovat také seznamjejíchprvků.počítáme-li U k,paksinejprvevyberemejeholibovolnéhopodřízeného i,zjehomnožiny V i odstranímeprvky,kterénepatřídomnožinostatních 4
5 podřízených,avýsledekprohlásímeza U k.časovásložitosttétooperaceje O(1), jestliže k má jen jednoho přímého podřízeného, a V i i je přímý podřízený k v ostatních případech. Situaci nám trochu komplikují úředníci, kteří nemají žádné podřízené. Pro ně bychom potřebovali vytvářet nové množiny, což by mohlo dohromady zabrat čas až O(N M). Jak bychom si mohli množiny reprezentovat jinak, abychom zvládli inicializaci v konstantním čase? Jednou možností je použít uspořádaný seznam prvků. V něm pak ale test přítomnosti prvku zabere logaritmický čas, a proto bychom nedosáhli časové složitosti lepší než O(N log N). Složitější, ale rychlejší variantou je reprezentace hešovací tabulkou, jejíž velikost dynamicky přizpůsobujeme velikosti reprezentované množiny(detaily najdete třeba v Kuchařce KSP na Tím zůstane vprůměrnémpřípaděčas O(1)natestpřítomnostiprvkučijehopřidáníavestejné časové složitosti zvládneme množinu i inicializovat. Ukažme si, že toto vylepšené řešení má časovou složitost O(N). Kdykoliv přidámeprvekdomnožiny U k,abychomvytvořili V k,dámemujednukorunu.výpočetmnožiny U k proúředníkasnanejvýšjednímpřímýmpodřízenýmzvládneme vkonstantnímčase.předpokládejme,žepočítáme U k proúředníkast 2přímými podřízenými. Jestližeprvek upatřídovšechmnožin V i těchtopodřízených,pak upatříi do U k anaověřenítétoskutečnostispotřebujemečas O(t).Nicméně, uvmnožinách podřízenýchmádohromady tkorun,jednuznichpředáprvku uvmnožině U k a zbylých t 1 = Ω(t) použije na zaplacení spotřebovaného času. Jestližeprvek upatříjendo r < tzmnožinpodřízených,pak unepatřído U k a na ověření této skutečnosti spotřebujeme čas nejvýše O(r). Tento čas se opět zaplatí r korunami, patřícími výskytům u v množinách podřízených. Pomocí korun přiřazených jednotlivým prvkům jsme tedy ukázali, že čas strávený počítáním průniků je omezenýčasemstrávenýmpřidávánímprvkůdomnožin V,ajetedy O(N). Existuje ale i jednodušeji implementovatelné řešení se stejnou časovou složitostí. Pro každého úředníka si budeme pamatovat, zda je prokazatelně užitečný, tj. už jsme pro něj dokázali, že něco dělá. Na začátku není nikdo prokazatelně užitečný, kromě ministra. Nyní budeme procházet strom úředníků do hloubky. Při průchodu si budeme udržovat následující: prokaždýúkon uzásobník Z u úředníkůnadřízenýchaktuálnímuaschopnýchvykonat u,vpořadídlejejichhloubkyvestromě; seznam S úředníků k nadřízených aktuálnímu takových, že k zatím není prokazatelně užitečný a žádný úředník mezi aktuálním a k neprovádí úkon úředníka k. Dorazíme-li při průchodu k úředníkovi, starajícímu se o styk s veřejností, všechny úředníky v S prohlásíme za prokazatelně užitečné a položíme S =. Dorazíme-li 5
6 kúředníkovi kzpracovávajícímujinýúkon u,pakúředníkanavrcholu Z u smažeme z Sa kpřidámedo Z u a S.Vracíme-liseztakovéhoúředníka k,pakodstraníme k z SazZ u,ajestliženovýúředníknavrcholu Z u neníprokazatelněužitečný,přidáme ho do S. Na konci vypíšeme úředníky, kteří nejsou prokazatelně užiteční. V každém vrcholu strávíme pouze konstantně mnoho času, s výjimkou označování úředníků za prokazatelně užitečné. Každého úředníka ale označíme za prokazatelně užitečného nanejvýš jednou, celková časová složitost označování tedy bude jen O(N).Reprezentujeme-limnožinuzásobníků Z u polem,pakbudečasovásložitost O(N + M), jelikož toto pole musíme zinicializovat. Mohli bychom ho samozřejmě reprezentovat i hešovací tabulkou, čímž by se složitost zlepšila na O(N). Ve vzorovém programu to ale pro přehlednost neděláme. #include <stdio.h> #include <stdlib.h> #define MAXN 1000 #define MAXM 1000 /* Zásobník */ struct ze int prvek; struct ze *dalsi; ; static int vrchol(struct ze *ceho) if (!ceho) return 0; return ceho->prvek; static void vloz(struct ze **kam, int co) struct ze *nw = malloc(sizeof(*nw)); nw->prvek = co; nw->dalsi = *kam; *kam = nw; static void odeber(struct ze **odkud) struct ze *a = *odkud; *odkud = a->dalsi; free(a); /* Popis úředníka */ typedef struct int nadr; /* Přímý nadřízený */ int podr; /* Číslo prvního z podřízených, 0 jestliže žádní nejsou */ int kolega; /* Následující prvek v seznamu podřízených úředníka NADR, 0 jestliže neexistuje */ int ukon; /* Prováděný úkon */ 6
7 int uzit; /* Je prokazatelně užitečný? */ int pozvs; /* Pozice v poli reprezentujícím množinu S; -1 jestliže není v S */ urednik; static int n, m; static urednik urednici[maxn + 1]; static struct ze *z[maxm + 1]; static int s[maxn]; static int slen; static void vyrad_ze_s(int k) int pos = urednici[k].pozvs, prep; if (pos == -1) return; prep = s[slen - 1]; urednici[prep].pozvs = pos; s[pos] = prep; urednici[k].pozvs = -1; slen--; static void vloz_do_s(int k) urednici[k].pozvs = slen; s[slen++] = k; static void pruchod(int k) int i, p = 0, u = urednici[k].ukon; if (u == 1) urednici[k].uzit = 1; for (i = 0; i < slen; i++) urednici[s[i]].uzit = 1; urednici[s[i]].pozvs = -1; slen = 0; else p = vrchol(z[u]); if (p) vyrad_ze_s(p); vloz(&z[u], k); vloz_do_s(k); for (i = urednici[k].podr; i; i = urednici[i].kolega) pruchod(i); if (u!= 1) vyrad_ze_s(k); 7
8 odeber(&z[u]); if (p &&!urednici[p].uzit) vloz_do_s(p); int main(void) int i; const char *sep = ""; urednici[1].pozvs = -1; urednici[1].uzit = 1; urednici[1].podr = 0; urednici[1].kolega = 0; scanf("%d%d", &n, &m); for (i = 2; i <= n; i++) scanf("%d%d", &urednici[i].nadr, &urednici[i].ukon); urednici[i].pozvs = -1; int nad = urednici[i].nadr; urednici[i].kolega = urednici[nad].podr; urednici[nad].podr = i; for (i = urednici[1].podr; i; i = urednici[i].kolega) pruchod(i); for (i = 1; i <= n; i++) if (!urednici[i].uzit) printf("%s%d", sep, i); sep = " "; printf("\n"); return 0; P-III-3 Grafový počítač v potrubí a) Inspirujeme se klasickým tříděním výběrem minima. To funguje tak, že vybíráme nejmenší číslo a přesouváme ho na výstup. Toto opakujeme tak dlouho, dokud ještě něco ve vstupu zbývá. Na klasickém počítači je tento algoritmu kvadraticky pomalý, ale na grafovém počítači to půjde lépe. K popisu vstupu si pořídíme graf. Pro každé číslo si založíme dva vrcholy a spojíme je hranou. Hranu ohodnotíme hodnotou čísla, značky vrcholů námbudouříkat,okolikátéčíslovpořadísejedná. K výběru nejkratší hrany budeme používat funkci Find. Pokud totiž budeme požadovat, aby nám našla libovolnou hranu(veq a eeq nastavíme na any), pak nám vybere hranu s nejmenším ohodnocením. Pomocí SumE toto ohodnocení snadno zjistíme,vypíšemehodovýstupuajelikožvíme,okolikátéčíslosejedná,můžemeho z grafu odstranit. 8
9 Jinými slovy, využili jsme grafový počítač k tomu, aby nám v konstantním čase nacházel nejmenší ze zbývajících čísel. Jelikož počáteční graf vytvoříme v lineárním čase, celkově stihneme všechna čísla setřídit lineárně. Efektivněji to jistě nepůjde, protože každé číslo musíme zapsat na výstup. procedure razeni(var a: array of Integer; pocet: Integer); var Sklad, Hrana, Nalezeno: Graph; i: integer; begin vytvoření grafu Sklad := EmptyG; for i := 1 to pocet do begin AddV(Sklad, 2*i - 1); AddV(Sklad, 2*i); AddE(Sklad, 2*i - 1, 2*i, a[i]); graf, který budeme hledat: jedna neohodnocená hrana Hrana := EmptyG; AddV(Hrana, undef); AddV(Hrana, undef); AddE(Hrana, 1, 2, undef); samotné řazení for i := 1 to pocet do begin Nalezeno := Find(Sklad, Hrana, Any, Any); a[i] := SumE(Nalezeno); DelE(Sklad, GetV(Nalezeno, 1), GetV(Nalezeno, 2)); b) Hledaný podgraf je minimální kostrou zadaného grafu. Pro hledání minimální kostry existuje mnoho standardních algoritmů, my použijeme jednu z variant Jarníkova algoritmu. Ten kostru vytváří postupným rozrůstáním. Začne s jedním libovolným vrcholem. Poté v každém kroku vybere nejkratší hranu vedoucí z již sestrojenéhostromudozbytkugrafuatupřidákestromu.tímstromzvětšíojeden vrchol. Toto se opakuje, dokud strom neobsahuje všechny vrcholy. Důkaz správnosti tohoto algoritmu odložíme na konec, nejprve popíšeme, jak ho rychle implementovat na grafovém počítači. Představme si, že máme vstupní graf rozdělený na skupinu už propojených vrcholů a skupinu těch zbývajících. Pro každou skupinu si pořídíme nový vrchol a propojíme ho hranami se všemi vrcholy dané skupiny. Potom nalezneme libovolnou cestu délky 3 mezi oběma přidanými vrcholy. Jak mohou takové cesty vypadat? Obě jejich krajní hrany budou zajisté ty námi přidané a uprostřed může být libovolná z původních hran vedoucích mezi skupinami. Pokud tedy budou mít všechny přidané hrany stejnou délku, nejkratší cesta tohoto typu bude obsahovat nejkratší z hran mezi skupinami, což je přesně to, co potřebujeme. Po přidání této hrany do stromu stačí nově připojený vrchol přesunout mezi 9
10 skupinami, a to zvládneme v konstantním čase zrušíme jednu falešnou hranu a vytvoříme novou. Jeden krok Jarníkova algoritmu tedy provedeme v konstantním čase a jelikož kostragrafuonvrcholechobsahuje n 1hran,ječasovásložitostnašehoalgoritmu lineární s počtem vrcholů, tedy O(n). Ještě dodejme, že naše řešení zachová i původní ohodnocení hran i vrcholů, což zadání nepožadovalo, ale je to tak hezčí. function min_kostra(g: Graph): Graph; var Vystup, Cesta, Nalezeno: Graph; Propojene, Nepropojene: Integer; i: Integer; begin if CountV(g) < 2 then begin min_kostra := g; exit; Malé a nezajímavé Výstupní graf zatím obsahuje všechny vrcholy a žádné hrany Vystup := EmptyG; for i := 1 to CountV(g) do begin Zkopírovat vrchol a nastavit poznávací značku na náš původní AddV(Vystup, GetV(g, i)); SetV(g, i, i); Vytvoření skupinek Propojene := AddV(g, CountV(g) + 1); AddE(g, 1, Propojene, 0); Nepropojene := AddV(g, CountV(g) + 1); for i := 2 to CountV(g) - 2 do AddE(g, i, Nepropojene, 0); Vytvoříme cestičku. Značky na vrcholech zaručí, že se "přilepí" správným koncem na správnou skupinku. Cesta := EmptyG; AddV(Cesta, Propojene); for i := 1 to 3 do begin AddV(Cesta, undef); AddE(Cesta, i, i + 1, undef); SetV(Cesta, 4, Nepropojene); Pojďme hledat for i := 1 to CountV(g) - 3 do begin Nalezneme správnou hranu Nalezeno := Find(g, Cesta, Value, Any); Přesuneme vrchol mezi skupinkami DelE(g, Nepropojene, GetV(Nalezeno, 3)); AddE(g, Propojene, GetV(Nalezeno, 3), 0); Přidáme hranu do výstupu AddE(Vystup, GetV(Nalezeno, 2), GetV(Nalezeno, 3), GetE(Nalezeno, 2, 3)); min_kostra := Vystup; 10
11 Na závěr dodejme slíbený důkaz správnosti. Využijeme toho, že nám zadání slibuje, že délky všech hran jsou navzájem různé. Dokážeme následujicí lemma: Lemma:Buď Fřezvgrafu takříkámelibovolnémnožiněhrangrafuvedoucímezi nějakou množinou vrcholů a všemi ostatními vrcholy. Potom nejkratší hranu tohoto řezu obsahuje každá minimální kostra. Z tohoto lemmatu ihned plyne správnost Jarníkova algoritmu: množina všech hran vedoucích mezi aktuálním stromem a zbylými vrcholy tvoří řez v grafu, vybraná hrana je nejlehčí v tomto řezu. Důkazlemmatu:Provedemesporem.Nechť Fjeřezmezimnožinamivrcholů AaB, f= u, vjenejkratšíhranatohotořezu;bezújmynaobecnosti u A, v B.Nechť Tjelibovolnáminimálníkostra,kteráneobsahujehranu f.vtprotomusíexistovat nějakácestaspojujícívrcholy uav.jelikožtatocestazačínávaakončívb,musí alespoňjednoupřejítpřesřez.označme f libovolnouhranu,ponížpřešla.pokud nynívkostře Tvyměnímehranu f zahranu f,vznikneopětkostra.ajelikož fje lehčínež f,nemohlabýt Tminimální. 11
68. ročník Matematické olympiády 2018/2019
68. ročník Matematické olympiády 2018/2019 Řešení úloh krajského kola kategorie P P-II-1 Tulipány Budeme řešit o něco obecnější úlohu: dovolíme si předepsat, zda má na n-té pozici být tulipán, a pokud
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
68. ročník Matematické olympiády 2018/2019
68. ročník Matematické olympiády 2018/2019 Řešení úloh ústředního kola kategorie P 2. soutěžní den P-III-4 Výlet Abychom našli požadovaný výlet délky 4, stačí najít dvě hvězdy a a b, které mají dva společné
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
68. ročník Matematické olympiády 2018/2019
68. ročník Matematické olympiády 2018/2019 Řešení úloh ústředního kola kategorie P 1. soutěžní den P-III-1 Půl království Pokud v hledané polorovině neleží všechny zadané body, můžeme bez újmy na obecnosti
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
Stromy. Strom: souvislý graf bez kružnic využití: počítačová grafika seznam objektů efektivní vyhledávání výpočetní stromy rozhodovací stromy
Stromy úvod Stromy Strom: souvislý graf bez kružnic využití: počítačová grafika seznam objektů efektivní vyhledávání výpočetní stromy rozhodovací stromy Neorientovaný strom Orientovaný strom Kořenový orientovaný
Digitální učební materiál
Digitální učební materiál Číslo projektu: CZ.1.07/1.5.00/34.0548 Název školy: Gymnázium, Trutnov, Jiráskovo náměstí 325 Název materiálu: VY_32_INOVACE_145_IVT Autor: Ing. Pavel Bezděk Tematický okruh:
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
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)
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
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ší
Informatika navazující magisterské studium Přijímací zkouška z informatiky 2018 varianta A
Informatika navazující magisterské studium Přijímací zkouška z informatiky 2018 varianta A Každá úloha je hodnocena maximálně 25 body. Všechny své odpovědi zdůvodněte! 1. Postavte na stůl do řady vedle
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í
Grafové algoritmy. Programovací techniky
Grafové algoritmy Programovací techniky Grafy Úvod - Terminologie Graf je datová struktura, skládá se z množiny vrcholů V a množiny hran mezi vrcholy E Počet vrcholů a hran musí být konečný a nesmí být
Grafové algoritmy. Programovací techniky
Grafové algoritmy Programovací techniky Grafy Úvod - Terminologie Graf je datová struktura, skládá se z množiny vrcholů V a množiny hran mezi vrcholy E Počet vrcholů a hran musí být konečný a nesmí být
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í
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
5 Rekurze a zásobník. Rekurzivní volání metody
5 Rekurze a zásobník Při volání metody z metody main() se do zásobníku uloží aktivační záznam obsahující - parametry - návratovou adresu, tedy adresu, kde bude program pokračovat v metodě main () po skončení
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ší
Předmět: Algoritmizace praktické aplikace
Předmět: Algoritmizace praktické aplikace Vytvořil: Roman Vostrý Zadání: Vytvoření funkcí na stromech (reprezentace stromu haldou). Zadané funkce: 1. Počet vrcholů 2. Počet listů 3. Součet 4. Hloubka 5.
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,
Č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á
Ř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
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í
Použití dalších heuristik
Použití dalších heuristik zkracování cesty při FIND-SET UNION podle hodností Datové struktury... p[x] - předchůdce uzlu x MAKE-SET(x) p[x] := x hod[x] := 0 hod[x] - hodnost (aprox. výšky) UNION(x,y) LINK(FIND-SET(x),
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
Test prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem
Test prvočíselnosti Úkol: otestovat dané číslo N, zda je prvočíslem 1. zkusit všechny dělitele od 2 do N-1 časová složitost O(N) cca N testů 2. stačí zkoušet všechny dělitele od 2 do N/2 (větší dělitel
Hledání v textu algoritmem Boyer Moore
Zápočtová práce z Algoritmů a Datových Struktur II (NTIN061) Hledání v textu algoritmem Boyer Moore David Pěgřímek http://davpe.net Algoritmus Boyer Moore[1] slouží k vyhledání vzoru V v zadaném textu
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í,
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é
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é
Vzdálenost uzlů v neorientovaném grafu
Vzdálenosti a grafy Vzdálenost uzlů v neorientovaném grafu Je dán neorientovaný neohodnocený graf G = (V,E,I) vzdálenost uzlů u a v v neorientovaném souvislém grafu G je délka nejkratší cesty spojující
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á
58. ročník Matematické olympiády 2008/2009
58. ročník Matematické olympiády 2008/2009 Řešení úloh krajského kola kategorie P P-II-1 Lesník Jehlička Intuitivně se zdá, že počet mřížových bodů uvnitř mnohoúhelníka by měl být úměrný jeho obsahu. A
Obecná informatika. Matematicko-fyzikální fakulta Univerzity Karlovy v Praze. Podzim 2012
Obecná informatika Přednášející Putovních přednášek Matematicko-fyzikální fakulta Univerzity Karlovy v Praze Podzim 2012 Přednášející Putovních přednášek (MFF UK) Obecná informatika Podzim 2012 1 / 18
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
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ší
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é
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
Dynamicky vázané metody. Pozdní vazba, virtuální metody
Dynamicky vázané metody Pozdní vazba, virtuální metody Motivace... class TBod protected: float x,y; public: int vrat_pocet_bodu() return 1; ; od třídy TBod odvodíme: class TUsecka: public TBod protected:
Stromy. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol.
Stromy Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol., 2018, B6B36DSA 01/2018, Lekce 9 https://cw.fel.cvut.cz/wiki/courses/b6b36dsa/start
ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)
ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK) Strom / tree uzel, vrchol / node, vertex hrana / edge vnitřní uzel
9. lekce Úvod do jazyka C 4. část Funkce, rekurze Editace, kompilace, spuštění Miroslav Jílek
9. lekce Úvod do jazyka C 4. část Funkce, rekurze Editace, kompilace, spuštění Miroslav Jílek 1/24 Editační prostření Kód programu lze editovat v jakémkoli textovém editoru. 2/24 Editační prostření Kód
Implementace LL(1) překladů
Překladače, přednáška č. 6 Ústav informatiky, FPF SU Opava sarka.vavreckova@fpf.slu.cz Poslední aktualizace: 30. října 2007 Postup Programujeme syntaktickou analýzu: 1 Navrhneme vhodnou LL(1) gramatiku
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
2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.
Informatika 10. 9. 2013 Jméno a příjmení Rodné číslo 1) Napište algoritmus pro rychlé třídění (quicksort). 2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus
07 Základní pojmy teorie grafů
07 Základní pojmy teorie grafů (definice grafu, vlastnosti grafu, charakteristiky uzlů, ohodnocené grafy) Definice grafu množina objektů, mezi kterými existují určité vazby spojující tyto objekty. Uspořádaná
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
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.
Hranová konzistence. Arc consistency AC. Nejprve se zabýváme binárními CSP. podmínka odpovídá hraně v grafu podmínek
Hranová konzistence Arc consistency AC Nejprve se zabýváme binárními CSP podmínka odpovídá hraně v grafu podmínek Hrana (V i, V j ) je hranově konzistentní, právě když pro každou hodnotu x z aktuální domény
Šablony, kontejnery a iterátory
11. března 2015, Brno Připravil: David Procházka Šablony, kontejnery a iterátory Programovací jazyk C++ Šablony Strana 2 / 31 Obsah přednášky 1 Šablony 2 Abstraktní datové struktury 3 Iterátory 4 Array
autoři: Rudolf Bayer, Ed McCreight všechny vnější uzly (listy) mají stejnou hloubku ADS (abstraktní datové struktury)
definice ( tree) autoři: Rudolf Bayer, Ed McCreight vyvážený strom řádu m ( ) každý uzel nejméně a nejvýše m potomků s výjimkou kořene každý vnitřní uzel obsahuje o méně klíčů než je počet potomků (ukazatelů)
Binární soubory (datové, typované)
Binární soubory (datové, typované) - na rozdíl od textových souborů data uložena binárně (ve vnitřním tvaru jako v proměnných programu) není čitelné pro člověka - všechny záznamy téhož typu (může být i
ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)
ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK) Strom / tree uzel, vrchol / node, vertex hrana / edge vnitřní uzel
Jan Březina. 7. března 2017
TGH03 - stromy, ukládání grafů Jan Březina Technical University of Liberec 7. března 2017 Kružnice - C n V = {1, 2,..., n} E = {{1, 2}, {2, 3},..., {i, i + 1},..., {n 1, n}, {n, 1}} Cesta - P n V = {1,
Základní datové struktury
Základní datové struktury Martin Trnečka Katedra informatiky, Přírodovědecká fakulta Univerzita Palackého v Olomouci 4. listopadu 2013 Martin Trnečka (UPOL) Algoritmická matematika 1 4. listopadu 2013
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
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
Elegantní algoritmus pro konstrukci sufixových polí
Elegantní algoritmus pro konstrukci sufixových polí 22.10.2014 Zadání Obsah Zadání... 3 Definice... 3 Analýza problému... 4 Jednotlivé algoritmy... 4 Algoritmus SA1... 4 Algoritmus SA2... 5 Algoritmus
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
Algoritmizace a programování
Algoritmizace a programování Strukturované proměnné Pole (array), ukazatele (pointer) Jazyk C České vysoké učení technické Fakulta elektrotechnická Ver.1.10 J. Zděnek 2015 Pole (array) (1) Pole je množina
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?
PROGRAMOVACÍ JAZYKY A PŘEKLADAČE LEXIKÁLNÍ ANALÝZA
PROGRAMOVACÍ JAZYKY A PŘEKLADAČE LEXIKÁLNÍ ANALÝZA 2011 Jan Janoušek BI-PJP Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti LEXIKÁLNÍ ANALÝZA Kód ve vstupním jazyku Lexikální analyzátor
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
INFORMATIKA. Vybrané podposloupnosti
INFORMATIKA Vybrané podposloupnosti (Úlohy z MO kategorie P, 30. část) PAVEL TÖPFER Matematicko-fyzikální fakulta UK, Praha V našem seriálu putujícím po zajímavých úlohách Matematické olympiády - kategorie
Inovace a zkvalitnění výuky prostřednictvím ICT Základy programování a algoritmizace úloh Třídění dat. Ing. Hodál Jaroslav, Ph.D. VY_32_INOVACE_26 04
Střední průmyslová škola a Vyšší odborná škola technická Brno, Sokolská 1 Šablona: Název: Téma: Inovace a zkvalitnění výuky prostřednictvím ICT Základy programování a algoritmizace úloh Třídění dat Autor:
IAJCE Přednáška č. 9. int[] pole = new int[pocet] int max = pole[0]; int id; for(int i =1; i< pole.length; i++) { // nikoli 0 if (Pole[i] > max) {
Vyhledání extrému v poli použito v algoritmech řazení hledání maxima int[] pole = new int[pocet] int max = pole[0]; int id; for(int i =1; i< pole.length; i++) // nikoli 0 if (Pole[i] > max) max = pole[i];
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é
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
Kostry. 9. týden. Grafy. Marie Demlová (úpravy Matěj Dostál) 16. dubna 2019
Grafy 16. dubna 2019 Tvrzení. Je dán graf G, pak následující je ekvivalentní. 1 G je strom. 2 Graf G nemá kružnice a přidáme-li ke grafu libovolnou hranu, uzavřeme přesně jednu kružnici. 3 Graf G je souvislý
4EK311 Operační výzkum. 5. Teorie grafů
4EK311 Operační výzkum 5. Teorie grafů 5. Teorie grafů definice grafu Graf G = uspořádaná dvojice (V, E), kde V označuje množinu n uzlů u 1, u 2,, u n (u i, i = 1, 2,, n) a E označuje množinu hran h ij,
Spojové struktury. Spojová struktura (linked structure):
Spojová struktura (linked structure): Spojové struktury množina objektů propojených pomocí spojů (odkazů, referencí, ukazatelů) Spoj často vyjadřuje vztah předchůdce následník Lineární spojové struktury
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
Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský1/39
Základy algoritmizace Michal Krátký 1, Jiří Dvorský 1 1 Katedra informatiky VŠB Technická univerzita Ostrava Základy algoritmizace, 2006/2007 Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský1/39
BI-PA1 Programování a algoritmizace 1 Katedra teoretické informatiky
Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti Spojové struktury BI-PA1 Programování a algoritmizace 1 Katedra teoretické informatiky Miroslav Balík Fakulta informačních technologií
Sada 1 - Základy programování
S třední škola stavební Jihlava Sada 1 - Základy programování 17. Řadící algoritmy Digitální učební materiál projektu: SŠS Jihlava šablony registrační číslo projektu:cz.1.09/1.5.00/34.0284 Šablona: III/2
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),
Algoritmy I, složitost
A0B36PRI - PROGRAMOVÁNÍ Algoritmy I, složitost České vysoké učení technické Fakulta elektrotechnická v 1.01 Rychlost... Jeden algoritmus (program, postup, metoda ) je rychlejší než druhý. Co ta věta znamená??
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ří
Abstraktní datové typy FRONTA
Abstraktní datové typy FRONTA Fronta je lineární datová struktura tzn., že ke každému prvku s výjimkou posledního náleží jeden následník a ke každému prvku s výjimkou prvního náleží jeden předchůdce. Do
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
Digitální učební materiál
Digitální učební materiál Číslo projektu: CZ.1.07/1.5.00/34.0548 Název školy: Gymnázium, Trutnov, Jiráskovo náměstí 325 Název materiálu: VY_32_INOVACE_149_IVT Autor: Ing. Pavel Bezděk Tematický okruh:
Důkaz správnosti Zbývá dokázat, že nalezená kostra vstupního grafu je minimální. Bez újmy na obecnosti
Minimální kostra Představme si následující problém: Chceme určit silnice, které se budou v zimě udržovat sjízdné, a to tak, abychom celkově udržovali co nejméně kilometrů silnic, a přesto žádné město od
60. ročník Matematické olympiády 2010/2011
60. ročník Matematické olympiády 2010/2011 Řešení úloh domácího kola kategorie P P-I-1 Indiana a poklad Nejjednoduší řešení je následující budeme si udržovat setříděnou posloupnost posledních K prvků a
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í
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
6. Tahy / Kostry / Nejkratší cesty
6. Tahy / Kostry / Nejkratší cesty BI-EP2 Efektivní programování 2 LS 2017/2018 Ing. Martin Kačer, Ph.D. 2011-18 Martin Kačer Katedra teoretické informatiky Fakulta informačních technologií České vysoké
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é
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
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ě
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
Šablony, kontejnery a iterátory
7. října 2010, Brno Připravil: David Procházka Šablony, kontejnery a iterátory Programovací jazyk C++ Šablony Strana 2 / 21 Šablona funkce/metody Šablona je obecný popis (třídy, funkce) bez toho, že by
Volné stromy. Úvod do programování. Kořenové stromy a seřazené stromy. Volné stromy
Volné stromy Úvod do programování Souvislý, acyklický, neorientovaný graf nazýváme volným stromem (free tree). Často vynecháváme adjektivum volný, a říkáme jen, že daný graf je strom. Michal Krátký 1,Jiří
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
Paralelní grafové algoritmy
Paralelní grafové algoritmy Značení Minimální kostra grafu Nejkratší cesta z jednoho uzlu Nejkratší cesta mezi všemi dvojicemi uzlů Použité značení Definition Bud G = (V, E) graf. Pro libovolný uzel u
prohled av an ı graf u Karel Hor ak, Petr Ryˇsav y 16. bˇrezna 2016 Katedra poˇ c ıtaˇ c u, FEL, ˇ CVUT
prohledávání grafů Karel Horák, Petr Ryšavý 16. března 2016 Katedra počítačů, FEL, ČVUT Příklad 1 Nad frontou (queue) byly provedeny následující operace: push(1) push(2) print(poll()) print(peek()) print(peek())
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,
Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague
1 / 40 regula Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague regula 1 2 3 4 5 regula 6 7 8 2 / 40 2 / 40 regula Iterační pro nelineární e Bud f reálná funkce
Drsná matematika III 10. demonstrovaná cvičení Kostry grafů
Drsná matematika III 10. demonstrovaná cvičení Kostry grafů Martin Panák Masarykova univerzita Fakulta informatiky 21.11. 2006 1 Domácí úlohy z minulého týdne Příklad 1 Příklad 2 Příklad 3 2 Borůvkův algoritmus