Algoritmy a výpočetní složitost Zdeněk Sawa Katedra informatiky Fakulta elekrotechniky a informatiky VŠB-TU Ostrava 3. ledna 2005
Co je to algoritmus? Algoritmus Algoritmus je mechanický postup skládající se z nějakých jednoduchých elementárních kroků, který pro nějaký zadaný vstup vyprodukuje nějaký výstup. Algoritmus může být zadán: slovním popisem v přirozeném jazyce jako počítačový program v nějakém programovacím jazyce (C,C++,Java,Pascal,...) jako hardwarový obvod... Algoritmy slouží k řešení různých problémů.
Problémy Problém V zadání problému musí být určeno: co je množinou možných vstupů co je množinou možných výstupů jakýjevztahmezivstupyavýstupy vstupy výstupy
Příklad problému Vstup: Seznam měst a silnic spojujících tato města. Ukaždésilnicejeuvedeno,zkteréhoměstado kteréhovede,ajakájejejídélka(vkm). Dálepakdvěměstazeseznamuměst označmeje městoaaměstob. Výstup:NejkratšícestazměstaAdoměstaB. 23 18 28 20 A 21 17 14 18 30 31 17 25 22 41 15 37 B 34 29
Další příklady problémů Vyhledávání výskytů slova v textu Vstup:TextTaslovoS. Výstup:Seznamvšechpozic,nakterýchsevtextuT vyskytuje slovo S. Prvočíselnost Vstup: Přirozené číslo n. Výstup: Ano pokudjenprvočíslo, Ne vopačnémpřípadě. Pozn.:Přirozenáčísla N={0,1,2,3,4,5,...}
Rozhodovací a optimalizační problémy Situace,kdymnožinavýstupůje { Ano, Ne }jepoměrněčastá. Takovým problémům se říká rozhodovací problémy. Prvočíselnost Vstup: Přirozené číslo n. Otázka: Je n prvočíslo? Problémům, kde je úkolem najít mezi mnoha potenciálními řešeními takové, které je podle nějakého zadaného kritéria nejlepší, se nazývají optimalizační problémy.
Instance problému Instance problému Konkrétní vstup z množiny možných vstupů problému se nazývá instance problému. Příklad1:Text Žluťoučký kůň úpěl ďábelské ódy aslovo úpěl jeinstancíproblémuvyhledáváníslovavtextu. Příklad 2: Číslo 1729 je instancí problému Prvočíselnost.
Řešení problémů Řešení problému Algoritmus řeší daný problém, když: 1 Se pro libovolný vstup daného problému(libovolnou instanci) po konečném počtu kroků zastaví. 2 Vyprodukuje výstup z množiny možných výstupů, který vyhovuje podmínkám uvedeným v zadání problému. Algoritmus, který řeší daný problém, je korektní. Jeden problém může mít více různých korektních řešení.
Doba výpočtu Počítače pracují rychle(řádově miliardy operací za sekundu), ovšem ne nekonečně rychle provedení jedné operace trvá nějakou nenulovou dobu. Výpočet pro tentýž vstup může u různých algoritmů(nebo u různých implementací téhož algoritmu) trvat různou dobu. Tatodobazávisímimojinéna: konkrétní implementaci algoritmu konkrétním použitém programovacím jazyce konkrétním použitém překladači nebo interpretru konkrétním použitém hardwaru(zejména na taktovací frekvenci procesoru)...
Posuzování efektivnosti algoritmů Přirozené otázky: Jak závisí doba běhu programu na použitém algoritmu? Kterýzalgoritmů,kteréřešídanýproblém,je lepší?
Velikost vstupu Pokud známe všechny potřebné detaily můžeme dobu běhu programu pro daný konkrétní vstup vypočítat, případně změřit. Doba běhu programu je obecně pro různé vstupy různá. Zavádíme pojem velikost vstupu např. počet měst a silnic, počet znakůvtextuaveslově,početbitůvbinárníreprezentacičísla apod. Nejčastěji je velikost vstupu definována jako počet bitů (resp. bytů) vstupu.
Efektivnost algoritmů U daného algoritmu zkoumáme, jak závisí doba běhu programu na velikosti vstupu, tj. jak dlouho běží program pro vstup velikosti n. Časová složitost Funkce, která vyjadřuje závislost doby běhu programu na velikosti vstupu se nazývá časová složitost algoritmu. Zkoumáme buď: dobu běhu v nejhorším případě, nebo dobu běhu v průměrném případě.
Příklad: třídění Problém: Třídění Vstup:Posloupnostnprvkůa 1,a 2,...,a n. Výstup:Prvkya 1,a 2,...,a n seřazenéodnejmenšíhopo největší. Příklad: Vstup:31,41,59,26,41,58 Výstup:26,31,41,41,58,59
Algoritmus 1 třídění přímým vkládáním 314159264158 nesetříděné prvky setříděné prvky právě zpracovávaný prvek
Algoritmus 1 třídění přímým vkládáním 314159264158 nesetříděné prvky setříděné prvky právě zpracovávaný prvek
Algoritmus 1 třídění přímým vkládáním 314159264158 nesetříděné prvky setříděné prvky právě zpracovávaný prvek
Algoritmus 1 třídění přímým vkládáním 314159264158 nesetříděné prvky setříděné prvky právě zpracovávaný prvek
Algoritmus 1 třídění přímým vkládáním 314159264158 nesetříděné prvky setříděné prvky právě zpracovávaný prvek
Algoritmus 1 třídění přímým vkládáním 314126594158 nesetříděné prvky setříděné prvky právě zpracovávaný prvek
Algoritmus 1 třídění přímým vkládáním 312641594158 nesetříděné prvky setříděné prvky právě zpracovávaný prvek
Algoritmus 1 třídění přímým vkládáním 263141594158 nesetříděné prvky setříděné prvky právě zpracovávaný prvek
Algoritmus 1 třídění přímým vkládáním 263141594158 nesetříděné prvky setříděné prvky právě zpracovávaný prvek
Algoritmus 1 třídění přímým vkládáním 263141415958 nesetříděné prvky setříděné prvky právě zpracovávaný prvek
Algoritmus 1 třídění přímým vkládáním 263141415958 nesetříděné prvky setříděné prvky právě zpracovávaný prvek
Algoritmus 1 třídění přímým vkládáním 263141415859 nesetříděné prvky setříděné prvky právě zpracovávaný prvek
Algoritmus 1 třídění přímým vkládáním 263141415859 nesetříděné prvky setříděné prvky právě zpracovávaný prvek
Algoritmus 1 třídění přímým vkládáním 263141415859 nesetříděné prvky setříděné prvky právě zpracovávaný prvek Celkový počet operací v nejhorším případě: 1+2+3+ +(n 2)+(n 1)= n (n 1) 2 = 1 2 n2 1 2 n
Algoritmus 2 Merge Sort Hlavní myšlenka: Dvě setříděné posloupnosti snadno spojíme do jediné setříděné posloupnosti. Pokud mají obě posloupnosti dohromady n prvků, vyžaduje tato operace n kroků. 34425861 10115367 =
Algoritmus 2 Merge Sort Hlavní myšlenka: Dvě setříděné posloupnosti snadno spojíme do jediné setříděné posloupnosti. Pokud mají obě posloupnosti dohromady n prvků, vyžaduje tato operace n kroků. 34425861 115367 = 10
Algoritmus 2 Merge Sort Hlavní myšlenka: Dvě setříděné posloupnosti snadno spojíme do jediné setříděné posloupnosti. Pokud mají obě posloupnosti dohromady n prvků, vyžaduje tato operace n kroků. 34425861 5367 = 10 11
Algoritmus 2 Merge Sort Hlavní myšlenka: Dvě setříděné posloupnosti snadno spojíme do jediné setříděné posloupnosti. Pokud mají obě posloupnosti dohromady n prvků, vyžaduje tato operace n kroků. 425861 5367 = 101134
Algoritmus 2 Merge Sort Hlavní myšlenka: Dvě setříděné posloupnosti snadno spojíme do jediné setříděné posloupnosti. Pokud mají obě posloupnosti dohromady n prvků, vyžaduje tato operace n kroků. 5861 5367 = 10113442
Algoritmus 2 Merge Sort Hlavní myšlenka: Dvě setříděné posloupnosti snadno spojíme do jediné setříděné posloupnosti. Pokud mají obě posloupnosti dohromady n prvků, vyžaduje tato operace n kroků. 5861 67 = 1011344253
Algoritmus 2 Merge Sort Hlavní myšlenka: Dvě setříděné posloupnosti snadno spojíme do jediné setříděné posloupnosti. Pokud mají obě posloupnosti dohromady n prvků, vyžaduje tato operace n kroků. 61 67 = 101134425358
Algoritmus 2 Merge Sort Hlavní myšlenka: Dvě setříděné posloupnosti snadno spojíme do jediné setříděné posloupnosti. Pokud mají obě posloupnosti dohromady n prvků, vyžaduje tato operace n kroků. 67 = 10113442535861
Algoritmus 2 Merge Sort Hlavní myšlenka: Dvě setříděné posloupnosti snadno spojíme do jediné setříděné posloupnosti. Pokud mají obě posloupnosti dohromady n prvků, vyžaduje tato operace n kroků. = 1011344253586167
Algoritmus 2 Merge Sort(pokračování) Vstup:58,42,34,61,67,10,53,11 n 58 42 34 61 67 10 53 11 log 2 n 42 58 34 61 10 67 11 53 34 42 58 61 10 11 53 67 10 11 34 42 53 58 61 67 Celkovýpočetoperací:nlog 2 n
Porovnání dvou implementací Jetřebasetřídit10 6 prvků. Implementace A: Implementace B: Použito třídění přímým vkládáním Rychlýpočítač:10 9 operacízasekundu Efektivníimplementace:2n 2 operací Použit merge sort Pomalýpočítač:10 7 operacízasekundu Neefektivní implementace: 50n log n operací
Porovnání dvou implementací(pokračování) Setřídění10 6 prvkůvyžaduje: Implementace A: Implementace B: 2 (10 6 ) 2 instr. 10 9 instr./s 50 (10 6 )log(10 6 )instr. 10 7 instr./s =2000s 100s
Příklad Program zpracovává vstup velikosti n. Předpokládejme, že pro vstup velikosti n provede f(n) operací, a že provedeníjednéoperacetrvá1µs(10 6 s). n f(n) 20 40 60 80 100 200 500 1000 n 20 µs 40 µs 60 µs 80 µs 0.1ms 0.2ms 0.5ms 1ms nlogn 86 µs 0.213ms 0.354ms 0.506ms 0.664ms 1.528ms 4.48ms 9.96ms n 2 0.4ms 1.6ms 3.6ms 6.4ms 10ms 40ms 0.25s 1s n 3 8ms 64ms 0.216s 0.512s 1s 8s 125s 16.7min. n 4 0.16s 2.56s 12.96s 42s 100s 26.6min. 17.36hod. 11.57dní 2 n 1.05s 12.75dní 36560let 38.3 10 9 let 40.1 10 15 let n! 1.85 10 6 let 6.2 10 35 let
Asymptotická notace Při analýze algoritmů většinou není potřeba spočítat počet provedených operací(resp. čas jejich provedení) přesně. Používá se asymptotická notace, která vyjadřuje odhad rychlosti růstu funkce, přičemž jsou zanedbány konkrétní konstanty a méně významné členy: Např.místo35n 2 +732n+2378pracujemesvýrazemO(n 2 ). Výhoda asymptotické notace: Výrazně zjednodušuje analýzu, výsledek nezávisí na detailech konkrétní implementace.
Datové struktury Důležitou součástí studia algoritmů je zkoumání různých datových struktur a analýza složitosti jednotlivých operací prováděných na těchto datových strukturách(vkládání, odstraňování, vyhledávání prvků). Pole: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 Seznam:
Datové struktury(pokračování) Hashovací tabulka: Strom:
Efektivní algoritmy Obecně jsou ze efektivní algoritmy považovány ty jejichž časová složitostjeomezenapolynomem,tj.o(n k ),kdekjekonstanta. O(n),O(n 2 ),O(n 3 ),O(n 4 ),... Takovým algoritmům se říká polynomiální algoritmy. Pokudjesložitostnapř.2 O(n),2 2O(n),2 22O(n),...,pakalgoritmus není polynomiální. Algoritmům,kterémajísložitost2 O(nk) seříkáexponenciální algoritmy.
Obtížné problémy Otázka: Existuje pro každý problém efektivní(polynomiální) algoritmus, který ho řeší?
Obtížné problémy Otázka: Existuje pro každý problém efektivní(polynomiální) algoritmus, který ho řeší? Odpověď: Ne, existují problémy, pro které se dá dokázat, že neexistuje žádný efektivní algoritmus, který by daný problém řešil. Dokonce existují problémy, pro které se dá dokázat, že neexistuje žádný(ani neefektivní) algoritmus, který by daný problém řešil.
Neexistence algoritmů Námitka: Jak dokázat, že něco neexistuje?
Neexistence algoritmů Námitka: Jak dokázat, že něco neexistuje? Odpověď: Sporem. Předpokládáme, že to existuje a ukážeme, že z toho vyplývá nějaký závěr, který je ve zjevném rozporu se skutečností (typicky ukážeme, že něco musí být současně pravda i nepravda).
Příklad obtížného problému Problém Vstup: Uzavřená aritmetická formule vytvořená ze symbolů +,=,,,,,,(,),proměnnýchaceločíselných konstant. Otázka: Je tato formule pravdivá v oboru přirozených čísel? Příklad vstupu: x y z((x+y=z) (y+5=x)) Protentoproblémjeznámalgoritmussesložitostí2 22O(n). Současně bylo dokázáno, že jakýkoliv algoritmus řešící tento problémmásložitostminimálně2 2cn.
Příklad algoritmicky neřešitelného problému Problém Vstup: Uzavřená aritmetická formule vytvořená ze symbolů +,,=,,,,,,(,),proměnnýcha celočíselných konstant. Otázka: Je tato formule pravdivá v oboru přirozených čísel? Příklad vstupu: x y z((x y=z) (y+5=x)) Tento problém je algoritmicky neřešitelný(u rozhodovacích problémů se používá též pojem algoritmicky nerozhodnutelný). Úzce souvisí s Gödelovou větou o neúplnosti.
Další příklad nerozhodnutelného problému Problém Vstup:ProgramvjazyceCanějakájehovstupnídata. Otázka: Zastaví se někdy tento program, když dostane na vstup tato data? Idea důkazu nerozhodnutelnosti: Předpokládejme existenci programu H, který řeší tento problém. Můžeme ho snadno upravit napodprogramh (p,v),kterývrací Ano nebo Ne jako návratovou hodnotu....
Další příklad nerozhodnutelného problému (pokračování)... VytvořímenovýprogramD:VezmesvůjvstupxazavoláH jako H (x,x). PokudH vrátí Ano,Dskočídonekonečnésmyčky. PokudH vrátí Ne,Dsezastaví. ZastavíseprogramDnebone,kdyžmupředložímejakovstup jeho vlastní kód?
Třídy problémů Některé problémy jsou těžší než jiné. Při posuzování obtížnosti problémů se ukázalo jako užitečné rozdělit problémy do tříd složitosti, např.: PTIME problémy řešitelné v polynomiálním čase PSPACE problémy řešitelné s polynomiálním množstvím paměti EXPTIME problémy řešitelné v exponenciálním čase EXPSPACE problémy řešitelné s exponenciálním množstvím paměti...
Třída NPTIME Jednou z nejdůležitějších tříd je třída NPTIME. Třída NPTIME: Do třídy NPTIME patří rozhodovací problémy, pro které existuje polynomiální algoritmus, který ověří správnost nalezeného řešení. Přesnějiřečeno,pokudjeodpověď Ano,existujesvědek,který dosvědčuje,žeodpověďje Ano,kteréhojemožné v polynomiálním čase otestovat, že tomu tak skutečně je. Pokud je odpověď Ne,žádnýtakovýsvědekneexistuje.
Příklad problému z NPTIME Problém Vstup: Popis mapy(seznam států a informace který stát sousedískterým)ačíslok. Otázka:Jemožnéstátyobarvitkbarvamitak,abyžádnédva sousední státy neměly stejnou barvu?
Příklad problému z NPTIME Problém Vstup: Popis mapy(seznam států a informace který stát sousedískterým)ačíslok. Otázka:Jemožnéstátyobarvitkbarvamitak,abyžádnédva sousední státy neměly stejnou barvu?
Pvs.NP Jeden z největších otevřených problémů teoretické informatiky: Otevřený problém: JeP=NP? Pozn.: Třídy PTIME a NPTIME bývají také označovány stručněji PaNP.
NP-úplné problémy Důležitou podtřídou třídy NPTIME jsou tzv. NP-úplné problémy. Definice Problém P je NP-těžký, jestliže platí, že libovolný problém ze třídy NPTIME je možné v polynomiálním čase redukovat na problém P. Definice Problém P je NP-úplný, jestliže je NP-těžký a současně sám patří do třídy NPTIME.
NP-úplné problémy(pokračování) NP-úplné problémy jsou důležité, protože: Kdyby alespoň jeden z nich byl řešitelný v polynomiálním čase, všechny problémy z NPTIME by byly řešitelné v polynomiálním čase. Pokud v NPTIME existuje alespoň jeden problém, který není řešitelný v polynomiálním čase, pak žádný z NP-úplných problémů není řešitelný v polynomiálním čase. Velké množství problémů, které se objevují v praxi v různých oblastech informatiky, je NP-úplných nebo NP-těžkých. To, že NP-úplné problémy nelze řešit v polynomiálním čase je podmínkou nutnou(nikoli však postačující) pro to, aby existovaly šifrovací algoritmy, které by nebyly snadno prolomitelné.
NP-úplné problémy(pokračování) Existuje mnoho případů, kdy máme(zdánlivě) hodně podobné problémy z nichž jeden je řešitelný v polynomiálním čase a druhý je NP-úplný. Problém 1 Vstup: Popis měst a silnic. Výstup: Existuje okružní cesta, na které projedeme každou silnici právě jednou?
NP-úplné problémy(pokračování) Problém 2 Vstup: Popis měst a silnic. Výstup: Existuje okružní cesta, na které projedeme každé město právě jednou? Problém1jevPTIME. Problém 2 je NP-úplný.
Jak řešit těžké problémy? Pokud pro daný problém neexistuje efektivní algoritmus, máme následující možnosti: 1 Exponenciální algoritmy použitelné jen na malé instance. 2 Aproximační řešení použitelné jen pro optimalizační problémy. Najde řešení, které je o něco horší než optimum. 3 Pravděpodobnostní(randomizované) algoritmy najde rychle řešení, ale řešení je s určitou pravděpodobností špatně. 4 Speciální případy soutředit se jen na některé speciální případy instancí, neřešit problém v plné obecnosti. 5 Heuristiky postup, který najde řešení rychle ve většině rozumných případů,nenívšakzaručenoževždy.
Randomizovaný algoritmus Prvočíselnost Vstup: Přirozené číslo p. Otázka: Je p prvočíslo? Teprveodroku2003jeznámpolynomiálníalgoritmus(O(n 12 ), pozdějizlepšennao(n 6 )). VpraxijepoužívánrandomizovanýalgoritmussesložitostíO(n 3 ): Pokudpjeprvočíslo,vrátívždyodpověď Ano. Pokudpneníprvočíslo,jepravděpodobnostodpovědi Ne minimálně 50%, ale existuje až 50% šance, že program vrátí chybnouodpověď Ano.
Randomizovaný algoritmus(pokračování) Program můžeme volat opakovaně(k krát): Pokudprogramvrátíalespoňjednouodpověď Ne,vímena 100%, že p není prvočíslo. Pokudprogramvrátípokaždé Ano,jepravděpodobnost toho,žepneníprvočíslo,menšínež2 k. Když k = 100, je pravděpodobnost chyby zanedbatelně malá. Poznámka: Lze například odvodit, že pravděpodobnost toho, že počítač bude zasažen během dané mikrosekundy meteoritem, je nejméně2 100 zapředpokladu,žekaždých1000letjemeteoritem zničenoalespoň100m 2 zemskéhopovrchu.
Testování prvočíselnosti Pro číslo p hledáme svědka složenosti. Svědka vybíráme náhodně z množiny potenciálních svědků, což je množina Využívá se: {1,2,3,4,...,p 1} Malá Fermatova věta: Pokudpjeprvočíslo,pakprokaždéatakové,že1 a<p,platí (a p 1 modp)=1 Poznámka:Hodnotu(a p 1 modp)jemožnéspočítat v polynomiálním čase.
Testování prvočíselnosti(pokračování) Pokudzjistíme,žepronějakéaje(a p 1 modp) 1,ječísloa svědkem složenosti p. Dáseukázat,žepokudalespoňjednotakovéaexistuje,tak alespoň 50% potenciálních svědků má tuto vlastnost. Pro hledání svědků složenosti pro složená čísla(dosti vzácná), pro která platí tvrzení ve Fermatově větě se využívá následující tvrzení: Věta: Jestliže p je liché prvočíslo, pak rovnice (x 2 modp)=1 mánaintervalu {1,2,...,p 1}právědvěřešení:x=1, x=p 1.