X36DSA 25 / 3 DSA Rzné algoritmy mají rznou složitost
X36DSA 25 2 / 3 DSA The complexity of different algorithms varies
X36DSA 25 3 / 3 Abeceda Jazyk Abeceda konená (neprázdná) množina symbol A mohutnost abecedy A Píklady: A = { A, D, G, O, U }, A = 5 A = {,}, A = 2 A = {,, }, A = 3 Slovo Slovo (nad abecedou A) konená (píp. prázdná) také etzec posloupnost symbol abecedy (A) w délka slova w Píklady: w = OUAGADOUGOU, w = w =, w = 4 w =, w = 5
X36DSA 25 4 / 3 Jazyk Jazyk Jazyk množina slov (=etzc) (ne nutn konená, mže být prázdná) L mohutnost jazyka L Specifikace jazyka -- Výtem všech slov jazyka (jen pro konený jazyk) Píklady: A = { A, D, G, O, U } L = {ADA, DOG, GOUDA, D, GAG}, L = 5 A 2 = {,} L 2 = {,,,,, }, L 2 = 6 A 3 = {,, } L 3 = {,, }, L 2 = 3
X36DSA 25 5 / 3 Jazyk 2 Specifikace jazyka -- Volný (ale jednoznaný) popis v pirozeném jazyce (obvykle pro nekonený jazyk) Píklady: A = { A, D, G, O, U } L : Množina všech slov nad A, která zaínají na DA, koní na G a neobsahují podposloupnost AA. L = {DAG, DADG, DAGG, DAOG, DAUG, DADAG, DADDG } L = A 2 = {,} L 2 : Množina všech slov nad A 2, která obsahují více než a za každou jsou alespo dv. L 2 = {,,,,,,,,, } L 2 =
X36DSA 25 6 / 3 Konený automat 3 Specifikace jazyka -- koneným automatem Konený automat (finite automaton) je ptice (A, Q,, S, Q F ), kde: A Q S Q F abeceda konená množina symbol A... mohutnost abecedy... množina stav (mnohdy oíslovaných) (co je to stav?)... pechodová funkce... : Q A Q... poátení stav S Q neprázdná množina koncových stav Q F Q
X36DSA 25 7 / 3 Konený automat Automat FA: A Q S Q F abeceda {,}, A = 2... množina stav {S, A, B, C, D }... pechodová funkce... : Q A Q : { (S,) = S, (A,) = B, (B,) = C, (C,) = C, (D,) = D, (S,) = A, (A,) = D, (B,) = D, (C,) = A, (D,) = D }... poátení stav S Q neprázdná množina koncových stav { C } Q Pechodový diagram automatu FA S A B C FA D,
X36DSA 25 8 / 3 Konený automat FA S A B C D, FA S A B C D,
X36DSA 25 9 / 3 Konený automat FA S A B C D, FA S A B C D,
X36DSA 25 / 3 Konený automat FA S A B C D, FA S A B C D,
X36DSA 25 / 3 Konený automat FA S A B C D, Po petení posledního symbolu je automat FA v koncovém stavu Slovo je pijímáno automatem FA
X36DSA 25 2 / 3 Konený automat FA S A B C D, FA S A B C D,
X36DSA 25 3 / 3 Konený automat FA S A B C D, FA S A B C D,
X36DSA 25 4 / 3 Konený automat FA S A B C D, FA S A B C FA D,
X36DSA 25 5 / 3 Konený automat FA S A B C D, Po petení posledního symbolu je automat FA ve stavu, který není koncový Slovo není pijímáno automatem FA
X36DSA 25 6 / 3 Konený automat FA... S A B C D, FA... S A B C D,
X36DSA 25 7 / 3 Konený automat FA... S A B C D, FA... S A B C D,
X36DSA 25 8 / 3 Konený automat FA... S A B C D, Žádné slovo zaínající Žádné slovo obsahující Žádné slovo obsahující............... není pijímáno automatem FA není pijímáno automatem FA není pijímáno automatem FA Automat FA pijímá pouze slova -- obsahující alespo jednu jedniku -- obsahující za každou jednikou alespo dv nuly Jazyk píjímaný automatem = množina všech slov pijímaných automatem
X36DSA 25 9 / 3 Konený automat innost automatu: Na zaátku je automat ve startovním stavu. Pak te zadané slovo znak po znaku a pechází do dalších stav podle pechodové funkce. Když dote slovo, nachází se opt v nkterém ze svých stav. Pokud je v koncovém stavu, ekneme, že dané slovo pijímá, pokud není v koncovém stavu, ekneme, že dané slovo nepijímá. Všechna slova pijímaná automatem tvoí dohromady jazyk pijímaný (rozpoznávaný) automatem
X36DSA 25 2 / 3 Konený automat Jazyk nad abecedou {,} : Pokud slovo zaíná, koní, pokud slovo zaíná, koní. S A C B D Automat FA2 Ukázka analýzy slov automatem FA2: : (S), (A), (B), (A), (B), (A) (A) není koncový stav, slovo automat FA2 nepijímá. : (S),(C),(D),(C), (C), (D) (D) je koncový stav, slovo automat FA2 pijímá.
X36DSA 25 2 / 3 Konený automat Jazyk: {,,,,,... } S A B D,, C Automat FA3 Ukázka analýzy slov automatem FA3 : (S), (A), (B), (C), (D), (D) (D) není koncový stav, slovo automat FA3 nepijímá. : (S), (A), (B),(B), (B), (C) (C) je koncový stav, slovo automat FA3 pijímá.
X36DSA 25 22 / 3 Konený automat, S A B C Automat FA4 Automat FA4 píjme každé slovo nad abecedou {,} obsahující podposloupnost...... Ukázka analýzy slov automatem FA4 : (S), (A),(A),(B),(C),(C) (C) je koncový stav, slovo automat FA4 pijímá. : (S), (A), (B),(S), (S), (A) (A) není koncový stav, slovo automat FA4 nepijímá.
X36DSA 25 Konený automat 23 / 3 Jazyk nad abecedou { +, -,.,,,, 8, 9, } jehož slova pedstavují zápis desetinného ísla v desítkové soustav,,...,9,,...,9 +,-,,...,9.,,...,9 2 3 4,,...,9 jinak jinak jinak jinak jinak 5 jakýkoli symbol Automat FA5 Ukázka analýzy slov +87.9: (),+ (),8 (2),7 (2),. (3), (4),9 (4) (4) je koncový stav, slovo +87.5 automat pijímá. 76+2: (),7 (2),6 (2),+ (5),2 (5) (5) není koncový stav, slovo 76+2 automat nepijímá.
X36DSA 25 24 / 3 Implementace koneného automatu +,-. 2 jinak,,...,9,,...,9,,...,9,,...,9 jinak jinak jinak 5 3 jakýkoli symbol jinak 4,,...,9 FA5 Kód koneného automatu (tená posloupnost znak je uložena v poli arr[ ]): int isdecimal(int arr[], int length) { int i; int state = ; for(i = ; i < length; i++) { // check each symbol switch (state) {...
X36DSA 25 25 / 3 Implementace koneného automatu +,-. 2 jinak,,...,9,,...,9,,...,9,,...,9 jinak jinak jinak 5 3 jakýkoli symbol jinak 4,,...,9 FA5 case : if ((arr[i] == '+') (arr[i] == '-')) state = ; else if ((arr[i] >= '') && (arr[i] <= '9')) state = 2; else state = 5; break;
X36DSA 25 26 / 3 Implementace koneného automatu +,-. 2 jinak,,...,9,,...,9,,...,9,,...,9 jinak jinak jinak 5 3 jakýkoli symbol jinak 4,,...,9 FA5 case : if ((arr[i] >= '') && (arr[i] <= '9')) state = 2; else state = 5; break;
X36DSA 25 27 / 3 Implementace koneného automatu +,-. 2 jinak,,...,9,,...,9,,...,9,,...,9 jinak jinak jinak 5 3 jakýkoli symbol jinak 4,,...,9 FA5 case 2: if ((arr[i] >= '') && (arr[i] <= '9')) state = 2; else if (arr[i] == '.') state = 3; else state = 5; break;
X36DSA 25 28 / 3 Implementace koneného automatu,,...,9,,...,9,,...,9,,...,9 +,-. 2 jinak jinak jinak jinak 5 3 jakýkoli symbol jinak 4,,...,9 FA5 3 case 3: if ((arr[i] >= '') && (arr[i] <= '9')) state = 4; else state = 5; break; 4 case 4: if ((arr[i] >= '') && (arr[i] <= '9')) state = 4; else state = 5; break; 5 case 5: break; // no need to react anyhow default : break; } // end of switch
X36DSA 25 29 / 3 Implementace koneného automatu +,-. 2 jinak,,...,9,,...,9,,...,9,,...,9 jinak jinak jinak 5 3 jakýkoli symbol jinak 4,,...,9 FA5 } // end of for loop -- word has been read 2 4 if ((state == 2) (state == 4)) // final states!! return ; // success - decimal OK else return ; // not a decimal } // end of function isdecimal()
X36DSA 25 3 / 3 Složitost rekurzivních algoritm Metoda stromu rekurze substituní mistrovská
X36DSA 25 3 / 3 Složitost rekurzivních algoritm T(n) -- asymptotická složitost algoritmu pi vstupu o velikosti n P.: Merge sort Asymptotická složitost vyešení triviální úlohy T(n) = Θ() pro n = 2T(n/2) + Θ(n) pro n > Jak asymptotická složitost pi vstupu o velikosti n závisí na asymptotické složitosti pi vstupu o velikosti n/2 Složitost rozdlení problému a spojení dílích ešení (polovin pole v Merge sortu)
X36DSA 25 32 / 3 Složitost rekurzivních algoritm Co lze zanedbat! typickou hodnotu n si vhodn zvolíme (v Merge sortu mocninu 2)! konkrétní konstanta neovlivní výslednou asymptotickou složitost T(n) = Θ() pro n = 2T(n/2) + Θ(n) pro n >! n/2 a obecn n/konst není celé íslo, mysleme si však, že (vícemén) je, a použijme jej místo správného n/2i n/2 apod.
X36DSA 25 33 / 3 Pro algoritmus A platí Složitost rekurzivních algoritm Píklad T(n) = Θ() pro n = 3T(n/4) + Θ(n 2 ) pro n > Rozdlí data na tvrtiny. Vyešení tvrtinové úlohy trvá T(n/4). Jedna tvrtina se nezpracovává 3 se zpracují v ase 3T(n/4). as potebný na rozdlení na tvrtiny a na spojení tvrtinových úloh je Θ(n 2 ).
X36DSA 25 34 / 3 Složitost rekurzivních algoritm Píklad T(n) = Θ() pro n = 3T(n/4) + Θ(n 2 ) pro n > Vztah pro výpoet T(n) = 3T(n/4) + c n 2
X36DSA 25 35 / 3 Strom rekurze T(n) = 3T(n/4) + c n 2 c n 2 as na dlení problému na dílí problémy a pak spojení dílích ešení T (n/4) T (n/4) T (n/4) as na vyešení jednoho dílího problému Strom rekurze je ale vtší...
X36DSA 25 36 / 3 Strom rekurze T(n) = 3T(n/4) + c n 2 c n 2 Strom rekurze c (n/4) 2 c (n/4) 2 c (n/4) 2 n 6 2 c ( ) n 6 2 c ( ) n 6 2 c ( ) n 6 2 c ( ) n 6 2 c ( 2 ) c ( ) n 6 2 c ( ) n 6 2 c ( ) T() T() T() T() T() T() T()
X36DSA 25 37 / 3 Strom rekurze Prbh výpotu. Nakresli strom rekurze 2. Spoti jeho hloubku 3. Spoti jeho šíku v pate k 4. Spoti cenu uzlu v pate k 5. Seti ceny uzl v pate k 6. Seti ceny všech pater k cena uzlu = asymptotická složitost zpracování podproblému odpovídajícího uzlu ve stromu rekurze. cena stromu = asymptotická složitost zpracování celé úlohy.
X36DSA 25 38 / 3 Strom rekurze Prbh výpotu T(n) = 3T(n/4) + c n 2. Nakresli strom rekurze 2. Spoti jeho hloubku... k V hloubce k je velikost podproblému = n/4 k. Velikost podproblému je tedy =, když n/4 k =, tj k = log 4 (n). Takže strom má log(4) + pater.
X36DSA 25 39 / 3 Strom rekurze T(n) = 3T(n/4) + c n 2 Prbh výpotu... 3. Spoti jeho šíku v pate k... k. patro uzel. patro 3 uzly 2. patro 3 3 = 9 uzl 3. patro 3 3 3 = 27 uzl... k. patro 3 3... 3 3 = 3 k uzl
X36DSA 25 4 / 3 Strom rekurze T(n) = 3T(n/4) + c n 2 Prbh výpotu... 4. Spoti cenu uzlu v pate k... k. patro c n 2. patro c (n/4) 2 2. patro c (n/6) 2 3. patro c (n/64) 2... k. patro c (n/4 k ) 2
X36DSA 25 4 / 3 Strom rekurze T(n) = 3T(n/4) + c n 2 Prbh výpotu... 5. Seti ceny uzl v pate k... V pate k je 3 k uzl, každý má cenu c (n/4 k ) 2. k Celková cena patra k je 3 k c (n/4 k ) 2 = (3/6) k c n 2 Pozor na poslední patro:
X36DSA 25 42 / 3 Strom rekurze T(n) = 3T(n/4) + c n 2 Prbh výpotu... 5. Seti ceny uzl v pate k... Poslední patro je v hloubce log 4 (n) a má tedy k 3 log (n) = n log (3) uzl. 4 4 Každý pispívá konstantní cenou, takže cena posledního patra je n log (3) konst = Θ(n log (3) ) 4 4
X36DSA 25 43 / 3 Strom rekurze Prbh výpotu... 6. Seti ceny všech pater T(n) = 3T(n/4) + c n 2 Celková cena = cn 2 + 3/6 cn 2 + (3/6) 2 cn2 +... + (3/6) log (n ) cn 2 + Θ (n log (3) 4 ) 4 = ( + 3/6 + (3/6) 2 +... + (3/6) log (n ) ) cn 2 + Θ (n log (3) ) 4 4 = Geometrickou posloupnost nahradíme pibližn geometrickou adou (zbytek ady je zanedbatelný). Získáváme horní odhad soutu. ( + 3/6 + (3/6) 2 + (3/6) 3 +... ad inf. ) cn 2 + Θ (n log 4(3) ) = ( / ( 3/6) ) cn 2 + Θ (n log 4(3) ) = 6/3 cn 2 + Θ (n log 4 (3) ) =
X36DSA 25 44 / 3 Strom rekurze Prbh výpotu... 6. Seti ceny všech pater T(n) = 3T(n/4) + c n 2 k 2 > log 4 (3) 6/3 cn 2 + Θ (n log 4 (3) ) = Θ (n 2 ) Asymptotická složitost celého algoritmu A.
X36DSA 25 45 / 3 Substituní metoda Píklad Rekurentní vztah popisující asymptotickou složitost algoritmu B Náš odhad složitosti T(n) = 2T(n/2) + n T(n) = O(n log 2 (n)) Zdroj odhadu: zkušenost, podobnost s jinými úlohami úvaha, intuice... :-) Chceme dokázat: Náš odhad platí Metoda: Bžná matematická indukce, do níž dosadíme (substituujeme) daný rekurentní vztah
X36DSA 25 46 / 3 Substituní metoda Chceme dokázat : T(n) = O(n log 2 (n)), to jest : T(n) c n log 2 (n), pro vhodné c > Krok II (obecný krok) matematické indukce: Dokážeme, že pokud nerovnost platí pro n/2, platí i pro n. Víme: Pedpokládáme: T(n) = 2T(n/2) + n T(n/2) c n/2 log 2 (n/2) Substituce: úpravy: T(n) 2 c n/2 log 2 (n/2) + n cn log 2 (n/2) + n = cn log 2 (n) cn log 2 (2) +n = cn log 2 (n) cn +n cn log 2 (n), pokud c
X36DSA 25 47 / 3 Substituní metoda Krok I matematické indukce: nerovnost T(n) c n log 2 (n), platí pro njaké konkrétní malé n. Nelze dokazovat pro n =, nebo bychom dokazovali T() c log 2 () =, což neplatí, protože jist je T() >. Pozorování T(n) = 2T(n/2) + n Pokud n > 3, v rekurentním vztahu se T() neobjeví, tedy pokud dokážeme indukní krok I pro n = 2 a n = 3, je dkaz hotov pro všechna n 2. Jde nám ale o asymptotickou složitost, tudíž dkaz pro n 2 staí.
X36DSA 25 48 / 3 Substituní metoda Krok I matematické indukce pro n = 2 a n = 3 A T() = k. T(n) = 2T(n/2) + n Z rekurentního vztahu plyne T(2) = 2k+2 T(3) = 2k+3 Chceme mít: T(2) c 2 log 2 (2) T(3) c 3 log 2 (3) Staí tedy volit c max { (2k+2)/2, (2k+3)/(3 log 2 (3)) }.
X36DSA 25 49 / 3 Mistrovská metoda Pímoará aplikace vty: Nech a a b > jsou konstanty, f(n) je funkce a nech asymptotická složitost daného algoritmu je definována rekurentním vztahem T(n) = at(n/b) + f(n), kde podíl n/b lze libovoln interpretovat jako n/b nebo n/b. Potom platí. Pokud f(n) = O(n log (a) e b ) pro njakou konstantu e >, pak T(n) = Θ(n log (a) ). // // b Podmínka. íká, že f(n) musí rst polynomiáln pomaleji než funkce n log (a). b
X36DSA 25 5 / 3 Mistrovská metoda 2. Pokud f(n) = Θ(n log (a) ), pak T(n) = Θ(n log (a) b b ). 3. Pokud f(n) = Ω(n log b (a) +e ) pro njakou konstantu e >, a pokud a f(n/b) c f(n) pro pro njaké c < a pro všechna dostaten velká n, pak T(n) = Θ(f(n)). // // Podmínka 3. íká, že f(n) musí rst polynomiáln rychleji než funkce n log (a). b
X36DSA 25 5 / 3 Mistrovská metoda.... Pokud f(n) = O(n log (a) e b ) pro njakou konstantu e >, pak T(n) = Θ(n log (a) b ).... Píklad. T(n) = 9T(n/3) + n a = 9, b = 3, f(n) = n. Platí n log (a) n log (9) b = 3 = Θ(n 2 ) f(n) = O(n log (9) e ), kde e = 3 Celkem tedy T(n)= Θ(n 2 )
X36DSA 25 52 / 3 Mistrovská metoda... 3. Pokud f(n) = Ω(n log b (a) +e ) pro njakou konstantu e >, a pokud a f(n/b) c f(n) pro pro njaké c < a pro všechna dostaten velká n, pak T(n) = Θ(f(n)). Píklad. T(n) = 2T(n/2) + n log 2 (n) a = 2, b = 2, f(n) = n log 2 (n). Platí = n n log (a) b f(n) = n log 2 (n) roste asymptoticky rychleji než n log (a) b = n. Pozor, neroste ale polynomiáln rychleji. Pomr n log 2 (n) / n = log 2 (n) roste pomaleji než každá rostoucí polynomiální funkce. n log2(n) Ω(n+e) pro každé kladné e. Pedpoklad 3. není splnn.
X36DSA 25 53 / 3 DSA Rzné algoritmy mají rznou složitost