R zné algoritmy mají r znou složitost

Podobné dokumenty
Dynamické programování. Optimální binární vyhledávací strom

Dynamické programování

Dynamic programming. Optimal binary search tree

Dynamické programování

Návrh Designu: Radek Mařík

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

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

Stromy. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol.

Algoritmy a datové struktury

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

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

5 Rekurze a zásobník. Rekurzivní volání metody

Dynamické datové struktury III.

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

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

Stromy, haldy, prioritní fronty

f(x,y) = max ( f(x 1, y 1)+ f(x 1,y) ) + f(x,y 1) +1 jinak f(x,y,z) = f(x 1, y 1, z 1)+ f(x 1,y,z) + f(x,y 1,z) + f(x,y,z 1)+1 jinak

a) b) c) Radek Mařík

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

A4B33ALG 2010/05 ALG 07. Selection sort (Select sort) Insertion sort (Insert sort) Bubble sort deprecated. Quicksort.

Dynamické datové struktury IV.

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

Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz

Rekurzivní algoritmy

B3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11

Adresní vyhledávání (přímý přístup, zřetězené a otevřené rozptylování, rozptylovací funkce)

Datové struktury Úvod

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Programování v C++ 1, 16. cvičení

B3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11

IB111 Úvod do programování skrze Python

5. Dynamické programování

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy

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

Rozklad problému na podproblémy

Prioritní fronta, halda

Seminář z IVT Algoritmizace. Slovanské gymnázium Olomouc Tomáš Kühr

Volné stromy. Úvod do programování. Kořenové stromy a seřazené stromy. Volné stromy

Dynamické programování

Red Black strom (Red Black Tree) Úvod do programování. Rotace. Red Black strom. Rotace. Rotace

BINARY SEARCH TREE

Dynamické programování UIN009 Efektivní algoritmy 1

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.

Rekurze a zásobník. Jak se vypočítá rekurzivní program? volání metody. vyšší adresy. main(){... fa(); //push ret1... } ret1

BINARY SEARCH TREE

12. Globální metody MI-PAA

Hledání k-tého nejmenšího prvku

Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský1/39

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

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

Algoritmy I, složitost

1. Převeďte dané číslo do dvojkové, osmičkové a šestnáctkové soustavy: a) b)

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.

Kombinatorika, výpočty

Dynamické datové struktury II.

součet cvičení celkem. známka. Úloha č.: max. bodů: skut. bodů:

TGH07 - Chytré stromové datové struktury

2 Datové struktury. Pole Seznam Zásobník Fronty FIFO Haldy a prioritní fronty Stromy Hash tabulky Slovníky

RECURSION

Select sort: krok 1: krok 2: krok 3: atd. celkem porovnání. výběr nejmenšího klíče z n prvků vyžaduje 1 porovnání

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

Binární soubory (datové, typované)

Základy řazení. Karel Richta a kol.

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

V případě jazyka Java bychom abstraktní datový typ Time reprezentující čas mohli definovat pomocí třídy takto:

a) Θ(1) b) závislou na hloubce uzlu u c) mezi O(1) a Ω (log n) Jméno:... St. Sk.:. Cvičící:.. Bodů ze cv.: a) Ο(n) b) Θ(n) d) Ο(n 2 )

Úvod do programovacích jazyků (Java)


Vyvažování a rotace v BVS, všude se předpokládá AVL strom

Stromy. Jan Kybic.

Rekurze. Pavel Töpfer, 2017 Programování 1-8 1

pak celou úlohu. ani Jako obvykle je static int M, N; [] key, L, R; NIL = -1; cost; roota, rootb; throws IOExceptio // tree roots on { static void

Rzné algoritmy mají rznou složitost

Algoritmy výpočetní geometrie

Časová složitost algoritmů

Spojové struktury. Spojová struktura (linked structure):

8. Rekurze. doc. Ing. Jiří Vokřínek, Ph.D. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze

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

STROMY A KOSTRY. Stromy a kostry TI 6.1

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

Fronta (Queue) Úvod do programování. Fronta implementace. Fronta implementace pomocí pole 1/4. Fronta implementace pomocí pole 3/4

Dynamické programování

Vyhledávací stromy. Slouží jako pomůcka pro organizaci dat umožňující efektivní vyhledávání.

Binární vyhledávací stromy

Dynamické datové struktury I.

Reprezentace dat v informačních systémech. Jaroslav Šmarda

Předmět: Algoritmizace praktické aplikace

Dotazování nad stromem abstraktní syntaxe

ALG 04. Zásobník Fronta Operace Enqueue, Dequeue, Front, Empty... Cyklická implementace fronty. Průchod stromem do šířky

Programování v C++ 1, 1. cvičení

Stromové struktury v relační databázi

Základy algoritmizace a programování

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT. Cyklus while, do-while, dělitelnost, Euklidův algoritmus

Úvod do programování - Java. Cvičení č.4

Informatika navazující magisterské studium Přijímací zkouška z informatiky 2018 varianta A

TGH07 - Chytré stromové datové struktury

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

DSA, První krok: máme dokázat, že pro left = right vrátí volání f(array, elem, left, right)

TGH05 - Problém za milion dolarů.

Transkript:

/ / zné algoritmy mají r znou složitost Dynamické programování / / Definice funkce Otázka Program f(x,y) = (x = ) (y = ) f(x, y-) + f(x-,y) (x > ) && (y > ) f(,) =? int f(int x, int y) { if ( (x == ) (y == )) return ; return (* f(x, y-) + f(x-,y)); Jednoduchá analýza int count = ; public static int f(int x, int y) { count++; if ( (x == ) (y == )) return ; return (* f(x, y-) + f(x-,y)); xyz = f(,); print(count); Odpov print( f(,) ); f(,) = 7 7 7 Výsledek analýzy count = 69 / 6 / Detailn jší analýza strom rekurzivního volání f(,) f(,9) f(9,) Detailn jší analýza pokra uje efektivita rekurzivního volání po et: volání hodnot f(,) f(9,) f(,8) f(9,9) f(9,9) f(8,) f(9,9) f(9,9) f(8,) f(,7) f(7,) f(7,) 8 f(,6) 9,7 9,7 8,8 9,7 8,8 8,8 7,9 9,7 8,8 8,8 7,9 8,8 7,9 7,9 f(6,) 9,7 8,8 8,8 7,9 9,7 8,8 8,8 7,9 8,8 7,9 7,9 f(6,) 6

7/ 8 / f(x,y) = (x = ) (y = ) f(x, y-) + f(x-,y) (x > ) && (y > ) f(x,y) = (x = ) (y = ) f(x, y-) + f(x-,y) (x > ) && (y > ) 9 x f(,) f(,) f(,) f(,) f(,) f(,) f(,) f(x,y-) f(x-,y) f(x,y) f(,8) 9 f(9,9) f(,9) f(,) f(8,) f(9,) f(,) y 9 y 9 7 9 7 7 9 f(x,y-) f(x-,y) f(x,y) 88 6879 9789 87 6667 777 x 9/ / static int dynarr [N+][N+]; void filldynarr() { int xy, x, y; for (xy = ; xy <= N; xy++) dynarr[][xy] = dynarr[xy][] = ; Všechny hodnoty se p edpo ítají for (y = ; y <=N; y++) for (x = ; x <= N; x++) dynarr[y][x] = *dynarr[y-][x] + dynarr[y][x-]; Volání funkce int f(int x,int y) { return dynarr[y][x]; Dynamické programování Optimální binární vyhledávací strom / / Optimální binární vyhledávací strom Optimální binární vyhledávací strom Vyvážený, ale ne optimální Cena jednotlivých uzl v BVS.8...... Klí...6..9 Pravd podobnost dotazu....... hloubka cena uzlu = pr m rný po et test na nalezení uzlu p i jednom dotazu (Find) cena uzlu = pravd podobnost hloubka. =.. =.. =.. =.88

/ / Cena vyváženého stromu Optimální BVS klí pravd p. p k hloubka d k p k d k..8.......6...9. =..8 =.. =.8. =.. =.6. =.. =.88. =..6 =.. =.. =.6.9 =.8.... =.8. =.9. =. Cena celkem:.7 Cena celkem = pr m. po. test na jednu operaci Find. Struktura optimálního BVS s danými pravd podobnostmi.8.......6....9... / 6 / Cena optimálního BVS Výpo et ceny optimálního BVS klí pravd p. p k hloubka d k p k d k..8.......6...9. =..8 =.. =.. =.. =.6. =.. =.. =.6.6 =.8. =.. =..9 =.7.... =.. =.. =. Cena celkem.6 Zrychlení.7 :.6 = :.7 C k L k- k ekurzivní myšlenka p k Xyz C k k+ C k C k cena levého podstromu uzlu k Cena pravého podstromu uzlu k p k k- Cena = C k + p i + C k + p i + p k i=k+ 7 / 8 / Malé optimální podstromy Výpo et ceny optimálního BVS Idea rekurzivního ešení: Minimalizace ceny BVS. P edpoklad : Všechny menší optimální stromy jsou známy. L N Nad prvky s indexy od L do lze jist vytvo it jeden optimální podstrom.. Zkus: k = L, L+, L+,..., k=l k=l+ k=l+... k= Velikost stromu = po. uzl = -L+ Celkem máme Máme N optimalních podstrom velikosti N- N- podstrom N N * (N+) / r zných optimálních podstrom.. Zaregistruj index k, který minimalizuje cenu, tj. zaregistruj hodnotu: k- C k + p i + C k + p i + p k i=k+. Klí s indexem k je ko enem optimálního stromu.

9 / / Minimalizace ceny BVS Datové struktury pro výpo et optimálního BVS C(L,)... Cena optimálního podstromu obsahujícího klí e s indexy L, L+, L+,..., -, k- C(L,) = min { C(L, k-) + p i + C(k+,) + p i + p k = L k i=k+ (*) = = min { C(L, k-) + C(k+,) + p i = L k min { C(L, k-) + C(k+,) + p i L k Hodnota k minimalizující (*) je indexem ko enu optim. podstromu. Ceny optimálních podstrom pole C [L][] (L ) N L L N+ diagonála... L= Ko eny optimálních podstrom pole roots [L][] (L ) L L N+ diagonála... L= / / Cena konkrétního optimálního podstromu p p p a b c d e p x p y p 6 z p7 t p 8 w p9 (nuly na diagonále a pod ní ) L k p N L=, =9 C(L,) = min { C(L, k-) + C(k+,) + p i C(L,) = min{ +x, p +y, a+z, b+t, c+w, d+p 9, e+ + p i Strategie dynamického programování nejprve se zpracují nejmenší podstromy, pak v tší, atd Stop / / Výpo et polí cen a ko en void optimaltree() { int L,, k, size; double min; // size = for (int i=; i<=n; i++) { C[i][i] = pravd podobnost[i]; [i][i] = i; // size > for (size = ; size <= N; size++) { L = ; = size; while ( <= N) { C[L][] = min(c[l][k-]+c[k+][], k = L..); roots[l][] = k minimalizující p edch. ádek ; C[L][] += sum(c[i][i], i = L..); L++; ++; Vybudování optimálního stromu pomocí pole ko en void buildtree(int L, int ) { int key; if ( < L) return; key = roots[l][]; insert(root, key); // standard BST insert buildtree( L, key-); buildtree( key+, ); Volání funkce buildtree vybuduje optimální strom: buildtree(,n);

/ 6 / Ko eny optimálních podstrom Korespondence strom 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 6 7 7 7 7 7 7 7 7 7 6 7 7 7 7 7 7 7 7 7 6 7 7 7 7 7 7 7 7 7 7 7 7 8 9 9 9 9.8.......6....9... 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 6 7 7 7 7 7 7 7 7 7 6 7 7 7 7 7 7 7 7 7 6 7 7 7 7 7 7 7 7 7 7 7 7 8 9 9 9 9 7 / 8 / Ceny optimálních podstrom -A -B -C -D -E 6-F 7-G 8-H 9-I -J -K -L -M -N -O -A...7.9.8.6.7.6..7..9.7..6 -B.8.8..9..6....9.7..9. -C....8.8.9.6..66.9... -D..6.6.8.6.7.87..9.67.8.86 -E.....68.8.8..6.77.8 6-F....6.7.6...6.67 7-G...6.6.6..7.8. 8-H.....7.78.89.9 9-I.6.6..6.66.77.8 -J....9.6.6 -K...9.. -L.9... -M..7.9 -N.. -O. Dynamické programování Nejdelší spole ná podposloupnost 9 / / Dv posloupnosti A: B: A = 8 B = 7 A n : (a, a,..., a n ) B m : (b, b,..., b m ) C k : (c, c,..., c k ) A 8 : B 7 : 6 7 8 C k = LCS(A n, B m ) C : E D D A Spole ná podposloupnost A: B: ekurzivní pravidla: C: C D A C = ( a n = b m ) ==> (c k = a n = b m ) & (C k- = LCS (A n-, B m- ) ) 6 7 8 6 7 8 Nejdelší spole ná podposloupnost (NSP) A: B: C: E D D A C = A 8 : B 7 : C : E D D A A 7 : B 6 : C : E D D A

/ / ( a n!= b m ) & (c k!= a n ) ==> (C k = LCS (A n-, B m ) ) ekurzivní funkce délka NSP A 7 : B 6 : 6 7 8 C B E A D D E D E C D B D A 6 : B 6 : 6 7 8 C B E A D D E D E C D B D C(n,m) = C(n-, m-) + max{ C(n-, m), C(n, m-) n = or m = n >, m >, a n =b m n >, m >, a n b m C : E D D C : E D D Strategie dynamického programování A : B : ( a n!= b m ) & (c k!= b m ) ==> (C k = LCS (A n, B m- ) ) 6 7 8 C B E A D D E C D B A : B : 6 7 8 C B E A D D E C D B C[n][m] m for (a=; a<=n; a++) for (b=; b<=m; b++) C[a][b] =... ; C : E D C : E D n / / Konstrukce pole pro NSP void findlcs() { int a, b; for (a=; a<=n; a++) for (b=; b <= m; b++) if (A[a] == B[b]) { C[a][b] = C[a-][b-]+; arrows[a][b] = DIAG; else if (C[a-][b] > C[a][b-]) { C[a][b] = C[a-][b]; arrows[a][b] = UP; else { C[a][b] = C[a][b-]; arrows[a][b] = LEFT; Pole NSP pro CBEADDEA a DECDBDA C A: 6 7 8 C B E A D D E A 6 7 B: / / Výpis NSP -- rekurzivn :) void outlcs(int a, int b) { if ((a == ) (b == )) return; if (arrows[a][b] == DIAG) { outlcs(a-, b-); // recursion... print(a[a]); //... reverses the sequence! else if (arrows[a][b] == UP) outlcs(a-,b); else outlcs(a,b-); zné algoritmy mají r znou složitost