Úvod do teoretické informatiky
|
|
- Peter Sedlák
- před 6 lety
- Počet zobrazení:
Transkript
1 Úvod do teoretické informatiky Logika a algoritmy (pracovní verze) Zdeněk Sawa Verze: 9. února 2014 VŠB Technická Univerzita Ostrava
2 ii
3 Obsah 1 Úvod 1 I Logika 15 2 Výroková logika úvod Výroky Logickéspojky Negace Konjunkce Disjunkce Implikace Ekvivalence Formule výrokové logiky Syntaxeformulívýrokovélogiky Syntaktickéstromy Závorky Sémantikavýrokovélogiky Tautologie,kontradikceasplnitelnéformule II Algoritmy 49 4 Algoritmy Popisalgoritmůpomocípseudokódu Řídícítok Výpočetalgoritmu Korektnost algoritmů Invarianty Konečnostvýpočtu Výpočetní složitost algoritmů Velikostvstupu Dobavýpočtualgoritmu Časovásložitostalgoritmu iii
4 iv A Symboly 91
5 Kapitola 1 Úvod Cílem této úvodní kapitoly je popsat, co je náplní teoretické informatiky, čím se tento vědní obor zabývá a jaké jsou typické otázky, které se zde zkoumají. Když se řekne například fyzika, biologie nebo třeba geometrie nebo metalurgie, tak každý ví, cosipodtěmitoslovypředstavitačímsezhrubatytooboryzabývají.kdyžseřekneteoretická informatika,takasijenmenšinalidímájasnoupředstavu,cotovlastnějeacojenáplnítohoto oboru. Tento úvodní text by měl dát alespoň rámcovou představu o teoretické informatice jako celku, o alespoň některých jejích podoblastech a o typických problémech, které se v rámci teoretické informatiky řeší. Teoretická informatika je značně široký obor ležící na pomezí mezi informatikou, matematikou a logikou. Teoretická informatika studuje nejrůznější typy problémů, které se objevují v informatice, přičemž pro zkoumání a analýzu těchto problémů používá matematické prostředky. To, co odlišuje teoretickou informatiku od jiných oblastí informatiky a co je pro ni charakteristické, je rigorózní matematický přístup. Důraz je kladen především na důkazy a přesné formální definice pojmů, se kterými se pracuje. Většina výsledků v teoretické informatice, ať už jsou publikovány na odborných konferencích, v časopisech či knihách, má podobu důkazu nějakého tvrzení. Jedním z ústředních pojmů zkoumaných v teoretické informatice je pojem algoritmu. Tím se teoretická informatika odlišuje od jiných oblastí matematiky. V matematice se obecně zkoumá, co platí, co je pravda, zatímco informatika se soustředí především na to, jak to spočítat, tj. soustředí se na samotný proces výpočtu. Algoritmem se rozumí nějaký mechanický postup, jak něco vypočítat, přičemž tento postup jetypickyrealizovánveforměpočítačovéhoprogramu.slovo vypočítat jezdeovšemchápáno vznačněobecnémsmyslu,neboťnemusíjítopočítánívpravémslovasmyslu,tak,jaksetomuto slovu obvykle rozumí v běžné řeči, ale je jím myšlena libovolná transformace nějakých vstupních dat na data, která vydá algoritmus jako výstup. Algoritmyobecněsloužíkřešenínějakýchproblémů.Slovo problém,kterémávběžnéřeči značněširokývýznam,jezdepoužitovespecifickémsmyslu,kterýseodvýznamuslova problém vběžnéřečiponěkudliší.ztohodůvodusetéžněkdymluvíoalgoritmickémproblému,abyse tento rozdíl zdůraznil. V informatice se totiž pod pojmem problém myslí specifikace toho, co má daný algoritmus vypočítat. Konkrétně sestává popis takového algoritmického problému z popisu toho,cojevstupem(tj.jakýtypdatmáalgoritmusočekávatnavstupu),popisutoho,coje výstupem(tj. jaký typ dat má algoritmus vyprodukovat jako svůj výstup) a popisem toho, co má daný výstup splňovat vzhledem ke vstupu. Pro ilustraci uveďme příklady několika takových typických algoritmických problémů. Příkladem velmi jednoduchého problému je třeba problém sečíst dvě čísla: Vstup:Přirozenáčísla xay. Výstup: Přirozenéčíslo ztakové,že z = x+y. 1
6 2 Algoritmus pro řešení tohoto problému čtenář jistě zná, protože postup, jak sečíst dvě čísla je něco,coseučídětinaprvnímstupnizákladníškoly. O něco složitější je třeba problém třídění: Vstup:Posloupnostpřirozenýchčísel a 1,a 2,...,a n. Výstup:Čísla a 1,a 2,...,a n seřazenáodnejmenšíhoponejvětší. S různými algoritmy pro řešení tohoto problémů se asi setká každý, kdo začne studovat programování a algoritmy. Ze známých algoritmů uveďme třeba třídění přímým vkládáním, třídění přímým výběrem, Bubblesort, Quicksort, Heapsort či Mergesort.(Pro jednoduchost bylo ve výše uvedeném popisu problému třídění uvedeno, že se třídí přirozená čísla. Toto však není pro tento problém podstatné, protože třídit se dají prvky libovolného typu. Stačí, pokud je pro daný typ prvků definováno příslušné uspořádání, tj. musí být specifikováno, kdy je jeden prvek menší nebo naopak větší než jiný prvek.) Jako třetí příklad problému uveďme problém z oblasti teorie grafů problém hledání nejkratší cesty v orientovaném grafu: Vstup: Orientovaný graf G, ve kterém jsou hrany ohodnoceny přirozenými čísly, vyjadřujícími délku jednotlivých hran, a dvojice vrcholů tohoto grafu u a v. Výstup: Nejkratší cesta z vrcholu u do vrcholu v, případně informace, že žádná taková cesta neexistuje.(pokud je nejkratších cest víc, může být výstupem libovolná znich.) Příkladem algoritmu, který řeší tento problém, je třeba Dijkstrův algoritmus, se kterým se čtenář možná již někdy setkal v nějakém jiném kurzu. Algoritmické problémy tedy specifikují, co se má vypočítat, neurčují ale jak. Rovněž je důležité, že algoritmické problémy jsou formulovány obecně. Například u problému sčítání dvou přirozenýchčíselnenítentoproblémformulovántak,žesemáurčit,kolikjesoučetčísel 125a451, nýbrž chceme postup, který spočítá součet pro libovolná dvě čísla x a y. Podobně problém třídění nespočívávtom,umětsetříditposloupnost5,1,8,3,2,6,alechceme,abydanýalgoritmusfungoval projakoukolivposloupnost a 1,a 2,...,a n. Konkrétní vstupy(jako dvojice čísel 125, 451 u problému sčítání nebo jako posloupnost 5,1,8,3,2,6 u problému třídění) se označují jako instance problému. U algoritmu tedy nejde o to, umět najít odpovídající řešení(tj. odpovídající výstup) jen pro nějaké konkrétní instance problému, ale o postup, který funguje pro všechny přípustné instance. Algoritmus musí popisovat konkrétní postup, jak transformovat vstupní data na výstupní, přičemž se tento postup skládá z nějakých jednoduchých elementárních kroků. Tyto kroky musí být navíc takového typu, aby je bylo možno vykonávat zcela mechanicky, bez nutnosti rozumět tomu, co se počítá, jinými slovy, aby tento postup bylo možno popsat instrukcemi nějakého programovacího jazyka. O algoritmu se řekne, že řeší daný problém, jestliže platí, že pro každý vstup, který je přípustným vstupem pro daný problém, se algoritmus po konečném počtu kroků zastaví a vydá výstup, který odpovídá tomu, co je popsáno ve specifikaci daného problému. O takovém algoritmu se řekne, že je korektní. Pojem korektnosti algoritmu se tedy vždy vztahuje k nějakému problému, který má daný algoritmus řešit. Není to vlastnost algoritmu jako takového. Speciálně tedy algoritmem, který by řešil daný problém, není postup, který by vyžadoval provedení nekonečného počtu kroků. Algoritmus také není korektním řešením daného problému,
7 3 jestliže existuje alespoň jeden vstup, pro který se algoritmus nikdy nezastaví nebo pro který se zastaví, ale nevydá správný výstup(protože buď nevydá žádný výstup nebo vydá nějaký chybný). To, že nějaký daný konkrétní algoritmus řeší určitý problém, nemusí být v řadě případů vůbec zřejmé. Nepostačuje ani algoritmus implementovat a otestovat na několika(i velmi mnoha) vstupech. Samozřejmě, pokud se najde nějaký alespoň jeden vstup, pro který algoritmus nevrací očekávaný výsledek, tak je jasné, že tento algoritmus korektní není. To, že algoritmus funguje správně na testovacích vstupech, však nevylučuje, že může existovat nějaký jiný vstup, pro který algoritmus vrací chybný výsledek nebo vůbec neskončí. Množina všech možných vstupů bývá téměř vždy nekonečná nebo alespoň velmi velká, takže nepřichází v úvahu možnost vyzkoušet algoritmus pro všechny možné vstupy. Typicky se tedy očekává, že pokud někdo navrhne nějaký algoritmus pro řešení určitého problému, tak kromě toho, že popíše, jak tento algoritmus pracuje, tak podá také důkaz korektnosti tohoto algoritmu. U těch nejprimitivnějších algoritmů, kde je očividné, že algoritmus dělá to co má, sice takový takový důkaz asi potřeba není, ale u jakéhokoliv trochu složitějšího algoritmu je nezbytný, abychom si mohli být alespoň trochu jisti, že algoritmus funguje správně a že neprodukuje nesmyslné výsledky. Důkaz korektnosti algoritmu samozřejmě nezaručuje se stoprocentní jistotou, že algoritmus je skutečně korektní, protože v tomto důkaze může být chyba. Důkaz může být proveden na různých úrovních podrobnosti. Čím má být důkaz podrobnější, tím je pracnější ho vytvořit a zkontrolovat. Na druhou stranu u podrobnějšího důkazu je větší šance, že neobsahuje nějakou zásadní chybu (tj. chybu, která by se nedala snadno opravit, naopak různých triviálních lehce opravitelných chyb bude asi v podrobnějším důkazu více než v méně podrobném). Pokud si vezmeme nějakou konkrétní implementaci daného algoritmu(tj. program zapsaný v nějakém programovacím jazyce, který se dá spustit na počítači), mohou být chyby také v této konkrétní implementaci, i když algoritmus jako takový je v pořádku. Důkaz korektnosti algoritmu tedy sám o sobě ještě nezaručuje, že určitý program bude fungovat správně, ale dává alespoň určitou minimální jistotu ohledně toho, že daný algoritmus není úplně špatně. Pokud by počítače pracovaly nekonečně rychle, stačilo by pro daný problém vždy použít nějaký libovolný algoritmus, který by tento problém řešil. Pokud bychom měli k dispozici více algoritmů řešících tento problém, asi by bylo nejlepší použít nějaký co nejjednodušší algoritmus, u kterého bychom si mohli být více jisti ohledně jeho korektnosti. I když počítače nepracují nekonečně rychle, tak v případě, kdy předpokládáme, že příslušnou implementaci algoritmu budeme používat jen pro malá množství vstupních dat, dá se postupovat přesně tímto způsobem. Pokud například budeme chtít třídit posloupnosti prvků, které budou mít maximálně 10 prvků, je úplně jedno, jestli pro toto třídění použijeme třídění přímým vkládáním, Bubblesort, Mergesort nebo nějaký jiný třídící algoritmus, za předpokladu, že je tento algoritmus korektní. Jiná situace všaknastane,pokudbudemechtíttříditposloupnosti,kterémají nebotřeba prvků. V takovém případě mohou být mezi různými algoritmy obrovské rozdíly v době jejich běhu a ve množství spotřebované paměti, kterou algoritmus ke svému běhu potřebuje. To, co jeden algoritmus počítá hodinu, může jiný spočítat ve zlomku vteřiny. Nějaký jiný neefektivní algoritmus by mohl stejnou věc naopak počítat třeba miliardu let(ovšem dávno předtím, než by takový výpočet skončil, by se počítač, na kterém by výpočet běžel, rozpadl na prach). Konkrétní doba výpočtu je ovlivněna mnoha různými faktory jako je použitý hardware, taktovací frekvence procesoru, použitý programovací jazyk, použitý překladač nebo interpretr tohoto programovacího jazyka, nastavení voleb pro optimalizaci u tohoto překladače, atd. Jedním z nejdůležitějších faktorů je však použitý algoritmus. Volba efektivního nebo naopak nevhodného algoritmu může celkovou dobu výpočtu ovlivnit v mnohem větší míře než tyto ostatní faktory. U algoritmů se tedy posuzuje nejen jejich korektnost(která by měla být považována za samozřejmost, pokud má být algoritmus vůbec použitelný), ale především také to, jak jsou efektivní, tj. jaké jsou jejich časové a paměťové nároky. Časová a paměťová náročnost algoritmů se typicky neposuzuje z hlediska nějakých absolutních jednotek(jako třeba doba běhu v sekundách, počet
8 4 bytů v paměti, apod.), protože ty jsou ovlivněny příliš mnoha jinými faktory než jen samotným algoritmem, a také proto, že tyto hodnoty závisí na konkrétním vstupu a pro různé vstupní hodnoty se mohou(a pravděpodobně budou) lišit. Ukazuje se, že mnohem důležitější je to, jak doba výpočtu či množství použité paměti roste s tím, jak se zvětšuje velikost vstupních dat. Tato závislost doby běhu algoritmu na velikosti vstupních dat se označuje jako časová složitost algoritmu a závislost množství použité paměti na velikosti vstupních dat jako paměťová nebo též prostorová složitost algoritmu. Z formálního hlediska jsou časová a paměťová složitost funkce, které vyjadřují, jak roste doba výpočtu nebo množství použité paměti v závislosti na velikosti vstupu. Časová ani paměťová složitost algoritmu se prakticky nikdy neurčuje zcela přesně, protože by to jednak bylo velice pracné(a u složitějších algoritmů téměř nemožné) a navíc by takový výsledek nebyl příliš užitečný, protože konkrétní hodnoty by závisely na nespočtu různých detailů a při jakékoliv drobné změně v implementaci algoritmu by bylo nutné provést analýzu znovu. Proto se složitost(ať už časová či paměťová) vyjadřuje vždy ve formě nějakého více či méně přesného odhadu, přičemž tento odhad se vyjadřuje většinou ve formě zápisu pomocí tzv. asymptotické notace. Příkladem použití asymptotické notace je například tvrzení, že Bubblesort má časovou složitost O(n 2 ),zatímcomergesort O(nlogn).Napříkladto,žeBubblesortmáčasovousložitost O(n 2 ),znamená,žedobavýpočtutohotoalgoritmujezhrubaúměrnádruhémocniněpočtu prvků, které je třeba setřídit.(pro jistotu upozorněme na to, že toto je poněkud nepřesné a zjednodušenévyjádřenítoho,copřesněčasovásložitost O(n 2 )znamená.) Poznamenejme,žeslovoodhadzdeneznamená,žeseněcohádáneboodhaduje,aleto,žese příslušné funkce vyjadřující složitost neurčují přesně. Místo toho se určuje určitá třída funkcí, do které budou spadat všechny funkce vyjadřující skutečné složitosti v případě všech možných jednotlivých implementací příslušného algoritmu. V tomto smyslu jsou tedy odhady složitosti algoritmů zcela přesná a konkrétní matematická tvrzení, která se matematicky dokazují. Analýzu složitosti algoritmu je možné provádět na různé úrovni podrobnosti. Hrubý odhad složitosti je často rutinní záležitostí, kterou lze provést relativně rychle a snadno projitím kódu algoritmu, spočítáním úrovní zanoření cyklů, určením toho, s kolika prvky se v určité instrukci maximálně pracuje, apod. U efektivních algoritmů je však často jejich skutečná složitost o dost menší než by se podle takové hrubé naivní analýzy mohlo zdát. Přesnější určení složitosti tak může být někdy značně netriviální a v některých případech může vést na komplikované matematické problémy. Přímočaré jednoduché algoritmy většinou nemívají příliš dobrou složitost. Algoritmy s lepší (tj. menší) složitostí mohou být(někdy velmi výrazně) komplikovanější a náročnější na implementaci. U efektivnějších algoritmů také často není na první pohled zjevná jejich korektnost a tuto korektnost je nutné dokazovat a podrobněji zdůvodňovat. Ukazuje se také, že snažit se o co nejmenší časovou složitost může znamenat větší paměťové nároky algoritmu(nejčastěji proto, že si algoritmus ukládá v paměti velké množství různých mezivýsledků, které opakovaně používá). Naopak je možné vytvořit algoritmy, které jsou velmi paměťově úsporné, ale za cenu delší doby výpočtu(algoritmus si v paměti ukládá jen nezbytné minimum dat a mnohé věci počítá opakovaně, aby si je nemusel pamatovat). Většinou se určuje složitost v nejhorším případě, tj. hledá se určité omezení shora na dobu výpočtu či množství použité paměti. Zde se zaručuje, že pro žádný vstup nebude doba výpočtu delší či množství spotřebované paměti větší než to, co bylo odvozeno. Pro mnoho vstupů může být však skutečná doba výpočtu menší, i když třeba existují nějaké vstupy, pro které výpočet může trvat tak dlouho, jak odpovídá odvozené časové složitosti v nejhorším případě. Z toho důvodu se někdy také analyzuje složitost v průměrném případě, kdy se předpokládá nějaké pravděpodobností rozdělení na množině vstupů a počítá se asymptotický odhad střední hodnoty doby výpočtu. (Připomeňme, že pojem střední hodnota označuje hodnotu, ke které by se blížil aritmetický průměr jednotlivých dob výpočtu, kdybychom mnohokrát vybírali náhodná vstupní data podle příslušného pravděpodobnostního rozdělení.) Jako příklad algoritmu, který má nižší časovou složitost v průměrném případě než v nejhor-
9 5 ším případě je možné uvést třeba Quicksort, který má časovou složitost v průměrném případě O(nlogn)zatímcovnejhorším O(n 2 ). Jak se dá očekávat, analýza složitosti v průměrném případě je často výrazně komplikovanější a náročnější než analýza složitosti v nejhorším případě. Náhoda a pravděpodobnost hrají při návrhu a analýze efektivních algoritmů roli nejen z hlediska vstupních dat, ale je také možné je využívat jako prostředku pro vytvoření efektivnějších algoritmů. Tzv. randomizované algoritmy využívají během výpočtu generátor náhodných čísel a vnášejí tak do výpočtu náhodnost, která tam původně nebyla. Pro stejná vstupní data a stejný algoritmus může výpočet proběhnou různě. V některých případech je tato náhodnost využita čistě k tomu, aby se zaručilo, že program s velkou pravděpodobností skončí svůj výpočet rychle. S určitou malou pravděpodobností může trvat výpočet déle, ale program vždy skončí a výsledek bude korektní. Někdy se však používají i randomizované algoritmy, které nejsou korektní v tom smyslu, jak bylo popsáno výše. Tyto algoritmy vracejí s určitou pravděpodobností chybný výsledek, ale pravděpodobnost této chyby je omezena a s delší dobou výpočtu se limitně blíží nule. Pokud se program nechá běžet kratší dobu, bude pravděpodobnost chybného výsledku větší, když se nechá běžet déle, bude pravděpodobnost chyby velmi rychle klesat. Typickým příkladem takových algoritmů jsou algoritmy pro testování velkých prvočísel, které mají velký praktický význam v kryptografii(pro generování šifrovacích klíčů apod.). Jak vyplývá z předchozího, jedním z důležitých témat, kterými se teoretická informatika zabývá, je návrh a analýza efektivních algoritmů pro řešení problémů z nejrůznějších oblastí.(analýzou algoritmů je zde myšleno především dokazování korektnosti těchto algoritmů a analýza jejich výpočetní složitosti.) Teoretická informatika se zde překrývá s řadou jiných oborů matematiky a informatiky. Namátkou uveďme alespoň některé z nich: Teorie grafů tato oblast je bohatým zdrojem nejrůznějších algoritmických problémů. Grafy jsou v informatice všudypřítomné, navíc velké množství problémů z jiných oblastí se často dá přeformulovat jako problémy na grafech. Teorie čísel jedná se o oblast matematiky zabývající se především výpočty na velmi velkých(např. tisícimístných) přirozených číslech. Typické problémy z této oblasti se často týkají prvočísel, dělitelnosti, řešení různých typů rovnic v modulární aritmetice(kde se počítá se zbytky po dělení) apod. Jedná se o poměrně náročnou disciplínu, řada nejobtížnějších matematických výsledků pochází právě z této oblasti(např. důkaz Velké Fermatovy věty), která se však může jevit jako poměrně vzdálená běžné realitě. Ve skutečnosti mají ovšem výsledky z této disciplíny velký praktický význam pro kryptografii. Kryptografie velká většina šifer a dalších kryptografických mechanizmů je založena na tom, že pro určité typy problémů nejsou známy efektivní algoritmy(příkladem takového problému je třeba problém rozkladu velkých čísel na prvočísla či problémy týkající se nalezení řešení určitého typu rovnic v modulární aritmetice) a pro jiné naopak ano(např. nalezení největšího společného dělitele dvou čísel). Bez těchto mechanizmů by například nebyl možný elektronický podpis.(poznamenejme, že analýza kryptografických algoritmů patří k těm nejnáročnějším a nejzrádnějším, protože tyto algoritmy musí být odolné nejen proti řešení hrubou silou, ale i například proti různým sofistikovaným randomizovaným algoritmům.) Výpočetní geometrie je to oblast informatiky, zabývající se řešením geometrických úloh pomocí algoritmů. Tyto algoritmy samozřejmě nepracují s geometrickými objekty jako takovými, ale s jejich reprezentacemi pomocí čísel, která reprezentují například souřadnice bodů, jejich vzdálenosti apod. Algoritmy z této oblasti mají velké využití například v počítačové grafice.
10 6 Vyhledávání v textu, komprese dat existuje velké množství různých algoritmů, které provádějí různé operace s řetězci symbolů. Důležité jsou například algoritmy pro hledání zadaného řetězce v delším textu. Nemusí se hledat jen výskyt konkrétního řetězce, ale to co se hledá, může být zadáno pomocí složitějších kritérií. Algoritmy se také liší podle toho, jestli prohledávaný text může být nějak předzpracován. S touto problematikou úzce souvisí hledání efektivních algoritmů používaných ke kompresi dat. Další oblast, kde se algoritmy pracující s řetězci symbolů používají, je biologie, kdy se tyto algoritmy používají například při analýze DNA. Teorie her jedná se o oblast aplikované matematiky zabývající se analýzou konfliktních situací, kdy se dva nebo více hráčů snaží pomocí určitých akcí dosáhnout nějakých navzájem protikladných cílů. Typické problémy z této oblasti se týkají například hledání optimálních strategií pro jednotlivé hráče, zjišťování, zda má některých z hráčů vítěznou strategii, která muzaručívítězstvíbezohledunato,jakhrajíostatníhráči,apod.řadaproblémůzjiných oblastí matematiky a informatiky, které se na první pohled her vůbec netýkají, se dá zformulovat jako problémy týkající se určitých specifických her. Samostatnou oblastí algoritmů je studium datových struktur. Datové struktury se týkají toho,jakýmzpůsobemmohoubýtvpamětipočítačeuloženykolekcedattak,abysesnimidalo co nejlépe pracovat. Typické datové struktury zahrnují například různé typy stromů(např. RBstromy, AVL-stromy, B-stromy, trie, apod.), rozličné typy hashovacích tabulek, různé druhy spojových seznamů apod. Různé datové struktury se liší časovou složitostí jednotlivých operací, které lze s prvky provádět(přidání prvku, nalezení prvku, odebrání prvku, sekvenční procházení všech prvků apod.), a paměťovými nároky. Neexistuje nějaká jedna nejlepší datová struktura, která by byla vhodná pro všechny účely. Pokud je nějaká datová struktura efektivní pro provádění nějaké jedné operace, je to často vykoupeno vyšší časovou složitostí nějaké jiné operace, nebo vyššími paměťovými nároky nebo podstatně vyšší komplikovaností a náročností na implementaci. Použité datové struktury mají často zásadní vliv na celkovou výpočetní složitost algoritmů, ve kterých jsou použity. Nejefektivnější známé algoritmy pro určité problémy(například to často platí u problémů z teorie grafů) jsou mnohdy založeny na použití různých rafinovaných datových struktur(různé speciální typy stromů apod.). Nestudují se jen algoritmy prováděné sekvenčně na jediném procesoru. Důležitou oblastí je studium paralelních algoritmů a distribuovaných algoritmů, u kterých se předpokládá běh na mnoha současně běžících procesorech. U těchto algoritmů je důležité, jakým způsobem spolu jednotlivé procesory komunikují(sdílená paměť, posílání zpráv), jak se synchronizují, atd. Paralelní algoritmy často vyžadují zcela odlišný přístup než algoritmy sekvenční a důkazy korektnosti takových algoritmů jsou také většinou komplikovanější než v případě sekvenčních algoritmů. Při studiu algoritmů a algoritmických problémů je někdy výhodné se zaměřit na problémy v jejich co nejjednodušší podobě. Proto se často uvažují místo obecnějších problémů, které chceme v praxi řešit, tzv. rozhodovací problémy, což jsou problémy, ve kterých je výstup omezen na odpověď typu Ano/Ne. Vezměme si například problém(vrcholového) barvení grafu: Vstup: Neorientovaný graf G. Výstup: Přiřazení barev vrcholům grafu G tak, aby žádné dva sousední vrcholy nebyly obarveny stejnou barvou a byl použit nejmenší možný počet barev, kterým je vrcholy grafu takto možno obarvit. Místo tohoto obecnějšího problému můžeme uvažovat následující rozhodovací problém: Vstup: Neorientovaný graf G, číslo k.
11 7 Výstup:Ano pokudjemožnéobarvitvrcholygrafu Gpomocí kbarevtak,aby žádné dva sousední vrcholy nebyly obarveny stejnou barvou; Ne pokud to možné není. Rozhodovací problémy bývají často specifikovány tak, že místo toho, aby bylo napsáno, co je výstupem, je tam uvedena otázka týkající se vstupu, na kterou se očekává odpověď Ano nebo Ne. To, že možným výstupem je Ano nebo Ne se tedy ve specifikaci rozhodovacího problému explicitně neuvádíaberesetozaněco,cojeautomatickydané. Výše uvedený problém se například dá formulovat následovně: Vstup: Neorientovaný graf G, číslo k. Otázka: Jemožnéobarvitvrcholygrafu Gpomocí kbarevtak,abyžádnédvasousední vrcholy nebyly obarveny stejnou barvou? Jedním z důvodů, proč se místo obecnějších problémů často uvažují jejich rozhodovací varianty, jeto,žetytoproblémyialgoritmyprojejichřešeníjsoučastooněcojednoduššízhlediskajejich formulace, popisu a analýzy. Pokud je nalezen(efektivní) algoritmus pro řešení daného rozhodovacího algoritmu, většinou se dá tento algoritmus relativně snadno rozšířit o to, aby produkoval odpovědi i na původní obecnější problém. Rozhodovacíproblémytedyvsoběčastokoncentrujíto,cojemožnépovažovatza jádro původního obecnějšího problému, které když se vyřeší, tak vyprodukovat zbytek už je poměrně snadné. Se studiem algoritmů a algoritmických problémů souvisí zkoumání obecnějších otázek, které v souvislosti s algoritmy vyvstávají. Jsou to otázky týkající se toho, jaké typy problémů se vůbec dají pomocí algoritmů řešit. O problému se řekne, že je algoritmicky řešitelný, jestliže existuje nějaký algoritmus, který tento problém řeší(tj. pro každý možný vstup se tento algoritmus po konečném počtu kroků zastaví a vydá správný výstup). U rozhodovacích problémů se většinou místo pojmu algoritmicky řešitelný používá pojem algoritmicky rozhodnutelný či jen rozhodnutelný. Daný rozhodovací problém je tedy rozhodnutelný, jestliže existuje algoritmus řešící tento problém. Naopak pokud algoritmus pro daný problém neexistuje, řekne se o takovém problému, že není algoritmicky řešitelný. V případě rozhodovacího problému se pak o něm řekne, že je nerozhodnutelný. Zdejetřebazdůraznit,coseveformulacipojmůjako algoritmickyřešitelnýproblém, rozhodnutelnýproblém nebo nerozhodnutelnýproblém rozumípojmy existuje nebo neexistuje.pokudseřekne,že existujealgoritmus,nenítímmyšleno,žetakovýalgoritmusužněkdo vymyslel,popsalazdůvodniloněm,žeskutečnědanýproblémřeší.slovu existuje jezdetřeba rozumětvesmysluvjakémsetotoslovopoužívávmatematice,například,kdyžsetřebaonějaké rovnici o jedné neznámé řekne, že existuje(nebo naopak neexistuje) její kořen. Pro danou rovnici, buď existuje nějaké číslo, které, když se dosadí za neznámou, tak rovnice platí, nebo žádné takové číslo neexistuje. Existence nebo neexistence kořene dané rovnice je tedy objektivní fakt, který je zcela nezávislý na tom, zda daný kořen už někdo vypočítal. Podobně, když se řekne, že existuje nějaký algoritmus, který něco splňuje(např. řeší určitý problém), myslí se tím existence takového algoritmu mezi všemi možnými algoritmy, které je možné potenciálně vytvořit, ne jen mezi těmi, které už někdo skutečně vymyslel a popsal. To, zda existuje algoritmus řešící určitý algoritmický problém, je tedy objektivní fakt nezávislý na aktuálních lidských znalostech. Samozřejmě, nejčastěji se o existenci algoritmu pro určitý problém přesvědčíme tím, že někdo takový algoritmus popíše a dokáže, že tento algoritmus skutečně řeší daný problém. Není to ovšem tak, že předtím, než tento algoritmus někdo vymyslel, nebyl daný problém algoritmicky řešitelný a pak se algoritmicky řešitelným stal(nebo byl nerozhodnutelný a
12 8 stal se rozhodnutelným). Takový problém byl algoritmicky řešitelný(resp. rozhodnutelný) vždy, akorát jsme to předtím nevěděli. Pokud se tedy o nějakém problému řekne, že je nerozhodnutelný, je tím myšleno, že vůbec nelze vytvořit algoritmus, který by daný problém řešil. Přirozená otázka je, zda vůbec jsou nějaké nerozhodnutelné problémy. Překvapivě se ukazuje, že ano. Existuje celá řada různých problémů, které se dají přesně(v matematických pojmech) definovatapopsatakterénaprvnípohledmohouvypadat,žebyproněnějakýalgoritmusmohl existovat, ale pro které se dá dokázat, že žádný algoritmus, který by je řešil, neexistuje. Mnoho takových problémů se týká chování programů. Asi není nic překvapivého na tom, že můžeme uvažovat o problémech, kde vstupem je kód nějakého programu. Kód programu je prostě posloupnost znaků(ne ovšem úplně libovolná, ale vyhovující nějakým pravidlům), se kterou se dá pracovat jako s jakoukoliv jinou posloupností znaků. Typickým příkladem programů, které zpracovávají kód jiných programů jako svůj vstup, jsou třeba překladače. Spousta různých problémů týkajících se kódu programů se určitě algoritmicky řešit dá. Například se určitě dá algoritmicky zjistit, zda daný kód obsahuje nějakou nadeklarovanou proměnnou (což je jen jedna ze spousty věcí, kterou zjišťuje překladač při překladu zdrojového kódu). Čtenář jistěsámpřijdesespoustoudalšíchpříkladůtoho,cosedásezdrojovýmikódyprogramudělata co se dá realizovat pomocí nějakého algoritmu. Pomocí algoritmu však například nelze pro libovolný kód programu určit, zda se tento kód vždy po konečném počtu kroků zastaví, podobně nelze pro libovolný kód a určitý příkaz v tomto kódu algoritmem určit, zda existuje nějaký vstup, pro který se tento příkaz provede. Také například nelzeprolibovolnédvakódyprogramůurčit,zdasechovajístejněvtomsmyslu,žeprostejné vstupy dávají vždy stejný výstup. Takových a podobných problémů, které se nedají řešit pomocí algoritmů, existuje velké množství. Je zde ovšem potřeba mít pořád na paměti, co to znamená algoritmické řešení problému. Připomeňme, že algoritmus řeší problém, jestliže se pro každý vstup zastaví a vydá správný výstup. Pokud tedy nějaký problém nemá algoritmické řešení, znamená to, že pro každý algoritmus existuje alespoň jedna instance problému, pro kterou se tento konkrétní algoritmus nikdy nezastaví nebo pro kterou se zastaví, ale vydá chybný výstup. Jednak tedy to, že nějaký problém není algoritmicky řešitelný, neznamená, že se pro žádný vstup tohoto problému nedá najít odpovídající výstup. I u problému, který není algoritmicky řešitelný, může existovat spousta instancí, pro které se dá nějakým algoritmem najít správný výstup. Existují však také nějaké instance, pro které tento algoritmus správný výstup nenajde. To, že problém není algoritmicky řešitelný také neznamená, že existuje nějaká konkrétní instance tohoto problému, se kterou si žádný algoritmus neporadí. Ke každému algoritmu však existuje nějaká instance(ve skutečnosti nekonečně mnoho instancí), pro kterou se tento algoritmus nezastaví nebo pro kterou vrací chybný výstup. Tyto instance jsou však obecně pro různé algoritmy různé. Pokud se tedy o nějakém problému ukáže, že není algoritmicky řešitelný, neznamená to ještě, že nemá smysl se snažit o jeho řešení pomocí algoritmů. Znamená to pouze, že nemůžeme očekávat algoritmus, který bude fungovat pro všechny vstupy. Mimo jiné z výsledků týkajících se nerozhodnutelnosti některých problémů také vyplývá, že nelze zcela automatizovat proces dokazování korektnosti algoritmů, že to není něco, co bychom mohli zcela přenechat počítačům. Při návrhu a analýze algoritmů tedy hrají lidská inteligence a vhled do problému nezastupitelnou úlohu. Poznamenejme, že oblast teoretické informatiky, která se zabývá tím, které problémy jsou a nejsou algoritmicky řešitelné, se nazývá teorie vyčíslitelnosti. To, že pro nějaký problém existuje algoritmus, který ho řeší, ještě z praktického hlediska příliš neznamená. V definici toho, že algoritmus řeší problém, se nic neříká o množství času a paměti, které má tento algoritmus k dispozici. Implicitně se předpokládá, že algoritmus má k dispozici
13 9 neomezené množství času a neomezené množství paměti, což ovšem v praxi nikdy neplatí. Z praktického hlediska je program, který se dopočítá výsledku pro určitý vstup za miliardu let, stejně neužitečný jako program, kde se výpočet pro tento vstup nikdy nezastaví. Z praktického hlediska jsou tedy důležité efektivní algoritmy, které skončí v nějakém rozumném časeabudejimstačitnějaké rozumné množstvípaměti.cojerozumnýčasnebo rozumné množství paměti závisí na konkrétním typu úlohy, kde bude daný algoritmus použit, na typu hardwaru, na kterém program poběží a na velikosti vstupních dat, která se budou zpracovávat. Například při řízení nějakého stroje může být zpozdění 10 ms příliš velké. Naopak jiné typy výpočtů se mohou nechat běžet třeba několik dní. Při běžné interaktivní práci na počítači očekáváme výsledky maximálně v řádu sekund nebo nanejvýš minut(například, když spustíme kompilaci nějakého programu). Pro řadu problémů existují velice efektivní algoritmy s velmi malou výpočetní složitostí. Například není problém na běžném PC nalézt během 1 sekundy nejkratší cestu mezi dvěma vrcholy v grafu, který má vrcholů, přičemž nejdéle na celém výpočtu bude trvat načtení vstupu. Oproti tomu ale existuje také mnoho problémů, které sice jsou algoritmicky řešitelné, ale u kterých se nedaří nelézt efektivní algoritmy. Příkladem takových problémů je třeba dříve uvedený problém barvení vrcholů grafu minimálním počtem barev nebo následující problém, známý pod názvem problém obchodního cestujícího(angl. travelling salesman problem, často se také označuje zkratkou TSP): Vstup: Neorientovaný graf G, kde hrany jsou ohodnoceny přirozenými čísly. Výstup: Nejkratší okružní cesta, která projde všemi vrcholy grafu a skončí ve stejném vrcholu, ve kterém začíná.(délka cesty je součet ohodnocení hran na této cestě.) Oba problémy se dají vyřešit hrubou silou (brute force), tj. systematickým zkoušením všech možných potenciálních řešení, kterých je jen konečný(i když velmi velký) počet. Například u problému barvení grafu je jasné, že stačí nanejvýš tolik barev, kolik je vrcholů, takže se dají zkoušet všechny možnosti, jak přiřadit jednotlivým vrcholům různé barvy z této množiny barev. Těchtomožnostíjejenkonečněmnohoajemožnéjesystematickyprobratavybratznichtu, kde bude použito nejméně barev. Podobně u problému obchodního cestujícího má smysl zkoušet okružní cesty jen do určitého omezeného počtu hran. Takových cest je jen konečně mnoho, takže seopětdajíprobratvšechnyavybratznichtunejkratší. Takovátořešeníhrubousilouseurčitědajípoužíttřebanagrafy,kterémají10vrcholů.Zdese výsledku dočkáme maximálně v řádu sekund. S narůstajícím počtem vrcholů však doba výpočtu takových algoritmů velmi prudce stoupá a pro 100 vrcholů pak výpočet může trvat třeba miliardy let. Tím samozřejmě není řečeno, že takové řešení hrubou silou je tím nejlepším možným přístupem, a že se nic chytřejšího vymyslet nedá. Pro oba problémy existuje řada podstatně chytřejších algoritmů, které však mají buď tu nevýhodu, že nejsou korektní, protože nenajdou nutně vždy to nejoptimálnější řešení(nejmenší počet barev, nejkratší okružní cestu), nebo tu nevýhodu, že na některých instancích nejsou výrazně rychlejší než řešení hrubou silou(i když na některých jiných instancích skončí podstatně rychleji). Ukazuje se, že mnohé algoritmické problémy jsou ze své podstaty výrazně obtížnější než jiné v tom smyslu, že každý algoritmus, který je řeší, vyžaduje mnohem větší množství času a paměti. U některých problémů se dokonce dá dokázat, že existuje nějaká určitá nejmenší časová nebo paměťová složitost, jakou musí mít každý algoritmus, který daný problém řeší. U mnohých problémů se také ukazuje, že složitost algoritmů, které je řeší, je určitým způsobem svázaná se složitostí algoritmů řešících nějaký jiný problém. Tyto složitosti mohou být například provázány v tom smyslu, že dá ukázat, že složitost každého algoritmu, který řeší jeden problém, nemůže být nějak výrazně menší než složitost nejefektivnějších algoritmů, které řeší druhý problém. Podle takových a podobných kritérií je možné klasifikovat problémy do různých tzv. tříd složitosti. Pro problémy patřící do stejné třídy platí vždy podobná omezení na složitost algoritmů,
14 10 které je řeší. Oblast teoretické informatiky, která se zabývá klasifikací problémů podle jejich složitosti, vztahy mezi jednotlivými třídami a dalšími souvisejícími otázkami, se nazývá teorie složitosti. Zvláště důležitou třídou problémů jsou NP-úplné problémy. Výše uvedené problémy vrcholového barvení grafu nebo problém obchodního cestujícího jsou příklady NP-úplných problémů. V literatuře je však popsáno velké množství dalších NP-úplných problémů z nejrůznějších oblastí informatiky. Pro žádný problém z této třídy není znám efektivní algoritmus, ale na druhou stranu se ani zatím nikomu nepodařilo dokázat, že takový algoritmus nemůže existovat. NP-úplné problémy mají tu zajímavou vlastnost, že pokud by se podařilo najít efektivní algoritmus pro jeden jediný NP-úplný problém(je úplně jedno pro který), tak by tím okamžitě byly nalezeny efektivní algoritmy pro všechny ostatní NP-úplné problémy. Pokud by se naopak alespoň pro jeden NPúplný problém podařilo dokázat, že se tento problém nedá žádným efektivním algoritmem řešit, znamenalo by to, že se nadá efektivně řešit ani žádný jiný NP-úplný problém. U algoritmu se předpokládá, že je(nebo může být) vykonáván nějakým typem stroje. Nejčastěji je tímto strojem počítač nějakého typu. Tento počítač má procesor, paměť, nějaká periferní zařízení, pomocí kterých komunikuje s okolím. Různé druhy počítačů se mohou lišit v mnoha ohledech, jinak vypadá superpočítač pro vědecké výpočty, jinak počítač, který řídí automatickou pračku. Přesto však má většina počítačů celou řadu společných rysů. Z hlediska algoritmů je důležité zejména to, s jakým typem dat se pracuje, jakým způsobem jeorganizovánapaměťajakétypyinstrukcíjemožnéprovádět.cosetýkátypudat,sekterými počítače pracují, zde panuje téměř univerzální shoda v tom, že prakticky veškeré typy dat jsou na nízké úrovni reprezentovány jako sekvence bitů, tj. počítače v podstatě nedělají nic jiného, než že určitým způsobem transformují posloupnosti nul a jedniček na jiné posloupnosti nul a jedniček. Doba výpočtu, počet kroků provedených algoritmem během výpočtu a do určité míry i množství použité paměti, jsou do značné míry ovlivněny vlastnostmi stroje, na kterém algoritmus běží. Z toho důvodu není výpočetní složitost algoritmu vlastností algoritmu jako takového, ale vztahuje se(často jen implicitně) k určitému typu stroje. V teoretické informatice se z toho důvodu zavádějí různé výpočetní modely, což jsou různé typy idealizovaných strojů, které mohou provádět algoritmy. Některé tyto výpočetní modely více či méně zhruba odpovídají tomu, jak vypadají skutečné počítače, jiné však mohou vypadat i velmi odlišně. Oproti skutečným počítačům jsou tyto výpočetní modely často výrazně zjednodušené, je v nich ponecháno jen to, co je z hlediska algoritmů skutečně podstatné. U většiny výpočetních modelů se například ignoruje fakt, že skutečné počítače mívají jen konečné množství paměti, a pro jednoduchost se předpokládá, že paměť nemůže nikdy dojít. Z hlediska programování je samozřejmě výhodné, když má programátor k dispozici různé konstrukce programovacího jazyka, kterými může vyjádřit jednotlivé kroky algoritmu jednodušším způsobem, které mu pomáhají program organizovat tak, aby se v kódu dalo vyznat, apod. Z hlediska výpočetní složitosti nebo z hlediska toho, jaké typy problémů se dají pomocí algoritmů řešit, je však většina těchto konstrukcí nepodstatných, protože se dají realizovat pomocí primitivnějších operací. Instrukce vykonávané procesorem jsou většinou velmi primitivní. Programátor tak píše v nějakém vyšším programovacím jazyce, ale tento kód se přeloží do instrukcí na mnohem nižší úrovni. Většina výpočetních modelů pracuje jen s malým počtem typů instrukcí, které jsou schopny vykonávat. Tyto instrukce navíc bývají velmi jednoduché. To, co se na vyšší úrovni dá realizovat jedinou instrukcí, může vyžadovat velké množství jednodušších instrukcí na nižší úrovni. Jednou z oblastí teoretické informatiky je zkoumání vztahů mezi různými výpočetními modely. Konkretně se například dá zkoumat, zda a jak je možné jeden model simulovat pomocí jiného modelu, jak při této simulaci narůstá počet provedených instrukcí apod. Ukazuje se, že veškeré algoritmy je možné realizovat i na velmi primitivních typech strojů, které používají instrukce, které jsou ještě mnohem jednodušší než instrukce používané skutečnými procesory.
15 11 Pro ilustraci uveďme jako příklad stroj, který má konečný počet čítačů, kde každý z těchto čítačů může obsahovat libovolně velké přirozené číslo. Jediné operace, které je možné s těmito čítači provádět, je zvýšit hodnotu čítače o jedna, snížit hodnotu čítače o jedna a otestovat, zda čítač obsahuje nulu. I když se to může zdát neuvěřitelné, těchto několik typů instrukcí postačuje na to, aby se pomocí nich dal implementovat libovolný algoritmus. Různé výpočetní modely většinou neslouží k tomu, aby se pomocí nich skutečně algoritmy popisovaly, protože by to bylo velmi pracné a nepříliš užitečné. Výpočetní modely slouží především jako prostředek používaný při důkazech a i z tohoto hlediska je vhodné, aby byly co nejjednodušší. Potřeba takových výpočetních modelů, které mají na jedné straně stejné vyjadřovací schopnosti jako libovolný programovací jazyk(tj. cokoliv, co se dá napsat v nějakém programovacím jazyce sedárealizovatvrámcidanéhomodelu,ikdyžtřebamnohempracněji)anadruhéstranějsou velmi jednoduché, vyvstává zejména při dokazování toho, že něco nejde(že se daný problém nedá algoritmicky řešit nebo že každý algoritmus, který ho řeší, musí mít nějakou minimální výpočetní složitost). Kromě modelů, které pracují sekvenčně existuje i velké množství různých modelů, které umožňují reprezentovat paralelní výpočty. Výpočetní modely také nemusí mít jen podobu strojů, které se podobají(byť velmi vzdáleně) klasickým počítačům. Existuje také mnoho modelů, kde stav výpočtu algoritmu je reprezentován určitým výrazem(pro jednoduchost si můžeme představit třeba aritmetický výraz) a provádění jednotlivých kroků algoritmu je realizováno jako přepisování tohoto výrazu podle určitých pravidel. Dalším typem výpočetních modelů jsou různý typy logických obvodů, kde je algoritmus realizován pomocí soustavy logických hradel propojených pomocí vodičů. Velmi specifickým výpočetním modelem jsou kvantové počítače. Kromě výpočetních modelů, které jsou schopny realizovat libovolný algoritmus, se zkoumají také různé typy strojů, které mají typy instrukcí omezené natolik, že se pomocí nich nedá realizovat libovolný algoritmus, ale jen určitá specifická omezená třída algoritmů. Takovéto stroje se často označují jako automaty a oblast teoretické informatiky, která se zkoumáním těchto automatů zabývá, se nazývá teorie automatů. Důvod, proč se různými omezenými typy strojů zabývat, je ten, že mnoho otázek, týkajících se algoritmů, které se v obecnosti řešit nedají, se pro určité typy automatů vyřešit dá. V informatice se objevuje nepřeberné množství problémů, které se týkají práce s textem, tj. s posloupnostmi symbolů. Často nechceme pracovat s úplně libovolnými posloupnostmi symbolů, ale jen s takovými, které vyhovují určitým pravidlům. Zde vstupují na scénu otázky týkající se syntaxe. Typickým příkladem je třeba syntaxe programovacích jazyků, kde ne každá náhodná posloupnost znaků je dobře vytvořeným program v daném programovacím jazyce, nýbrž se programy musí řídit určitými přesně danými pravidly, která určují, co je a co není dobře vytvořený program, který půjde přeložit. Nemusí se jednat jen o něco tak komplikovaného jako je programovací jazyk. Ve spoustě aplikací se objevuje potřeba nějakého specifického jazyka pro popis konfigurace nebo pro skriptování aplikace apod. Pokud program pracuje z nějakými textovými daty, která mají nějakou složitější strukturu(tj. není to třeba jen posloupnost čísel, ale jsou tam různé složitější konstrukce), může mít smysl řešit syntaxi těchto dat. Často textové údaje, které zadává uživatel, mohou mít nějakou složitější strukturu(mohou to být například nějaké výrazy, kde mohou být třeba závorky, různé operátory apod.) nebo musí vyhovovat nějakým složitějším kritériím. Oblast informatiky, která se zabývá otázkami týkajícími se syntaxe, se nazývá teorie formálních jazyků. Pojem jazyk označujevinformaticeněcodostodlišnéhoodtoho,cosetímtopojmemoznačuje v přirozené řeči. V informatice, a speciálně v teorii formálních jazyků, pojem jazyk označuje libovolnoumnožinuslov.pojem slovo,zdemáovšemvelmiodlišnývýznamodvýznamutohoto
16 12 slova v přirozené řeči. Pojmem slovo se označuje zcela libovolná(konečná) posloupnost symbolů (nebo též znaků) z nějaké abecedy, přičemž abecedou se zde myslí nějaká libovolná(většinou sepředpokládá,žekonečná)množinasymbolů.jakosynonymumpojmu slovo setéžpoužívá pojem řetězec(string). Pokudsitedyvezmemetřebaabecedutvořenousymboly 0a1,takznichjemožnévytvořit třeba slovo nebo slovo 111. Jazyk je pak nějaká libovolná množina takovýchto slov, třeba množina všech slov, která začínají symbolem 0 a končí symbolem 1. Takový jazyk asi moc zajímavý z praktického hlediska není. Místo toho ale třeba můžeme uvažovat o abecedě tvořené všemi znaky ASCII tabulky a jazyce tvořeném všemi dobře utvořenými aritmetickými výrazy nebo třeba o jazyce, kde slova tohoto jazyka jsou všechny dobře utvořené programy v C++. Je asi jasné, že u takových složitějších jazyků vůbec nemusí být snadné přesně popsat, co přesně jeaconeníslovemdanéhojazyka.popistakovéhojazykavpřirozenéřečimůžebýtnepřesnýa nejednoznačný. V teorii formálních jazyků se studují různé typy formálních prostředků pro popis jazyků, z nichž asi nejdůležitější jsou tzv. gramatiky. Těchto gramatik existuje mnoho různých druhů, které se liší svými vyjadřovacími schopnostmi. Obecně se gramatikami myslí různé sady pravidel, která popisují, jak generovat všechna možná slova daného jazyka, tj. jazyk popsaný danou gramatikou je množina právě těch slov, která se dají pomocí dané gramatiky vygenerovat. V praxi jsou asi nejdůležitější bezkontextové gramatiky, které mají velký význam při popisu syntaxe programovacích jazyků a při tvorbě překladačů pro tyto jazyky. Dalším, v praxi často používaným, formalismem pro popis jazyků jsou regulární výrazy. Na rozdíl od gramatik se regulární výrazy nepoužívají pro popis komplikovaných jazyků, ale spíše pro takové účely jako je vyhledávání určitého vzorku v textu nebo kontrola toho, že údaj zadaný uživatelem vyhovuje požadovanému formátu. Pomocí regulárních výrazů se třeba snadno dá zapsat něco takového jako vyhledat všechny řádky, které obsahují slovo xxx, za kterým následuje libovolný nenulovýpočetmezer,zakterýmijeslovoyyy,zakterýmnásledujejednazčíslic5,6,7. Formální jazyky se také dají popisovat pomocí různých typů automatů. Automat zpracovává jakosvůjvstupslovozurčitéabecedyajakosvůjvýstupvydáodpověď,zdatotoslovopřijímá nebo nepřijímá. Jazyk popsaný daným automatem je pak množina právě těch slov, která automat přijímá. Říká se, že automat rozpoznává daný jazyk. Ukazuje se, že mezi různými druhy gramatik, regulárními výrazy a různými druhy automatů existuje úzká souvislost. Určité gramatiky umožňují generovat právě ty jazyky, které se dají rozpoznávat určitým typem automatů, a naopak. Toho se v praxi využívá tak, že existují softwarové nástroje, které dostanou jako vstup popis gramatiky určitého jazyka. Podle tohoto popisu pak vygenerují programový kód pro rozpoznávání slov daného jazyka, přičemž tento kód je de facto implementací činnosti určitého automatu. Podobně knihovny, ve kterých je implementováno vyhledávání a nahrazování v textu podle regulárních výrazů, často pracují tak, že převádí daný regulární výraz interně na reprezentaci odpovídající příslušnému automatu, a při vyhledávání pak v podstatě simulují činnost tohoto automatu. Logika není podoblast teoretické informatiky, nýbrž samostatný značně rozsáhlý obor, který však s informatikou(zejména s tou teoretickou) velmi úzce souvisí. Logika je obor, který se zabývá otázkami týkajícími se správného vyvozování a argumentace. Zkoumá například, co to přesně znamená, že určitý závěr vyplývá z nějakých daných předpokladů. Logikazkoumárůznátvrzení,alenesoustředísenato,zdatatotvrzení veskutečnosti platínebo ne, ale spíše na to, zda je možné oprávněně z platnosti nějakých tvrzení vyvodit platnost nějakých jiných tvrzení. Logika se v tématech, která se v rámci logiky zkoumají, překrývá v různých ohledech s obory jako jsou filozofie, lingvistika, matematika a informatika.
17 Logika má dlouhou tradici sahající až do antického Řecka a dalších dávných civilizací. Historicky byla logika pojímána jako součást filozofie. Velký vliv mělo zejména dílo řeckého filozofa Aristotela(384 př.n.l. 322 př.n.l.). Zhruba od druhé poloviny 19. století se logika(nebo přinejmenším její určitá část) začala stále více blížit matematice a to ve dvou ohledech. Jednak se začaly v logice stále více prosazovat matematický přístup k řešení problémů, používání matematické notace či formulace různých pojmů a konceptů v matematických pojmech. V tomto ohledu tedy logika začala využívat matematiky jako prostředku pro zkoumání logických pojmů, začala matematiku používat jako nástroj. Protože tvrzení v přirozená řeči jsou často vágní, nejednoznačná, a protože přirozená řeč je komplikovaná, jsou v logice tvrzení většinou reprezentována pomocí tzv. formulí. Formule jsou symbolické výrazy vytvořené podle určitých přesně daných pravidel, s pevně danou syntaxí, ve kterýchsepoužívajíurčitéspeciálnísymboly,reprezentujícíslovajako a ( ), nebo ( ), každý ( ), apod. Formule reprezentují základní strukturu tvrzení, která je důležitá z hlediska pravdivosti, vyplývání, apod. Tím, že jsou tvrzení v přirozené řeči převedena na formule, dochází k jejich určitému zjednodušení a současně ke zpřesnění. V běžném životě provádí každý člověk logické úvahy a jednoduchá vyvození prakticky neustále a často o nich nepotřebuje nějak blíže přemýšlet nebo je dokonce nějak formalizovat. K tomu, abychomvyvodili,žezpředpokladu,že všichnipsijsouživočichové,apředpokladu,že Alík jepes,došlikzávěru,že Alíkježivočich,opravduasinenípotřebareprezentovattytověty pomocí formulí. Pokud však začnou být úvahy a kroky v argumentaci komplikovanější a objekty ve tvrzeních abstraktnější,narůstárizikotoho,žeseněkdevúvazeuděláchybaažeseodvodíněco,cove skutečnosti neplatí. Oblastmi lidské činnosti, kde se provádí složité logické úvahy a kde se v úvahách pracuje s abstraktními objekty, jsou matematika a další exaktní vědy, které používají matematiku pro popis objektů svého zkoumání. V matematice existuje dlouhá tradice používání matematických důkazů jako hlavního prostředku zkoumání. Tyto důkazy jsou typicky formulovány v přirozené řeči v kombinaci s použitím matematické notace. Matematické objekty, které se v důkaze zkoumají, bývají popsány formálně, vlastní proces vyvozování poznatků o těchto objektech však formalizován nebývá. V průběhu 19. století se v matematice začaly zkoumat různé dosti abstraktní a podivné objekty, jako třeba spojité funkce, které nemají derivaci v žádném bodě, různé druhy neeukleidovských geometrií, různé druhy nekonečných množin, apod. Na takových objektech lidská intuice často selhává, v důkazech vět týkajících se takových objektů se proto nelze odvolávat na nějaké názornépředstavynebonato,ženěcoje očividné,protožetakovýpostupmůževéstkodvození nesmyslného závěru, který ve skutečnosti neplatí, nebo nalezení zdánlivého sporu tam, kde žádný spor ve skutečnosti není. V souvislosti s tím začala vyvstávat potřeba postavit matematiku na pevné základy a stanovit přesnějšíkriteriaproto,cojeaconeníkorektnídůkaz,cojenutnéproto,abybylpojemkorektně definován, apod. Jako základ, na kterém se dají vybudovat další oblasti matematiky, byla zvolena teorie množin, vytvořená Georgem Cantorem( ). Koncem 19. století a začátkem 20. století byl rozvoj logiky spojen především se snahou vybudovat pevné nezpochybnitelné základy matematiky, pomocí logických formalismů formalizovat veškeré druhy úvah, které se používají v matematických důkazech, a zavést teorii množin jako základ, na kterém jsou postaveny všechny ostatní oblasti matematiky. Základy výzkumu v této oblasti položili George Boole( ), Gottlob Frege( ), David Hilbert( ) a Bertrand Russell( ), abychom jmenovali alespoň ty nejdůležitější osobnosti. Při těchto snahách o nalezení základů matematiky se záhy ukázalo, že jednoduchý přímočarý přístup založený na teorii množin, tak jak byla zavedena G. Cantorem, vede k vážným problémům. Objevilasecelářadaparadoxůčipřímosporůvzákladechteoriemnožinaukázalose,žepřílišvolné zacházení s různými základními pojmy snadno vede k systémům, které nejsou logicky konzistentní. Formální přístup byl zvolen jako cesta, jak se těmto sporům a paradoxům vyhnout. Při tomto 13
Složitost Filip Hlásek
Složitost Filip Hlásek Abstrakt. Příspěvek popisuje dva základní koncepty teoretické informatiky, Turingovy stroje a složitost. Kromě definic důležitých pojmů uvádí také několik souvisejících tvrzení,
ALGORITMY A DATOVÉ STRUKTURY
Název tématického celku: Cíl: ALGORITMY A DATOVÉ STRUKTURY Metodický list č. 1 Časová složitost algoritmů Základním cílem tohoto tematického celku je vysvětlení potřebných pojmů a definic nutných k popisu
Úvod do teoretické informatiky
Úvod do teoretické informatiky Zdeněk Sawa Katedra informatiky, FEI, Vysoká škola báňská Technická universita Ostrava 17. listopadu 15, Ostrava-Poruba 708 33 Česká republika 11. února 2018 Z. Sawa (VŠB-TUO)
Algoritmy. Z. Sawa (VŠB-TUO) Úvod do teoretické informatiky 15. dubna / 39
Algoritmy Z. Sawa (VŠB-TUO) Úvod do teoretické informatiky 15. dubna 2018 1/ 39 Algoritmy Příklad: Popis algoritmu pomocí pseudokódu: Algoritmus 1: Algoritmus pro nalezení největšího prvku v poli 1 Find-Max(A,n):
Algoritmus. Přesné znění definice algoritmu zní: Algoritmus je procedura proveditelná Turingovým strojem.
Algoritmus Algoritmus je schematický postup pro řešení určitého druhu problémů, který je prováděn pomocí konečného množství přesně definovaných kroků. nebo Algoritmus lze definovat jako jednoznačně určenou
Výroková a predikátová logika - III
Výroková a predikátová logika - III Petr Gregor KTIML MFF UK ZS 2017/2018 Petr Gregor (KTIML MFF UK) Výroková a predikátová logika - III ZS 2017/2018 1 / 16 2-SAT 2-SAT Výrok je v k-cnf, je-li v CNF a
Pojem algoritmus. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava
Pojem algoritmus doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 12. září 2016 Jiří Dvorský (VŠB TUO) Pojem algoritmus 54 / 344
Negativní informace. Petr Štěpánek. S použitím materiálu M.Gelfonda a V. Lifschitze. Logické programování 15 1
Negativní informace Petr Štěpánek S použitím materiálu M.Gelfonda a V. Lifschitze 2009 Logické programování 15 1 Negace jako neúspěch Motivace: Tvrzení p (atomická formule) neplatí, jestliže nelze odvodit
NP-úplnost problému SAT
Problém SAT je definován následovně: SAT(splnitelnost booleovských formulí) Vstup: Booleovská formule ϕ. Otázka: Je ϕ splnitelná? Příklad: Formule ϕ 1 =x 1 ( x 2 x 3 )jesplnitelná: např.přiohodnocení ν,kde[x
Maturitní témata. IKT, školní rok 2017/18. 1 Struktura osobního počítače. 2 Operační systém. 3 Uživatelský software.
Maturitní témata IKT, školní rok 2017/18 1 Struktura osobního počítače Von Neumannova architektura: zakreslete, vysvětlete její smysl a popište, jakým způsobem se od ní běžné počítače odchylují. Osobní
Algoritmy a algoritmizace
Otázka 21 Algoritmy a algoritmizace Počítačové programy (neboli software) umožňují počítačům, aby přestaly být pouhou stavebnicí elektronických a jiných součástek a staly se pomocníkem v mnoha lidských
Výroková a predikátová logika - II
Výroková a predikátová logika - II Petr Gregor KTIML MFF UK ZS 2015/2016 Petr Gregor (KTIML MFF UK) Výroková a predikátová logika - II ZS 2015/2016 1 / 18 Základní syntax Jazyk Výroková logika je logikou
Usuzování za neurčitosti
Usuzování za neurčitosti 25.11.2014 8-1 Usuzování za neurčitosti Hypotetické usuzování a zpětná indukce Míry postačitelnosti a nezbytnosti Kombinace důkazů Šíření pravděpodobnosti v inferenčních sítích
Naproti tomu gramatika je vlastně soupis pravidel, jak
1 Kapitola 1 Úvod V přednášce se zaměříme hlavně na konečný popis obecně nekonečných množin řetězců symbolů dané množiny A. Prvkům množiny A budeme říkat písmena, řetězcům (konečným posloupnostem) písmen
Booleovská algebra. Booleovské binární a unární funkce. Základní zákony.
Booleovská algebra. Booleovské binární a unární funkce. Základní zákony. Tomáš Bayer bayertom@natur.cuni.cz Katedra aplikované geoinformatiky a kartografie, Přírodovědecká fakulta UK. Tomáš Bayer bayertom@natur.cuni.cz
Příklad z učebnice matematiky pro základní školu:
Příklad z učebnice matematiky pro základní školu: Součet trojnásobku neznámého čísla zvětšeného o dva a dvojnásobku neznámého čísla zmenšeného o pět se rovná čtyřnásobku neznámého čísla zvětšeného o jedna.
Rozhodnutelné a nerozhodnutelné problémy. M. Kot, Z. Sawa (VŠB-TU Ostrava) Úvod do teoretické informatiky 24. dubna / 49
Rozhodnutelné a nerozhodnutelné problémy M. Kot, Z. Sawa (VŠB-TU Ostrava) Úvod do teoretické informatiky 24. dubna 2007 1/ 49 Co je to algoritmus? Algoritmus Algoritmus je mechanický postup skládající
Výroková a predikátová logika - XIII
Výroková a predikátová logika - XIII Petr Gregor KTIML MFF UK ZS 2013/2014 Petr Gregor (KTIML MFF UK) Výroková a predikátová logika - XIII ZS 2013/2014 1 / 13 Úvod Algoritmická (ne)rozhodnutelnost Které
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
10. Techniky formální verifikace a validace
Fakulta informačních technologií MI-NFA, zimní semestr 2011/2012 Jan Schmidt EVROPSKÝ SOCIÁLNÍ FOND PRAHA & EU: INVESTUJENE DO VAŠÍ BUDOUCNOSTI 10. Techniky formální verifikace a validace 1 Simulace není
Datové struktury 2: Rozptylovací tabulky
Datové struktury 2: Rozptylovací tabulky 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
Výroková a predikátová logika - II
Výroková a predikátová logika - II Petr Gregor KTIML MFF UK ZS 2013/2014 Petr Gregor (KTIML MFF UK) Výroková a predikátová logika - II ZS 2013/2014 1 / 20 Základní syntax Jazyk Výroková logika je logikou
1 Linearní prostory nad komplexními čísly
1 Linearní prostory nad komplexními čísly V této přednášce budeme hledat kořeny polynomů, které se dále budou moci vyskytovat jako složky vektorů nebo matic Vzhledem k tomu, že kořeny polynomu (i reálného)
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
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é
TGH12 - Problém za milion dolarů
TGH12 - Problém za milion dolarů Jan Březina Technical University of Liberec 7. května 2013 Složitost problému Co je to problém? Složitost problému Co je to problém? K daným vstupním datům (velkému binárnímu
Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti
Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti MI-SOC: 11 METODY VERIFIKACE SYSTÉMŮ NA ČIPU Hana Kubátov vá doc. Ing. Hana Kubátová, CSc. Katedra číslicového návrhu Fakulta 1 informačních
Úvod do informatiky. Miroslav Kolařík
Úvod do informatiky přednáška devátá Miroslav Kolařík Zpracováno dle učebního textu prof. Bělohlávka: Úvod do informatiky, KMI UPOL, Olomouc 2008 Obsah 1 Kombinatorika: princip inkluze a exkluze 2 Počítání
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
7. Rozdělení pravděpodobnosti ve statistice
7. Rozdělení pravděpodobnosti ve statistice Statistika nuda je, má však cenné údaje, neklesejte na mysli, ona nám to vyčíslí Jednou z úloh statistiky je odhad (výpočet) hodnot statistického znaku x i,
Třída PTIME a třída NPTIME. NP-úplnost.
VAS - Přednáška 9 Úvod ke kursu. Složitost algoritmu. Model RAM. Odhady složitosti. Metoda rozděl a panuj. Greedy algoritmy. Metoda dynamického programování. Problémy, třídy složitosti problémů, horní
Princip funkce počítače
Princip funkce počítače Princip funkce počítače prvotní úlohou počítačů bylo zrychlit provádění matematických výpočtů první počítače kopírovaly obvyklý postup manuálního provádění výpočtů pokyny pro zpracování
10. Složitost a výkon
Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 10 1 Základy algoritmizace 10. Složitost a výkon doc. Ing. Jiří Vokřínek, Ph.D. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Jiří
Základy algoritmizace
Algoritmus Toto je sice na první pohled pravdivá, ale při bližším prozkoumání nepřesná definice. Například některé matematické postupy by této definici vyhovovaly, ale nejsou algoritmy. Přesné znění definice
Pohled do nitra mikroprocesoru Josef Horálek
Pohled do nitra mikroprocesoru Josef Horálek Z čeho vycházíme = Vycházíme z Von Neumannovy architektury = Celý počítač se tak skládá z pěti koncepčních bloků: = Operační paměť = Programový řadič = Aritmeticko-logická
Program a životní cyklus programu
Program a životní cyklus programu Program algoritmus zapsaný formálně, srozumitelně pro počítač program se skládá z elementárních kroků Elementární kroky mohou být: instrukce operačního kódu počítače příkazy
Architektury počítačů a procesorů
Kapitola 3 Architektury počítačů a procesorů 3.1 Von Neumannova (a harvardská) architektura Von Neumann 1. počítač se skládá z funkčních jednotek - paměť, řadič, aritmetická jednotka, vstupní a výstupní
Matematická logika. Lekce 1: Motivace a seznámení s klasickou výrokovou logikou. Petr Cintula. Ústav informatiky Akademie věd České republiky
Matematická logika Lekce 1: Motivace a seznámení s klasickou výrokovou logikou Petr Cintula Ústav informatiky Akademie věd České republiky www.cs.cas.cz/cintula/mal Petr Cintula (ÚI AV ČR) Matematická
Třídy složitosti P a NP, NP-úplnost
Třídy složitosti P a NP, NP-úplnost Cíle přednášky: 1. Definovat, za jakých okolností můžeme problém považovat za efektivně algoritmicky řešitelný. 2. Charakterizovat určitou skupinu úloh, pro které není
5. Umělé neuronové sítě. Neuronové sítě
Neuronové sítě Přesný algoritmus práce přírodních neuronových systémů není doposud znám. Přesto experimentální výsledky na modelech těchto systémů dávají dnes velmi slibné výsledky. Tyto systémy, včetně
Úvod do informatiky. Miroslav Kolařík
Úvod do informatiky přednáška první Miroslav Kolařík Zpracováno dle učebního textu prof. Bělohlávka: Úvod do informatiky, KMI UPOL, Olomouc 2008. Obsah 1 Co a k čemu je logika? 2 Výroky a logické spojky
Matematika B101MA1, B101MA2
Matematika B101MA1, B101MA2 Zařazení předmětu: povinný předmět 1.ročníku bc studia 2 semestry Rozsah předmětu: prezenční studium 2 + 2 kombinované studium 16 + 0 / semestr Zakončení předmětu: ZS zápočet
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
1. Matematická logika
Moderní technologie ve studiu aplikované fyziky CZ.1.07/2.2.00/07.0018 1. Matematická logika Základem každé vědy (tedy i matematiky i fyziky) je soubor jistých znalostí. To, co z těchto izolovaných poznatků
Algoritmus. Cílem kapitoly je seznámit žáky se základy algoritmu, s jeho tvorbou a způsoby zápisu.
Algoritmus Cílem kapitoly je seznámit žáky se základy algoritmu, s jeho tvorbou a způsoby zápisu. Klíčové pojmy: Algoritmus, vlastnosti algoritmu, tvorba algoritmu, vývojový diagram, strukturogram Algoritmus
3. Třídy P a NP. Model výpočtu: Turingův stroj Rozhodovací problémy: třídy P a NP Optimalizační problémy: třídy PO a NPO MI-PAA
Jan Schmidt 2011 Katedra číslicového návrhu Fakulta informačních technologií České vysoké učení technické v Praze Zimní semestr 2011/12 MI-PAA EVROPSKÝ SOCIÁLNÍ FOND PRAHA & EU: INVESTUJENE DO VAŠÍ BUDOUCNOSTI
Paralelní programování
Paralelní programování přednášky Jan Outrata únor duben 2011 Jan Outrata (KI UP) Paralelní programování únor duben 2011 1 / 14 Atomické akce dále nedělitelná = neproložitelná jiným procesem izolovaná =
Formální jazyky a gramatiky Teorie programovacích jazyků
Formální jazyky a gramatiky Teorie programovacích jazyků doc. Ing. Jiří Rybička, Dr. ústav informatiky PEF MENDELU v Brně rybicka@mendelu.cz Připomenutí základních pojmů ABECEDA jazyk je libovolná podmnožina
Inženýrská statistika pak představuje soubor postupů a aplikací teoretických principů v oblasti inženýrské činnosti.
Přednáška č. 1 Úvod do statistiky a počtu pravděpodobnosti Statistika Statistika je věda a postup jak rozvíjet lidské znalosti použitím empirických dat. Je založena na matematické statistice, která je
Algoritmizace. Obrázek 1: Přeložení programu překladačem
Algoritmizace V každém okamžiku ví procesor počítače přesně, co má vykonat. Pojmem procesor se v souvislosti s algoritmy označuje objekt (např. stroj i člověk), který vykonává činnost popisovanou algoritmem.
Regulární výrazy. Definice Množina regulárních výrazů nad abecedou Σ, označovaná RE(Σ), je definována induktivně takto:
IB102 Automaty, gramatiky a složitost, 6. 10. 2014 1/29 Regulární výrazy Definice 2.58. Množina regulárních výrazů nad abecedou Σ, označovaná RE(Σ), je definována induktivně takto: 1 ε, a a pro každé a
Dynamické programování
Dynamické programování 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 (BI-EFA)
Architektura počítačů
Architektura počítačů Studijní materiál pro předmět Architektury počítačů Ing. Petr Olivka katedra informatiky FEI VŠB-TU Ostrava email: petr.olivka@vsb.cz Ostrava, 2010 1 1 Architektura počítačů Pojem
Automatická detekce anomálií při geofyzikálním průzkumu. Lenka Kosková Třísková NTI TUL Doktorandský seminář, 8. 6. 2011
Automatická detekce anomálií při geofyzikálním průzkumu Lenka Kosková Třísková NTI TUL Doktorandský seminář, 8. 6. 2011 Cíle doktorandské práce Seminář 10. 11. 2010 Najít, implementovat, ověřit a do praxe
Matematická analýza pro informatiky I. Limita posloupnosti (I)
Matematická analýza pro informatiky I. 3. přednáška Limita posloupnosti (I) Jan Tomeček tomecek@inf.upol.cz http://aix-slx.upol.cz/ tomecek/index Univerzita Palackého v Olomouci 25. února 2011 tomecek@inf.upol.cz
Přehled paralelních architektur. Dělení paralelních architektur Flynnova taxonomie Komunikační modely paralelních architektur
Přehled paralelních architektur Přehled paralelních architektur Dělení paralelních architektur Flynnova taxonomie Komunikační modely paralelních architektur Přehled I. paralelní počítače se konstruují
VÝUKOVÝ MATERIÁL. Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632 Číslo projektu
VÝUKOVÝ MATERIÁL Identifikační údaje školy Vyšší odborná škola a Střední škola, Varnsdorf, příspěvková organizace Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632
1 Nejkratší cesta grafem
Bakalářské zkoušky (příklady otázek) podzim 2014 1 Nejkratší cesta grafem 1. Uvažujte graf s kladným ohodnocením hran (délka). Definujte formálně problém hledání nejkratší cesty mezi dvěma uzly tohoto
Základy algoritmizace, návrh algoritmu
Základy algoritmizace, návrh algoritmu Algoritmus Předpoklady automatického výpočtu: předem stanovit (rozmyslet) přesný postup během opakovaného provádění postupu již nepřemýšlet a postupovat mechanicky
Seminář z IVT Algoritmizace. Slovanské gymnázium Olomouc Tomáš Kühr
Seminář z IVT Algoritmizace Slovanské gymnázium Olomouc Tomáš Kühr Algoritmizace - o čem to je? Zatím jsme se zabývali především tím, jak určitý postup zapsat v konkrétním programovacím jazyce (např. C#)
Formální systém výrokové logiky
Formální systém výrokové logiky 1.Jazyk výrokové logiky Nechť P = {p,q,r, } je neprázdná množina symbolů, které nazýváme prvotní formule. Symboly jazyka L P výrokové logiky jsou : a) prvky množiny P, b)
ČVUT FEL X36PAA - Problémy a algoritmy. 4. úloha - Experimentální hodnocení algoritmů pro řešení problému batohu
ČVUT FEL X36PAA - Problémy a algoritmy 4. úloha - Experimentální hodnocení algoritmů pro řešení problému batohu Jméno: Marek Handl Datum: 3. 2. 29 Cvičení: Pondělí 9: Zadání Prozkoumejte citlivost metod
Principy indukce a rekursivní algoritmy
Principy indukce a rekursivní algoritmy Jiří Velebil: A7B01MCS 19. září 2011: Indukce 1/20 Příklad Místností rozměru n budeme rozumět šachovnici rozměru 2 n 2 n, ze které je jedno (libovolné) pole vyjmuto.
Výroková a predikátová logika - XII
Výroková a predikátová logika - XII Petr Gregor KTIML MFF UK ZS 2015/2016 Petr Gregor (KTIML MFF UK) Výroková a predikátová logika - XII ZS 2015/2016 1 / 15 Algebraické teorie Základní algebraické teorie
Matematická logika. Miroslav Kolařík
Matematická logika přednáška první Miroslav Kolařík Zpracováno dle textu R. Bělohlávka: Matematická logika poznámky k přednáškám, 2004. a dle učebního textu R. Bělohlávka a V. Vychodila: Diskrétní matematika
Logika 5. Základní zadání k sérii otázek: V uvedených tezích doplňte z nabízených adekvátní pojem, termín, slovo. Otázka číslo: 1. Logika je věda o...
Logika 5 Základní zadání k sérii otázek: V uvedených tezích doplňte z nabízených adekvátní pojem, termín, slovo. Otázka číslo: 1 Logika je věda o.... slovech správném myšlení myšlení Otázka číslo: 2 Základy
1. Matematická logika
MATEMATICKÝ JAZYK Jazyk slouží člověku k vyjádření soudů a myšlenek. Jeho psaná forma má tvar vět. Každá vědní disciplína si vytváří svůj specifický jazyk v úzké návaznosti na jazyk živý. I matematika
Úvod do logiky. (FLÚ AV ČR) Logika: CZ.1.07/2.2.00/ / 23
Úvod do logiky (FLÚ AV ČR) Logika: CZ.1.07/2.2.00/28.0216 2013 1 / 23 Co je logika? Čeho se týkají logické zákony? Tři možnosti: (1) světa (2) myšlení (3) jazyka (FLÚ AV ČR) Logika: CZ.1.07/2.2.00/28.0216
Matematická analýza pro informatiky I. Limita funkce
Matematická analýza pro informatiky I. 5. přednáška Limita funkce Jan Tomeček tomecek@inf.upol.cz http://aix-slx.upol.cz/ tomecek/index Univerzita Palackého v Olomouci 18. března 2011 Jan Tomeček, tomecek@inf.upol.cz
Zpráva o průběhu přijímacího řízení na vysokých školách dle Vyhlášky MŠMT č. 343/2002 a její změně 276/2004 Sb.
Zpráva o průběhu přijímacího řízení na vysokých školách dle Vyhlášky MŠMT č. 343/2002 a její změně 276/2004 Sb. 1. Informace o přijímacích zkouškách Studijní program: Informatika navazující magisterský
zejména Dijkstrův algoritmus pro hledání minimální cesty a hladový algoritmus pro hledání minimální kostry.
Kapitola Ohodnocené grafy V praktických aplikacích teorie grafů zpravidla graf slouží jako nástroj k popisu nějaké struktury. Jednotlivé prvky této struktury mají často přiřazeny nějaké hodnoty (může jít
Třída PTIME a třída NPTIME. NP-úplnost.
VAS - Přednáška 9 Úvod ke kursu. Složitost algoritmu. Model RAM. Odhady složitosti. Metoda rozděl a panuj. Greedy algoritmy. Metoda dynamického programování. Problémy, třídy složitosti problémů, horní
i=1 Přímka a úsečka. Body, které leží na přímce procházející body a a b můžeme zapsat pomocí parametrické rovnice
I. Funkce dvou a více reálných proměnných 1. Úvod Značení: V textu budeme používat označení: N pro množinu všech přirozených čísel; R pro množinu všech reálných čísel; R n pro množinu všech uspořádaných
Algoritmizace- úvod. Ing. Tomáš Otáhal
Algoritmizace- úvod Ing. Tomáš táhal Historie 9. století perský matematik a astronom Mohammed Al-Chorezím v latinském přepise příjmení= algoritmus Nejstarší algoritmus Euklides řecký matematik, 4. století
Úloha - rozpoznávání číslic
Úloha - rozpoznávání číslic Vojtěch Franc, Tomáš Pajdla a Tomáš Svoboda http://cmp.felk.cvut.cz 27. listopadu 26 Abstrakt Podpůrný text pro cvičení předmětu X33KUI. Vysvětluje tři způsoby rozpoznávání
Týden 14. Přednáška. Teoretická informatika průběh výuky v semestru 1. PSPACE, NPSPACE, PSPACE-úplnost
Teoretická informatika průběh výuky v semestru 1 Týden 14 Přednáška PSPACE, NPSPACE, PSPACE-úplnost Uvědomili jsme si nejprve, že např. pro zjištění toho, zda Bílý má nějakou strategii ve hře ŠACHY, která
Tabulkový procesor. Základní rysy
Tabulkový procesor Tabulkový procesor je počítačový program zpracovávající data uložená v buňkách tabulky. Program umožňuje použití vzorců pro práci s daty a zobrazuje výsledné hodnoty podle vstupních
NPRG030 Programování I 3/2 Z --- NPRG031 Programování II --- 2/2 Z, Zk
NPRG030 Programování I 3/2 Z --- NPRG031 Programování II --- 2/2 Z, Zk Pavel Töpfer Katedra softwaru a výuky informatiky MFF UK MFF Malostranské nám., 4. patro, pracovna 404 pavel.topfer@mff.cuni.cz http://ksvi.mff.cuni.cz/~topfer
Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.
Vyhledávání doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 12. září 2016 Jiří Dvorský (VŠB TUO) Vyhledávání 201 / 344 Osnova přednášky
VYUŽITÍ PRAVDĚPODOBNOSTNÍ METODY MONTE CARLO V SOUDNÍM INŽENÝRSTVÍ
VYUŽITÍ PRAVDĚPODOBNOSTNÍ METODY MONTE CARLO V SOUDNÍM INŽENÝRSTVÍ Michal Kořenář 1 Abstrakt Rozvoj výpočetní techniky v poslední době umožnil také rozvoj výpočetních metod, které nejsou založeny na bázi
Algoritmizace. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010
Jiří Vyskočil, Marko Genyg-Berezovskyj 2010 Úvod stránky předmětu: https://cw.felk.cvut.cz/doku.php/courses/a4b33alg/start cíle předmětu Cílem je schopnost samostatné implementace různých variant základních
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?
Výukový materiál Hardware je zaměřený především na výuku principů práce hardwaru a dále uvádí konkrétní příklady použití.
Metodický list hardware Výukový materiál Hardware je zaměřený především na výuku principů práce hardwaru a dále uvádí konkrétní příklady použití. Postupuje od výčtu základních prvků, bez kterých se PC
Týden 11. Přednáška. Teoretická informatika průběh výuky v semestru 1. Nejprve jsme dokončili témata zapsaná u minulé přednášky.
Teoretická informatika průběh výuky v semestru 1 Týden 11 Přednáška Nejprve jsme dokončili témata zapsaná u minulé přednášky. PSPACE, NPSPACE, PSPACE-úplnost Uvědomilijsmesi,ženapř.prozjištěnítoho,zdaBílýmánějakoustrategiivehřeŠACHY,
Definice 7.2. Nejmenší přirozené číslo k, pro které je graf G k-obarvitelný, se nazývá chromatické číslo (barevnost) grafu G a značí se χ(g).
7 Barevnost grafu Definice 71 Graf G se nazývá k-obarvitelný, jestliže každému jeho uzlu lze přiřadit jednu z barev 1 k tak, že žádné dva sousední uzly nemají stejnou barvu Definice 72 Nejmenší přirozené
Od Turingových strojů k P=NP
Složitost Od Turingových strojů k P=NP Zbyněk Konečný Zimnění 2011 12. 16.2.2011 Kondr (Než vám klesnou víčka 2011) Složitost 12. 16.2.2011 1 / 24 O čem to dnes bude? 1 Co to je složitost 2 Výpočetní modely
4. Úvod do paralelismu, metody paralelizace
4. Úvod do paralelismu, metody paralelizace algoritmů Ing. Michal Bližňák, Ph.D. Ústav informatiky a umělé inteligence Fakulta aplikované informatiky UTB Zĺın Paralelní procesy a programování, Zĺın, 26.
8.3). S ohledem na jednoduchost a názornost je výhodné seznámit se s touto Základní pojmy a vztahy. Definice
9. Lineární diferenciální rovnice 2. řádu Cíle Diferenciální rovnice, v nichž hledaná funkce vystupuje ve druhé či vyšší derivaci, nazýváme diferenciálními rovnicemi druhého a vyššího řádu. Analogicky
Teoretická informatika průběh výuky v semestru 1
Teoretická informatika průběh výuky v semestru 1 Týden 7 Přednáška (Výpočetní) problémy, rozhodovací(ano/ne) problémy,... Připomněli jsme si obecné definice a konkrétní problémy, jako např. SAT[problém
Výroková logika. Teoretická informatika Tomáš Foltýnek
Výroková logika Teoretická informatika Tomáš Foltýnek foltynek@pef.mendelu.cz Teoretická informatika strana 2 Opakování z minulé přednášky Co je to formalismus a co je jeho cílem? Formulujte Russelův paradox
Vlastnosti regulárních jazyků
Vlastnosti regulárních jazyků Podobně jako u dalších tříd jazyků budeme nyní zkoumat následující vlastnosti regulárních jazyků: vlastnosti strukturální, vlastnosti uzávěrové a rozhodnutelné problémy pro
Lekce 01 Úvod do algoritmizace
Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů Lekce 01 Úvod do algoritmizace Tento projekt CZ.1.07/1.3.12/04.0006 je spolufinancován Evropským sociálním
Výroková a predikátová logika - III
Výroková a predikátová logika - III Petr Gregor KTIML MFF UK ZS 2014/2015 Petr Gregor (KTIML MFF UK) Výroková a predikátová logika - III ZS 2014/2015 1 / 21 Výroková logika Horn-SAT Horn-SAT Jednotková
Data v počítači. Informační data. Logické hodnoty. Znakové hodnoty
Data v počítači Informační data (elementární datové typy) Logické hodnoty Znaky Čísla v pevné řádové čárce (celá čísla) v pohyblivé (plovoucí) řád. čárce (reálná čísla) Povelová data (instrukce programu)
Reálná čísla a výrazy. Početní operace s reálnými čísly. Složitější úlohy se závorkami. Slovní úlohy. Číselné výrazy. Výrazy a mnohočleny
A B C D E F 1 Vzdělávací oblast: Matematika a její aplikace 2 Vzdělávací obor: Cvičení z matematiky 3 Ročník: 9. 4 Klíčové kompetence (Dílčí kompetence) 5 Kompetence k učení učí se vybírat a využívat vhodné
Složitost. Teoretická informatika Tomáš Foltýnek
Složitost Teoretická informatika Tomáš Foltýnek foltynek@pef.mendelu.cz Teoretická informatika 2 Opakování z minulé přednášky Co říká Churchova teze? Jak lze kódovat Turingův stroj? Co je to Univerzální
Ludwig WITTGENSTEIN: Tractatus Logico-Philosophicus, 1922 Překlad: Jiří Fiala, Praha: Svoboda, 1993
Ludwig WITTGENSTEIN: Tractatus Logico-Philosophicus, 1922 Překlad: Jiří Fiala, Praha: Svoboda, 1993 l Svět je všechno, co fakticky je. 1.l Svět je celkem faktů a nikoli věcí. l.2 Svět se rozpadá na fakty.
Složitost a moderní kryptografie
Složitost a moderní kryptografie Radek Pelánek Modulární systém dalšího vzdělávání pedagogických pracovníků JmK v přírodních vědách a informatice CZ.1.07/1.3.10/02.0024 Složitost a moderní kryptografie
Modely Herbrandovské interpretace
Modely Herbrandovské interpretace Petr Štěpánek S využitím materialu Krysztofa R. Apta 2006 Logické programování 8 1 Uvedli jsme termové interpretace a termové modely pro logické programy a také nejmenší