The complexity of different algorithms varies: O(n), Ω(n ), Θ(n log (n)), Dynamické programování Optimální binární vyhledávací strom Různé algoritmy mají různou složitost: O(n), Ω(n ), Θ(n log (n)),
The complexity of different algorithms varies: O(n), Ω(n ), Θ(n log (n)), Optimální binární vyhledávací strom Vyvážený, ale ne optimální. Dana. Hugo.9 Lea.8 Ben.5 Fred.5 Jack. Nick Ann Cole Edna Gene Irma Ken Mark Orrie.....6.5.. Klíč Pravděpodobnost dotazu Různé algoritmy mají různou složitost: O(n), Ω(n ), Θ(n log (n)),
The complexity of different algorithms varies: O(n), Ω(n ), Θ(n log (n)), Optimální binární vyhledávací strom Cena jednotlivých uzlů v BVS cena uzlu = pravděpodobnost hloubka. Hugo. =.. Dana. =..5 Fred.5 =.5 Gene. hloubka. =.88 cena uzlu = průměrný počet testů na nalezení uzlu při jednom dotazu (Find) Různé algoritmy mají různou složitost: O(n), Ω(n ), Θ(n log (n)),
X6DSA 5 Θ(n log (n)), Cena vyváženého stromu klíč pravděp. p k hloubka d k p k d k Ann Ben Cole Dana Edna Fred Gene Hugo Irma Jack Ken Lea..8....5...6.5.5.9. =..8 =.. =.8. =.. =.6.5 =.5. =.88. =..6 =..5 =.5.5 =.6.9 =.8 Mark Nick Orrie.... =.8. =.9. =. Cena celkem:.7 Cena celkem = prům. poč. testů na jednu operaci Find. Různé algoritmy mají různou složitost: O(n), Ω(n ), Θ(n log (n)),
The complexity of different algorithms varies: O(n), Ω(n ), Θ(n log (n)), Optimální BVS Struktura optimálního BVS s danými pravděpodobnostmi. Cole. Gene.5 Ken.8 Ben.5 Fred.6 Irma.9 Lea Ann. Edna Hugo Jack. Nick...5 Dana Mark Orrie... 5 Různé algoritmy mají různou složitost: O(n), Ω(n ), Θ(n log (n)),
Θ(n log (n)), Cena optimálního BVS klíč pravděp. p k hloubka d k p k d k.. =..8.8 =... =.. 5. 5 =.5.. =.6.5.5 =.5.. =... =.6.6 Ann Ben Cole Dana Edna Fred Gene Hugo Irma Jack Ken Lea Mark Nick Orrie.5.5.9....6 =.8.5 =..5 =..9 =.7. 5 =.. =.. 5 =.5 Cena celkem.56 Zrychlení.7 :.56 = :.7 6 Různé algoritmy mají různou složitost: O(n), Ω(n ), Θ(n log (n)), 5 5
The complexity of different algorithms varies: O(n), Ω(n ), Θ(n log (n)), Výpočet ceny optimálního BVS Xyz p k C k C k cena levého podstromu uzlu k Cena pravého podstromu uzlu k C k C k L k- k k+ R Rekurzivní myšlenka k- Cena = C k + p i + C k + i=l R i=k+ p i p k + p k 7 Různé algoritmy mají různou složitost: O(n), Ω(n ), Θ(n log (n)),
X6DSA 5 The complexity of different algorithms varies: O(n), Ω(n ), Θ(n log (n)), Výpočet ceny optimálního BVS Malé optimální podstromy L R N Nad prvky s indexy od L do R lze jistě vytvořit jeden optimální podstrom. Velikost stromu = poč. uzlů = L-R+ Máme N optimalních podstromů velikosti N- N- podstrom N Celkem máme N * (N+) / různých optimálních podstromů. 8 Různé algoritmy mají různou složitost: O(n), Ω(n ), Θ(n log (n)),
The complexity of different algorithms varies: O(n), Ω(n ), Θ(n log (n)), Idea rekurzivního řešení: Minimalizace ceny BVS. Předpoklad : Všechny menší optimální stromy jsou známy.. Zkus: k = L, L+, L+,..., R k=l k=l+ k=l+... k=r. Zaregistruj index k, který minimalizuje cenu, tj. hodnotu k- C k + p i + C k + i=l R i=k+ p i + p k. Klíč s indexem k je kořenem optimálního stromu. 9 Různé algoritmy mají různou složitost: O(n), Ω(n ), Θ(n log (n)),
X6DSA 5 The complexity of different algorithms varies: O(n), Ω(n ), Θ(n log (n)), Minimalizace ceny BVS C(L,R)... Cena optimálního podstromu obsahujícího klíče s indexy L, L+, L+,..., R-, R C(L,R) = k- p i i=l min { C(L, k-) + L k R + C(k+,R) + R p i i=k+ + p k } = = min { C(L, k-) + L k R C(k+,R) + R p i i=l } = (*) = min { C(L, k-) + L k R C(k+,R) } + R p i i=l Hodnota k minimalizující (*) je indexem kořenu optim. podstromu. Různé algoritmy mají různou složitost: O(n), Ω(n ), Θ(n log (n)),
X6DSA 5 The complexity of different algorithms varies: O(n), Ω(n ), Θ(n log (n)), Datové struktury pro výpočet optmálního BVS Ceny optimálních podstromů pole C [L][R] (L R) Kořeny optimálních podstromů pole roots [L][R] (L R) L R N L R L R L R N+ N+ diagonála... L= R diagonála... L= R Různé algoritmy mají různou složitost: O(n), Ω(n ), Θ(n log (n)),
The complexity of different algorithms varies: O(n), Ω(n ), Θ(n log (n)), Výpočet optimálního BVS Cena konkrétního optimálního podstromu p L=, R=9 p p a b c d e p p 5 p 6 p7 x y z C(L,R) = min { C(L, k-) + C(k+,R) } L k R R + p i i=l t p 8 w p9 C(L,R) = min{ +x, p +y, a+z, b+t, c+w, d+p 9, e+ } R + p i i=l p N Různé algoritmy mají různou složitost: O(n), Ω(n ), Θ(n log (n)),
The complexity of different algorithms varies: O(n), Ω(n ), Θ(n log (n)), Výpočet optimálního BVS Strategie DP nejprve se zpracují nejmenší podstromy, pak větší, atd Stop Různé algoritmy mají různou složitost: O(n), Ω(n ), Θ(n log (n)),
The complexity of different algorithms varies: O(n), Ω(n ), Θ(n log (n)), void optimaltree() { int L, R; double min; Výpočet optimálního BVS Výpočet DP tabulek cen a kořenů // size = for( i=; i<=n; i++ ) { C[i][i] = pravděpodobnost[i]; roots[i][i] = i; // size > for( int size = ; size <= N; size++ ) { L = ; R = size; while( R <= N ) { C[L][R] = min(c[l][k-]+c[k+][r], k = L..R); roots[l][r] = k minimalizující předch. řádek ; C[L][R] += sum(c[i][i], i = L..R); L++; R++; } } } Různé algoritmy mají různou složitost: O(n), Ω(n ), Θ(n log (n)),
The complexity of different algorithms varies: O(n), Ω(n ), Θ(n log (n)), Výpočet optimálního BVS Vybudování optimálního stromu pomocí rekonstrukční tabulky kořenů void buildtree( int L, int R) { if (R < L) return; int keyindex = roots[l][r]; // keys... sorted array of keys int key = keys[roots[l][r]]; } insert(root, key); // standard BST insert buildtree( L, keyindex - ); buildtree( keyindex +, R ); 5 Různé algoritmy mají různou složitost: O(n), Ω(n ), Θ(n log (n)),
The complexity of different algorithms varies: O(n), Ω(n ), Θ(n log (n)), Výpočet optimálního BVS Kořeny optimálních podstromů 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 5 6 7 7 7 7 7 7 7 7 7 5 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 5 6 Různé algoritmy mají různou složitost: O(n), Ω(n ), Θ(n log (n)),
The complexity of different algorithms varies: O(n), Ω(n ), Θ(n log (n)), Výpočet optimálního BVS Korespondence stromů.8 Ben Ann.. Cole. Edna Dana..5 Fred. Gene.6 Irma Hugo. Jack.5.5 Ken.9 Lea. Nick Mark. Orrie. 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 5 6 7 7 7 7 7 7 7 7 7 5 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 5 7 Různé algoritmy mají různou složitost: O(n), Ω(n ), Θ(n log (n)),
The complexity of different algorithms varies: O(n), Ω(n ), Θ(n log (n)), Výpočet optimálního BVS Ceny optimálních podstromů -A -B -C -D 5-E 6-F 7-G 8-H 9-I -J -K -L -M -N 5-O -A...7.9.8.6.7.6..57..9.7.5.56 -B.8.8..9.5.6...5.9.7.5.9. -C....8.8.9.6..66.9..5. -D..6.6.8.56.7.87..59.67.8.86 5-E....5.68.8.8.55.6.77.8 6-F.5...56.7.6..5.6.67 7-G...6.6.6..7.8.5 8-H....5.7.78.89.9 9-I.6.6..6.66.77.8 -J.5.5..9.6.6 -K.5..9.5.5 -L.9... -M..7.9 -N..5 5-O. Různé algoritmy mají různou složitost: O(n), Ω(n ), Θ(n log (n)), 8
The complexity of different algorithms varies: O(n), Ω(n ), Θ(n log (n)), Dynamické programování Nejdelší společná podposloupnost 9 Různé algoritmy mají různou složitost: O(n), Ω(n ), Θ(n log (n)),
The complexity of different algorithms varies: O(n), Ω(n ), Θ(n log (n)), Nejdelší společná podposloupnost Dvě posloupnosti A: B: C B E A D D E A D E C D B D A A = 8 B = 7 Společná podposloupnost A: C B E A D D E A B: D E C D B D A C: C D A C = Nejdelší společná podposloupnost (NSP) A: C B E A D D E A B: D E C D B D A C: E D D A C = Různé algoritmy mají různou složitost: O(n), Ω(n ), Θ(n log (n)),
The complexity of different algorithms varies: O(n), Ω(n ), Θ(n log (n)), Nejdelší společná podposloupnost A n : (a, a,..., a n ) B m : (b, b,..., b m ) C k : (c, c,..., c k ) C k = LCS(A n, B m ) A 8 : B 7 : C : 5 6 7 8 C B E A D D E A D E C D B D A E D D A Rekurzivní pravidla: ( a n = b m ) ==> (c k = a n = b m ) & (C k- = LCS (A n-, B m- ) ) 5 6 7 8 5 6 7 8 A 8 : C B E A D D E A A 7 : C B E A D D E A B 7 : D E C D B D A B 6 : D E C D B D A C : E D D A C : E D D A Různé algoritmy mají různou složitost: O(n), Ω(n ), Θ(n log (n)),
The complexity of different algorithms varies: O(n), Ω(n ), Θ(n log (n)), Nejdelší společná podposloupnost ( a n!= b m ) & (c k!= a n ) ==> (C k = LCS (A n-, B m ) ) 5 6 7 8 5 6 7 8 A 7 : C B E A D D E A 6 : C B E A D D E B 6 : D E C D B D B 6 : D E C D B D C : E D D C : E D D ( a n!= b m ) & (c k!= b m ) ==> (C k = LCS (A n, B m- ) ) 5 6 7 8 5 6 7 8 A 5 : C B E A D A 5 : C B E A D B 5 : D E C D B B : D E C D B C : E D C : E D Různé algoritmy mají různou složitost: O(n), Ω(n ), Θ(n log (n)),
The complexity of different algorithms varies: O(n), Ω(n ), Θ(n log (n)), Nejdelší společná podposloupnost Rekurzivní funkce délka LCS 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 Strategie dynamického programování C[n][m] n m for( a=; a<=n; a++ ) for( b=; b<=m; b++ ) C[a][b] =... ; } Různé algoritmy mají různou složitost: O(n), Ω(n ), Θ(n log (n)),
The complexity of different algorithms varies: O(n), Ω(n ), Θ(n log (n)), Nejdelší společná podposloupnost Konstrukce DP tabulek pro LCS void findlcs() { for( int a=; a<=n; a++ ) for( int 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; } } Různé algoritmy mají různou složitost: O(n), Ω(n ), Θ(n log (n)),
The complexity of different algorithms varies: O(n), Ω(n ), Θ(n log (n)), Různé algoritmy mají různou složitost: O(n), Ω(n ), Θ(n log (n)), 5 6 7 C B E A D D E A 5 6 7 8 C D B D A D E C A: B: Pole NSP pro CBEADDEA a DECDBDA Nejdelší společná podposloupnost 5
The complexity of different algorithms varies: O(n), Ω(n ), Θ(n log (n)), Nejdelší společná podposloupnost 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-); } Různé algoritmy mají různou složitost: O(n), Ω(n ), Θ(n log (n)), 6