1. Èasová a pamì»ová slo¾itost
|
|
- Antonie Pospíšilová
- před 9 lety
- Počet zobrazení:
Transkript
1 1. Èasová a pamì»ová slo¾itost Cílem každého programátora je bezesporu navrhovat co nejlepší algoritmy. Navrhnout dobrý algoritmus dá však často značnou práci; nabízí se totiž otázka, jak vůbec poznáme, zda určitý algoritmus je kvalitní. Když máme dva algoritmy řešící stejnou úlohu, jak rozhodneme, který z nich je lepší? A co vlastně znamenají pojmy lepší a horší? Kritérií kvality může být mnoho. Například můžeme za lepší algoritmus považovat ten, který nás napadne jako první, nebo ten, jehož naprogramování nám dá méně práce. Obvykle však posuzujeme algoritmy na základě vlastností výsledného programu. Budou nás zajímat časové a paměťové nároky programu, tzn. rychlost výpočtu a velikost potřebné operační paměti počítače. Jako první srovnávací metoda nás nejspíš napadne srovnávané algoritmy naprogramovat v nějakém programovacím jazyce, spustit je na větší množině testovacích dat a měřit se stopkami v ruce (nebo alespoň s těmi zabudovanými do operačního systému), který z nich je lepší. Takový postup se skutečně v praxi používá, z teoretického hlediska je však nevhodný. Když bychom chtěli v literatuře popsat vlastnosti určitého algoritmu, asi jen stěží napíšeme na mém stroji doběhl do hodiny. A jak bude fungovat na jiném stroji, s odlišnou architekturou, naprogramovaný v jiném jazyce, pod jiným operačním systémem, pro jinou sadu vstupních dat? V této kapitole vybudujeme a vysvětlíme míru doby běhu algoritmu a jeho paměťových nároků, která bude nezávislá na technických podrobnostech stroje, jazyka a operačního systému, na němž bychom jinak algoritmus museli analyzovat. Těmto mírám budeme říkat časová složitost pro měření rychlosti algoritmu, a analogicky paměťová složitost pro měření paměťových nároků Jak fungují poèítaèe uvnitø Definice pojmu počítač není samozřejmá. V současnosti i v historii bychom jistě našli spoustu strojů, kterým by se tak dalo říkat. My se přidržíme všeobecně uznávané definice, kterou v roce 1946 vyslovil vynikající matematik John von Neumann. Ta obsahuje následující body: Stroj má 5 funkčních jednotek: řídící jednotka (řadič) koordinuje činnost ostatních jednotek aritmeticko-logická jednotka provádí numerické výpočty, vyhodnocuje podmínky,... operační paměť uchovává číselně kódovaná data a program 1 1 Zde stojí za zdůraznění fakt, že data i program jsou ve stejné operační pamě
2 vstupní zařízení zařízení, odkud se do počítače dostávají data k zpracování výstupní zařízení do tohoto zařízení zapisuje počítač výsledky své činnosti Struktura je nezávislá na zpracovávaných problémech, na řešení problému se musí zvenčí zavést návod na zpracování (program) a musí se uložit do paměti; bez tohoto programu není stroj schopen práce. Programy, data, mezivýsledky a konečné výsledky se ukládají do téže paměti. Paměť je rozdělená na stejně velké buňky, které jsou průběžně očíslované; přes číslo buňky (adresu) se dá přečíst nebo změnit obsah buňky. Po sobě jdoucí instrukce programu se uloží do paměťových buněk jdoucích po sobě, přístup k následující instrukci se uskuteční z řídící jednotky zvýšením instrukční adresy o 1. Instrukcemi skoku se dá odklonit od zpracování instrukcí v uloženém pořadí. Existují následující typy instrukcí: aritmetické instrukce (sčítání, násobení, ukládání konstant,... ) logické instrukce (porovnání, not, and, or,... ) instrukce přenosu (z paměti do řídící jednotky a opačně, na vstup a výstup) podmíněné a nepodmíněné skoky ostatní (čekání, zastavení,... ) Všechna data (instrukce, adresy,... ) jsou číselně kódovaná, správné dekódování zabezpečují vhodné logické obvody v řídící jednotce. Přesné specifikaci počítače, tedy způsobu vzájemného propojení jednotek, jejich komunikace a programování, popisu instrukční sady, říkáme architektura. Nezabíhejme do detailů fungování běžných osobních počítačů, čili popisu jejich architektury. V každém z nich se však jednotky chovají tak, jak popsal von Neumann. Z našeho hlediska bude nejdůležitější podívat se co se děje, pokud na počítači vytvoříme a spustíme program. Algoritmus zapíšeme obvykle ve formě vyššího programovacího jazyka. Zde je příklad v jazyce C. #include <stdio.h> ti. Počítač tak vlastně pojem data a program nerozlišuje, povoluje tedy třeba program měnit pod rukou a podobně. Existují však i jiné architektury, například tzv. harvardská, které program a data důsledně oddělují
3 vstupní zařízení operační paměť výstupní zařízení aritmetická jednotka řadič Schéma von Neumannova počítače int main(void) { static char s[] = "Hello world\n"; int i, n = sizeof(s); for (i = 0; i < n; i++) putchar(s[i]); return 0; } Aby řídící jednotka mohla program provést, musí místo předchozího programu dostat posloupnost jednoduchých instrukcí, které jsou číselně kódovány. K tomu (a mnoha dalším věcem) slouží proces překladu (kompilace) zdrojového programu do strojového kódu. Následujícími příkazy v operačním systému Linux jsme spustili překladač jazyka C, přeložili vzorový program do strojového kódu a spustili ho. $ gcc hello.c -o hello $./hello Hello world $ Přeskočíme-li všechny podrobnosti překládání programu, konečným produktem překladu je obvykle spustitelný program, to jest posloupnost strojových instrukcí pro daný stroj. Narozdíl od našeho příkladu zapsaném v jazyce C, který na všech počítačích s překladačem jazyka C bude vypadat stejně, strojový kód se bude lišit architekturu od architektury, operační systém od operačního systému, dokonce překladač od překladače. Ukážeme příklad úseku strojového kódu, který vznikl po překladu našeho příkladu v operačním systému Linux na architektuře Intel x86. Aby se lidem jednotlivé
4 instrukce lépe četly, mají přiřazeny své symbolické názvy. Tomuto jazyku symbolických instrukcí se říká assembler. Kromě symbolických názvů instrukcí dovoluje assembler ještě pro pohodlí pojmenovat adresy a několik dalších užitečných věcí. main: leal 4(%esp), %ecx andl $-16, %esp pushl -4(%ecx) pushl %ebp movl %esp, %ebp pushl %ecx subl $20, %esp movl $13, -8(%ebp) movl $0, -12(%ebp) jmp L2 L3: movl -12(%ebp), %eax movzbl L1(%eax), %eax movsbl %al,%eax movl %eax, (%esp) call putchar addl $1, -12(%ebp) L2: movl -12(%ebp), %eax cmpl -8(%ebp), %eax jl L3 movl $0, %eax addl $20, %esp popl %ecx popl %ebp leal -4(%ecx), %esp ret L1:.string "Hello world\n" A pro zajímavost ještě na architektuře PPC64: main: stwu 1,-32(1) mflr 0 stw 31,28(1) stw 0,36(1) mr 31,1 li 0,13 stw 0,12(31) li 0,0 stw 0,8(31) L2: lwz 0,8(31) lwz 9,12(31) cmpw 7,0,9 blt 7,L
5 b L3 L5: lis la lwz 0,8(31) add 9,9,0 lbz 0,0(9) rlwinm 0,0,0,0xff mr 3,0 bl putchar lwz 9,8(31) addi 0,9,1 stw 0,8(31) b L2 L3: li 0,0 mr 3,0 lwz 11,0(1) lwz 0,4(11) mtlr 0 lwz 31,-4(11) mr 1,11 blr s0:.string "Hello world\n" Každá instrukce je zapsána posloupností několika bytů. Věříme, že čtenář si dokáže představit přechozí kód zapsaný v číslech a ukázku vynecháme. Programátor píšící programy v assembleru musí být perfektně seznámen s instrukční sadou procesoru, vlastnostmi architektury, technickými detaily služeb operačního systému a mnoha dalšími věcmi Rychlost konkrétního výpoètu Dejme tomu, že chceme změřit dobu běhu našeho příkladu Hello world z předchozího oddílu. Začneme nejjednodušší metodou se stopkami v ruce. Jak přesné stopky a rychlé ruce bychom na to museli mít nyní ponechme stranou. Spustíme-li na operačním systému program několikrát, nejspíš pokaždé naměříme o něco rozdílné časy. Může za to aktivita ostatních procesů, stav operačního systému, obsahy nejrůznějších vyrovnávacích pamětí a desítky dalších věcí. A to ještě ukázkový program nečte žádná vstupní data. Co kdyby se doba jeho běhu odvíjela podle nich? 2 Z vlastní zkušenosti můžeme jako assembler doporučit GNU Assembler, který je dobře zdokumentován. Detaily jednotlivých instrukcí, fungování procesoru a pomocných systémů je třeba hledat v dokumentaci výrobce, která bývá k dispozici na jeho webových stránkách
6 Takový přístup se tedy hodí pouze pro testování kvality konkrétního programu na konkrétním hardware a konfiguraci. Nezatracujeme ho, velmi často se používá pro testování programů určených k nasazení v těch nejvypjatějších situacích. Ale naším cílem v této kapitole je vyvinout prostředek na měření doby běhu obecně popsaného algoritmu, bez nutnosti naprogramování v konkrétním programovacím jazyce a architektuře. Navíc zohledňující závislost na množství vstupních dat. Dejme se tedy do postupné tvorby takové metody. Zapomeňme odteď na detaily překladu programu do strojového kódu, zapomeňme dokonce na detaily nějakého konkrétního programovacího jazyka. Algoritmy začneme popisovat pseudokódem. To znamená, že nebudeme v programech zabíhat do technických detailů konkrétních jazyků či architektury, nicméně s jejich znalostí bude už potom snadné pseudokód do programovacího jazyka přepsat. Operace budeme popisovat slovně, případně matematickou symbolikou. Nyní spočítáme celkový počet provedených tzv. elementárních operací. Tímto pojmem rozumíme především operace sčítání, odčítání, násobení, porovnávání; také základní řídící konstrukce, jako jsou třeba skoky a podmíněné skoky. Zkrátka to, co normální procesor zvládne jednou nebo nejvýše několika instrukcemi. Elementární operací rozhodně není například přesun paměťového bloku z místa na místo, byť vypadá zapsaný jediným příkazem, nebo třeba většina operací s textovými řetězci. Čas vykonání jedné elementární operace prohlásíme za jednotkový a zbavíme se tak jakýchkoli jednotek ve výsledné době běhu algoritmu. V zásadě je za elementární operace možné zvolit libovolnou rozumnou sadu doba provádění programu se tak změní nejvýše konstanta-krát, na čemž, jak za chvíli uvidíme, zase tolik nezáleží. Pozorný čtenář se nyní jistě zeptá, jak počítat počet provedených operací u algoritmu, jehož doba běhu závisí na vstupu a může probíhat mnoha různými větvemi. V takovém případě vždy vezmeme maximální možný počet provedených operací. Tento počet navíc vyjádříme vzhledem k vstupu, nejčastěji vzhledem k jeho velikosti. Jednoduché výpočty časových nároků programu Než pokročíme dále, zkusme určit počet provedených operací u jednoduchých algoritmů. Konkrétně, budeme nejdříve místo počtu operací počítat počet vypsaných hvězdiček. Ze vstupu všechny algoritmy nejprve na úvod přečtou přirozené číslo N. Čtenář nechť zkusí nejdříve u každého algoritmu počet hvězdiček spočítat sám a teprve potom se podívat na náš výpočet. Algoritmus Hvězdičky 1 Vstup: číslo N 1. Pro i od 1 do N opakuj: 2. Pro j od 1 do N opakuj: 3. Tiskni * V algoritmu 1 vidíme, že vnější cyklus se provede N-krát, vnořený cyklus také N-krát, dohromady tedy N 2 vytištěných hvězdiček
7 Algoritmus Hvězdičky 2 Vstup: číslo N 1. Pro i od 1 do N opakuj: 2. Pro j od 1 do i opakuj: 3. Tiskni * Rozepišme, kolikrát se provede vnitřní cyklus v závislosti na i. Pro i = 1 se provede jedenkrát, pro i = 2 dvakrát, a tak dále, až pro i = N se provede N-krát. Dohromady se vytiskne N hvězdiček, což například pomocí vzorce na součet aritmetické posloupnosti sečteme na N(N + 1)/2. Algoritmus Hvězdičky 3 Vstup: číslo N 1. Dokud N 1, opakuj: 2. Tiskni * 3. N N/2 V každé iteraci cyklu se N sníží na polovinu. Provedeme-li cyklus k-krát, sníží se hodnota N na N/2 k, neboli klesá exponenciálně rychle v závislosti na počtu iterací cyklu. Chceme-li určit počet iterací, vyřešíme rovnici N/2 k = 1 pro neznámou k. Výsledkem je tedy zhruba dvojkový logaritmus N. Čtenáře odkážeme na cvičení??, aby výsledek určil přesně. Algoritmus Hvězdičky 4 Vstup: číslo N 1. Dokud je N > 0, opakuj: 2. Je-li N liché: 3. Pro i od 1 do N opakuj: 4. Tiskni * 5. N N/2 Zde se již situace začíná komplikovat. V každé iteraci vnějšího cyklu se N sníží na polovinu a vnořený cyklus se provede pouze tehdy, bylo-li předtím N liché. To, kolikrát se vnořený cyklus provede, tedy nepůjde úplně snadno vyjádřit pouze z velikosti čísla N. V souladu s našimi pravidly tedy počítejme nejdelší možný průběh algoritmu, kdy test na lichost N pokaždé uspěje. Tehdy se vytiskne h = N + N/2 + N/ N/2 k hvězdiček. Protože není na první pohled vidět, kolik h přepsané do jednoduchého vzorce vyjde, spokojíme se alespoň s horním odhadem na h. Označme symbolem s počet členů v součtu h. Hodnotu h shora odhadneme jako h = s i=0 N 2 i i=0 N 2 i = N přidáním dalších členů do řady až do nekonečna. Jak víme z matematické analýzy, řada k = i=0 1/2i konverguje, tj. nasčítá se na pevné konečné číslo. Dostáváme, že i=0 1 2 i
8 počet vytištěných hvězdiček nebude vyšší, než kn, kde k je pevná konstanta nijak nezávisející na N. Číslo k lze spočítat i přesně, viz cvičení Protože se v této kapitole snažíme vybudovat míru doby běhu algoritmu a nikoli počtu vytištěných hvězdiček, ukážeme u našich příkladů, že z počtu vytištěných hvězdiček vyplývá i řádový počet všech provedených operací. V algoritmu 1 na vytištění jedné hvězdičky provedeme maximálně dvě operace: změnu proměnné j a možná ještě změnu proměnné i. V algoritmech 2 a 3 je to velmi podobně na vytištění jedné hvězdičky potřebujeme maximálně dvě další operace. Algoritmus 4 v případě, že všechny testy lichosti uspějí, pro tisk hvězdičky provede změnu proměnné i, maximálně jeden test lichosti, maximálně jednu aritmetickou operaci s N a podmíněný skok. Co však je-li někdy v průběhu N sudé? Co když test na lichost uspěje pouze jednou nebo dokonce vůbec? (K rozmyšlení: kdy se to může stát?) Může se tedy přihodit, že se vytiskne jen velmi málo hvězdiček (třeba jedna) a algoritmus přesto vykoná velké množství operací. V tomto algoritmu tedy počet operací s počtem hvězdiček nekoresponduje. Čtenáře odkážeme na cvičení??, aby zjistil přesně, na čem počet vytištěných hvězdiček závisí. Pojďme shrnout počty vykonaných kroků (nebo alespoň jejich horní odhady) našich čtyř algoritmů: 2N 2, 2N(N + 1)/2, což je po úpravě N 2 + N, 2 log 2 N a kn. Podíváme se na chování algoritmu pro gigantická N, řekněme v řádu bilionů. Nejprve si všimněme, že algoritmus 3 bude nejrychlejší ze všech. I pro N řádově bilion se vykoná pouze několik málo kroků. Algoritmus 4 vykoná kroků maximálně bilion krát pevná konstanta k. Úplně nejpomalejší budou algoritmy 1 a 2, neporovnatelně více než algoritmy 3 a 4. Jak to, že jsme schopni předpovědět rychlost algoritmů, aniž bychom je spustili? To je právě smyslem určování časové složitosti. Vyjádřili jsme počet kroků matematickou funkcí (a když jsme to nesvedli, tak jsme ji aspoň co nejlépe odhadli) a na základě ní jsme schopni řádově předpovídat vlastnosti algoritmu. Další postřeh se bude týkat algoritmů 1 a 2. Pro, řekněme, N = vykoná první algoritmus hvězdiček a druhý algoritmus zhruba kroků, což je skoro tolik co první algoritmus, tedy alespoň řádově. Když se zadíváme na vzorce s počty kroků, v obou figurují členy N 2. Tato funkce roste dominantně vzhledem k ostatním členům a pro obrovská N bude v podstatě jediná důležitá, pomaleji rostoucí členy se ztratí. Stejný osud potká multiplikativní konstanty, v případě algoritmu 1 konstantu 2. Multiplikativní konstanta není důležitá, protože různé počítače jsou různě rychlé. Řádový počet operací již však zanedbatelný není. Cvičení: 1. Určete počet vytištěných hvězdiček u algoritmu 3 naprosto přesně, jednoduchým vzorcem. 2. Na čem u algoritmu 4 závisí počet vytištěných hvězdiček?
9 3. Dokažte, že i=0 1 2 i = Zavedení èasové a pamì»ové slo¾itosti Časová složitost Zanechme nadále ilustračních příkladů tisknoucích hvězdičky a počítejme u algoritmů množství provedených elementárních operací. Vyzbrojeni těmito poznatky, popíšeme kuchařku, jak určit řádově dobu běhu algoritmu, kterou už můžeme nazývat časovou složitostí. Tomuto způsobu odhadování růstu funkcí říkáme také asymptotické odhady a asymptotická složitost. V naprosté většině případů nás bude zajímat doba běhu algoritmu v nejhorším možném případě měřená v závislosti na velikosti vstupních dat a pokud ji neumíme spočítat přesně, tak alespoň stanovíme co nejlepší horní odhad. Důležité je chování algoritmu pro obrovské vstupy. Pro malé množství zpracovávaných dat dobře poslouží doslova každý správný algoritmus. Jenže na obrovských vstupech bude opravdu znát efektivita, bude rozdíl, jestli náš algoritmus poběží vteřinu, hodinu nebo 100 let. 1) Určíme počet f(n) provedených elementárních operací algoritmu v závislosti na vstupu o velikosti N, v nejdelším možném průběhu algoritmu. Pokud neumíme určit počet operací přesně, najdeme alespoň co nejlepší horní odhad na f(n). 2) Ve výsledné formuli f(n), která je součtem několika členů, ponecháme pouze nejrychleji rostoucí funkci, ostatní zanedbáme, tj. vypustíme. 3) Seškrtáme multiplikativní konstanty. Ale jen ty! Nikoli ostatní čísla ve vzorci. Jak bychom podle naší kuchařky postupovali u ukázkového algoritmu 2: Už jsme spočetli, ze se vykoná N(N + 1)/2 = N 2 /2 + N/2 elementárních operací. Škrtneme člen N/2 a zbude nám tedy N 2 /2. Na závěr škrtneme multiplikativní konstantu 1/2. Pozor, dvojka v exponentu není multiplikativní konstanta. Funkci g(n), která zbude, nazveme časovou složitostí algoritmu a tento fakt označíme výrokem algoritmus má časovou složitost O(g(N)). Naše ukázkové algoritmy tudíž mají po řadě časovou složitost O(N 2 ), O(N 2 ), O(log N) a O(N). Přemýšlivému čtenáři necháme v cvičení k rozmyšlení, proč jsme u třetího příkladu zcela vynechali fakt, že se jednalo o dvojkový logaritmus. Složitosti algoritmů mohou být velmi komplikované funkce. Nejčastěji se však setkáváme s algoritmy, které mají jednu z následujících složitostí. Složitosti O(N) říkáme lineární, O(N 2 ) kvadratická, O(N 3 ) kubická, O(log N) logaritmická, O(2 N )
10 exponenciální a O(1) (tedy že se provede pouze konstantně mnoho kroků) konstantní. Časová složitost hraje zásadní roli v kvalitě algoritmu. Pro ilustraci v následující tabulce uveďme, jak rychle rostou určité funkce, které se často vyskytují jako časové složitosti algoritmů. Funkce N = 10 N = 100 N = 1000 N = log N N N log N N N Vidíme, že algoritmus s exponenciální časovou složitostí by pro velká N vykonal skutečně enormní množství operací. Zkusme odhadnout, jak dlouho by běžel algoritmus s exponenciální časovou složitostí na současném počítači typu PC pro N = 70. Uvážíme jako průměr procesor s frekvencí 2 GHz, který v jednom tiku zpracuje jednu instrukci, čili operaci. Za rok by tedy tento počítač byl schopný vykonat maximálně operací. Protože celkem je k vykonání operací, nedočkali bychom se výsledku ani za let. Pomalost exponenciálních algoritmů je také možné vidět na následujícím postřehu: kdybychom zdvojnásobili rychlost počítače, umožní nám to ve stejném čase zpracovat pouze o 1 větší vstup. Proto se zpravidla snažíme exponenciálním algoritmům vyhýbat a uchylujeme se k nim, pouze pokud nemáme jinou možnost. 3 Algoritmům se složitostmi O(N k ) pro pevná konstantní k říkáme polynomiální a jsou chápány jako efektivní. Paměťová složitost Velmi podobně jako časová složitost se dá zavést tzv. paměťová složitost (někdy též prostorová složitost), která měří paměťové nároky algoritmu. K tomu musíme spočítat, kolik nejvíce tzv. elementárních paměťových buněk bude v daném algoritmu v každém okamžiku použito. V běžných programovacích jazycích (jako jsou například C nebo Pascal) za elementární buňku můžeme považovat například proměnnou typu integer, float, byte, či ukazatel, naopak elementární velikost rozhodně nemají například pole či textové řetězce. Opět vyjádříme množství spotřebovaných paměťových buněk funkcí f(n) v závislosti na velikosti vstupu N, pokud to neumíme přesně, tak alespoň co nejlepším 3 Znalec trhu s počítačovým hardware by zde mohl namítnout, že vývoj počítačů jde kupředu tak rychle, že podle empiricky ověřeného Mooreova zákona se každé dva roky výkon počítačů zdvojnásobí. To však znamená pouze to, že algoritmus se složitostí O(2 N ) na o 20 let novějším stroji ve stejném čase zpracuje pouze o 10 větší vstup
11 horním odhadem, aplikujeme tříbodovou kuchařku a výsledek zapíšeme pomocí notace O(g(N)). V našich čtyřech příkladech je tedy všude paměťová složitost O(1), neboť vždy používáme pouze konstantní množství celočíselných proměnných. Asymptotická notace aneb O, Ω, Θ Matematicky založený čtenář jistě cítí, že poněkud vágní popis určení časové a paměťové složitosti algoritmu (tříbodová kuchařka) je dosti nepřesný a žádá si exaktní definice. Pojďme se do ní pustit. Mějme dvě funkce f, g : N N. Funkce f(n) bude značit počet elementárních operací (buněk), který jsme nějak spočetli. Řekneme, že funkce f(n) je třídy O(g(n)), jestliže existuje taková kladná reálná konstanta C, že pro všechna přirozená čísla od jistého n 0 počínaje platí f(n) Cg(n). To znamená, že funkce g(n) shora omezuje f(n) až na multiplikativní konstantu. Funkci g(n) se říká horní asymptotický odhad funkce f(n). Technicky vzato je O(g(n)) množina všech funkcí f(n), které splňují předchozí definici, měli bychom tedy správně psát f(n) O(g(n)). V literatuře se však v tomto případě formalismy příliš nedodržují, místo formálně správného f(n) O(g(n)) se používá značení f(n) = O(g(n)), případně fráze f je O(g(n)) a podobně. Přijměme tedy i my tyto zvyklosti a používejme stejné (čistě formálně vzato nesprávné) výrazy a značení. Nabízí se také otázka, proč jsme zavedli číslo n 0 a splnění nerovnosti požadujeme až od něj dále. Tato konstrukce nám totiž umožní volit za g(n) i funkce, které mají několik počátečních funkčních hodnot nulových či dokonce záporných a nenašli bychom tedy jinak vhodnou konstantu C. Uvědomíme si nyní, že v předchozím oddílu popsaná třibodová kuchařka je vlastně důsledkem právě vyslovené definice. V bodu 1 musíme určit největší možný počet provedených elementárních operací daného algoritmu vzhledem k velikosti vstupu, což je přesně určení funkce f. V bodu 2 ponecháme z formule popisující funkci f, která je součtem několika členů, pouze nejrychleji rostoucí člen. Přesněji řečeno, pokud je f(n) = f 1 (n) + f 2 (n) a f 1 roste rychleji než f 2, člen f 2 vynecháme. Pojem f 1 roste rychleji než f 2 však znamená přesně to, že existuje jisté n 0 takové, že f 1 (n) f 2 (n) pro n n 0, čili f 2 (n) = O(f 1 (n)) a tedy i f(n) = O(f 1 (n)). Na závěr, když už zbývá pouze f(n) = c f (n) pro nějakou konstantu c, všimněme si, že v definici lze zvolit C := c a tudíž f(n) = O(f (n)), můžeme tedy škrtat multiplikativní konstantu. Zavádíme též dolní asymptotický odhad funkce. Mějme dvě funkce f, g : N N. Řekneme, že funkce f(n) je třídy Ω(g(n)), jestliže existuje taková kladná reálná konstanta C, že pro všechna přirozená čísla od jistého n 0 počínaje platí f(n) Cg(n). To znamená, že funkce g(n) zdola omezuje f(n) až na multiplikativní konstantu. Sluší se také vysvětlit původ slova asymptotický odhad. Ten pochází z toho, že zkoumáme chování pro obrovské vstupy, tedy pro n blížící se k nekonečnu. V matematické analýze se zkoumá tzv. asymptota funkce, což je přímka, jejíž vzdálenost
12 od funkce se s rostoucí souřadnicí zmenšuje a v nekonečnu se dotýkají. Odtud tedy název. Vzhledem k naší definici může být vyjádření složitosti algoritmu pomocí symbolu O dosti hrubé. Kvadratická funkce 2N 2 + 3N + 1 je totiž třídy O(N 2 ), ale podle uvedené definice patří také do třídy O(N 3 ), O(N 4 ), atd. Proto se zavádí ještě symbol Θ. Řekneme, že funkce f(n) je třídy Θ(g(n)), jestliže f(n) je z O(g(n)) a současně f(n) je z Ω(g(n)). Například naše ukázkové algoritmy 1,2,3,4 mají tedy složitosti po řadě Θ(N 2 ), Θ(N 2 ), Θ(log N) a Θ(N). Symboly Ω(g(n)) a Θ(g(n)) značí (stejně jako O(g(n))) množiny funkcí splňujících příslušné definice. Při skutečném srovnávání algoritmů bychom správně měli posuzovat jejich složitost podle tříd složitosti Θ, nikoli podle O. Analýzou algoritmu však obvykle dostáváme pouze horní odhad počtu provedených instrukcí nebo potřebných paměťových míst. Při pečlivé analýze tento odhad zpravidla nebývá příliš vzdálený skutečnosti a je to tedy nejen určení třídy O, ale i třídy Θ. Dokazovat tuto skutečnost formálně pro složitější algoritmy však bývá komplikované, bez důkazu by zase nebylo korektní používat symbol Θ. Budeme proto nadále vyjadřovat složitost algoritmů převážně pomocí symbolu O. Při tom však budeme usilovat o to, aby byl náš odhad asymptotické složitosti co nejlepší. Cvičení: 1. Proč je časová složitost druhého ilustračního algoritmu O(log N) a vynechali jsme fakt, že se jednalo o dvojkový logaritmus? 2. Jaká je složitost následujícího (pseudo)kódu vzhledem k N? while N > 0 if odd(i) then N-- else N = N div 2 3. Jaká je asymptotická složitost funkce log n (n!)? 1.4. Výpoèetní model RAM Matematicky založený jedinec stále nemůže být plně spokojen. Doposud jsme totiž odbývali přesné určení toho, co můžeme v algoritmu považovat za elementární operace a elementární paměťové buňky. Naší snahou bude vyhnout se obtížně řešitelným otázkám u věcí jako například reprezentace reálných čísel a zacházení s nimi. Situaci vyřešíme šalamounsky definujeme vlastní teoretický stroj, který bude mít přesně definované chování, přesně definovaný čas provádění instrukcí a přesně definovaný rozsah a vlastnosti paměťové buňky. Potom dává dobrý smysl měřit časovou a paměťovou náročnost naprogramovaného algoritmu naprosto přesně nezdržují nás vedlejší efekty reálných počítačů a operačních systémů. Jedním z mnoha teoretických modelů je tzv. Random Access Machine, neboli RAM. 4 RAM není jeden pevný model, nýbrž spíše rodina podobných strojů, které sdílejí určité společné vlastnosti. 4 Název lze přeložit do češtiny jako stroj s náhodným přístupem. Méně otrocký
13 Paměť RAMu tvoří pole celočíselných buněk adresovatelné nezápornými celými čísly. Každá buňka pojme jedno celé číslo. Bystrý čtenář se nyní otáže: To jako neomezeně velké číslo? Problematiku omezení kapacity buňky rozebereme v této kapitole později. Program je konečná posloupnost sekvenčně prováděných instrukcí dvou typů: aritmetických a řídících. Aritmetické instrukce mají obvykle dva vstupní argumenty a jeden výstupní argument. Argumenty mohou být buďto přímé konstanty (s vyjímkou výstupního argumentu), přímo adresovaná paměťová buňka (zadaná číslem) nebo nepřímo adresovaná paměťová buňka (její adresa je uložena v přímo adresované buňce). Řídící instrukce zahrnují skoky (na konkrétní instrukci programu), podmíněné skoky (například když se dva argumenty instrukce rovnají) a instrukci zastavení programu. Na začátku výpočtu obsahuje pamět v určených buňkách vstup a obsah ostatních buněk je nedefinován. Potom je program sekvenčně prováděn, instrukci za instrukcí. Po zastavení programu je obsah paměti interpretován jako výstup programu. Zmiňme také, že existují ještě teoretičtější výpočetní modely, jejichž zástupcem je tzv. Turingův stroj. Konkrétní model RAMu V našem popisu strojů z rodiny RAM jsme vynechali mnoho podstatných detailů. Například přesný čas vykonávání jednotlivých instrukcí, povolený rozsah čísel v jedné paměťové buňce, prostorovou složitost jedné buňky přesné vymezení instrukční sady, zejména aritmetických operací. V tomto oddílu přesně definujeme jeden konkrétní model RAMu. Popíšeme tedy paměť, zacházení s programem a výpočtem, instrukční sadu a chování stroje. Procesor v každém kroku provede právě jednu instrukci. K paměti přistupuje procesor přes pseudopole [i], kde i je celé číslo. To znamená, že lze použít též indexaci zápornými čísly. Lze použít nejvýše jednonásobnou nepřímou adresaci paměti, tj. lze jako index do pseudopole představujícího paměť použít například jeden z výrazů [42], [[-13]], ale nikoliv [[[5]]]. Rovněž nelze použít jako adresu v paměti jakýkoliv aritmetický výraz (např. [3*[5]]). Vstup a výstup stroj dostává a předává většinou v paměťových buňkách s nezápornými indexy, buňky se zápornými indexy se obvykle používají pro pomocná data a proměnné. Prvních 26 buněk se zápornými indexy, tj. [-1] až [-26] má pro snazší použití přiřazeno aliasy A, B, až Z a říkáme jim registry. Jejich hodnoty lze libovolně číst a zapisovat a používat pro indexaci paměti, lze tedy psát např. [A], ale nikoliv [[A]]. Využití registrů spočívá v často užívaných pomocných proměnných. a výstižnější překlad by mohl znít stroj s přímým přístupem do paměti, což je však zase příliš dlouhé a kostrbaté, stroji tedy budeme říkat prostě RAM. Pozor, hrozí zmatení zkratek s Random Access Memory, čili běžným názvem operační paměti počítače typu PC
14 Nechť X, Y a Z představují některý z výše uvedených výrazů pro přístup do paměti či registrů, Y a Z mohou být i celočíselné konstanty. Potom instrukce RAMu jsou tvaru: Přiřazení: X:=Y Unární minus: X:=-Y Součet: X:=Y +Z Rozdíl: X:=Y -Z Součin: X:=Y *Z Celočíselné dělení: X:=Y /Z, kde Z musí být nenulové. Zbytek po celočíselném dělení: X:=Y %Z, kde Z musí být nenulové. Bitová konjunkce: X:=Y &Z Bitová disjunkce: X:=Y Z Bitová nonekvivalence: X:=Y ^Z Bitový posun doleva: X:=Y <<Z Bitový posun doprava: X:=Y >>Z Prázdná instrukce: nop Ukončení výpočtu: halt Nepodmíněný skok: goto LABEL, kde LABEL je návěští, definuje se napsáním LABEL: před instrukci. Podmíněný příkaz: if LOGEXPR then INSTR INSTR je libovolná instrukce mimo podmíněného příkazu a LOGEXPR je jeden z následujících logických výrazů: Test rovnosti: Y =Z Negace testu rovnosti: Y <>Z Test ostré nerovnosti: Y <Z, případně Y >Z Test neostré nerovnosti: Y <=Z, případně Y >=Z Doba provádění podmíněného příkazu nezávisí na splnění jeho podmínky a je stejná jako doba provádění libovolné jiné instrukce. Časovou složitost programu pro vstup velikosti N (čili zabírající N paměťových buněk) definujeme jako maximum z počtu vykonaných instrukcí přes všechny možné legální vstupy velikosti N. Paměťovou složitost programu pro vstup velikosti N definujeme jako maximální rozdíl nejvyššího použitého indexu paměti od nejnižšího použitého indexu paměti, počítaný přes všechny legáalní vstupy velikosti N. Příklad programu pro RAM Pro ilustraci přepíšeme algoritmus 2 z předchozích oddílů co nejvěrněji do programu pro náš RAM. Připomeňme algoritmus 2: Algoritmus Hvězdičky 2 Vstup: číslo N 1. Pro i od 1 do N opakuj:
15 2. Pro j od 1 do i opakuj: 3. Tiskni * Zadání pro RAM formulujeme takto: V buňce [0] je uloženo číslo N. Výstup je tvořen posloupností buněk počínaje [1], ve kterých je v každé zapsána jednička (namísto hvězdičky jako v původním programu). VNEJSI: VNITRNI: A:=[0] C:=1 if A=0 then halt B:=A A:=A-1 if B=0 then goto VNEJSI [C]:=1 C:=C+1 B:=B-1 goto VNITRNI Omezení kapacity paměťové buňky Náš model má zatím jednu výrazně nereálnou vlastnost neomezenou kapacitu paměťové buňky. Toho lze využít k nejrůznějším trikům. Ponechme například čtenáři k rozmyšlení, jak veškerá data programu uložit do konstantně mnoha paměťových buněk (viz cvičení a 1.4.3). Dodefinujeme tedy stroj tak, abychom na jednu stranu neomezili kapacitu buňky, ale na druhou stranu kompenzovali nepřirozené výhody z její neomezenosti plynoucí. Možností je mnoho, ukážeme jich tedy několik, ke každé dodáme, jaké jsou její výhody a nevýhody, a na závěr zvolíme tu, kterou budeme používat v celé knize. Přiblížení první. Omezíme kapacitu paměťové buňky pevnou konstantou, řekněme na 32 bitů. Tím jistě odpadnou problémy s neomezenou kapacitou, lze si také představit, že aritmetické instrukce pracující s 32-bitovými čísly lze hardwarově realizovat v jednotkovém čase. Aritmetiku čísel delších než 32 bitů lze řešit funkcemi na práci s dlouhými čísly rozloženými do více paměťových buněk. Zásadní nevýhoda však spočívá v tom, že vzhledem k naší definici přístupu do paměti si omezíme počet adresovatelných paměťových buněk na Současné počítače typu PC to tak sice skutečně mají, nicméně z teoretického hlediska je takový stroj nevyhovující, protože umožnuje zpracovávat pouze konstantně velké vstupy. Přiblížení druhé. Omezíme maximální velikost čísla uložitelného v jedné paměťové buňce polynomem vzhledem k počtu paměťových buněk vstupu. Exaktně řečeno, pro každý program na tomto RAMu bude dán polynom p(n) takový, že pro každý vstup velikosti N paměťových buněk smí program v libovolné paměťové buňce uložit číslo maximální velikosti p(n). Tento model odstraňuje spoustu nevýhod předchozího, většina zákeřných triků využívajících kombinaci neomezené kapacity buňky a jednotkové ceny instrukce k řešení těžkých problému nepřirozeně rychle na něm neprojde. Model má jedno omezení pokud je počet bitů buňky nejvýše polynomiálně velký, znamená to, že
16 nemůžeme použít exponenciálně či více paměťových buněk, protože jich tolik prostě nenaadresujeme. Nemůžeme tedy na tomto stroji používat algoritmy s exponenciální paměťovou složitostí. Přiblížení třetí. Zavedeme logaritmickou cenu instrukce. To znamená, že místo jedné časové jednotky definitoricky zavedeme, že aritmetická instrukce a logický výraz spotřebuje tolik časových jednotek, kolik je součet bitů všech operandů včetně výstupního. Cena se nazývá logaritmická proto, že počet bitů čísla je úměrný logaritmu čísla. Tedy například cena instrukce součinu čísel 3 a 8 bude = 11, protože čísla 3 a 8 mají 2 a 4 bity a výsledek 24 má 5 bitů. Zde již omezení adresovatelného prostoru nehrozí. Prostorová komprese paměti programu do konstantně mnoha buněk je sice stále možná, je však vykoupena velkými časovými nároky instrukcí. V tom spočívá i nevýhoda modelu. Například třídíme-li zpřeházená čísla 1,..., N do rostoucího pořadí, na zápis každého z nich potřebujeme až log N bitů, každé porovnání dvou čísel tedy bude trvat O(log N) času, i nejrychlejší třídící algoritmy by tedy místo času O(N log N) potřebovaly čas O(N log 2 N). Existuje také relativně obtížný problém, který na takto definovaném RAMu bude řešitelný nepřirozeně snadno a rychle násobení dlouhých čísel. Uložíme-li obě násobená čísla do dvou paměťových buněk, postačí na jejich vynásobení jedna arimetická instrukce a její čas bude lineární vzhledem k počtu cifer obou čísel. V této knize přitom ukazujeme netriviální algoritmus, který na stroji s omezenou kapacitou buňky a jednotkovým časem operace vyžaduje čas přibližně O(N 1.58 ), kde N je součet počtů cifer obou čísel. Model s logaritmickou cenou instrukce tedy nezavrhujeme, ale je nekonzistentní s preferovaným výpočetním modelem této knihy. Přiblížení čtvrté. Zavedeme poměrnou logaritmickou cenu instrukce. Cena aritmetické instrukce a logického výrazu nyní bude dána vztahem b(x) + b(y ) + b(z) log 2 N kde b(x), b(y ), b(z) jsou po řadě počty bitů jednotlivých vstupních i výstupních operandů a N značí počet buněk vstupu. V tomto modelu odpadnou problémy například s časem třídících algoritmů, paradoxy při násobení dlouhých čísel však přetrvávají. Tak který model si vybrat? Jak vidíme, ať jsme navrhli jakékoli omezení paměťových buněk či zvýšení prováděcího času instrukce, vždy jsme odhalili nějaké nevýhody. Ideální model nejspíše ani neexistuje. Pro tuto knihu však hledáme referenční model, pro který půjde každý algoritmus z knihy naprogramovat se zachováním uvedené časové a paměťové složitosti. Zvolíme tedy model číslo 2, neboli model s polynomiálně omezenou kapacitou paměťové buňky. Algoritmy používající exponenciální paměť se totiž v této knize nevyskytují a pokud by snad na exponenciálně velký prostor přišla řeč, určitě na to upozorníme a zvolíme jiný referenční model.,
17 Naše teoretická práce je nyní u konce. Máme přesnou definici teoretického stroje RAM, pro který je přesně definována časová a paměťová složitost programů na něm běžících. Časovou složitost měříme počtem provedených instrukcí a paměťovou složitost maximálním počtem použitých paměťových buněk. Cvičení: 1. Naprogramujte na RAMu zbývající algoritmy z oddílu Jak zakódovat libovolné množství celých čísel c 1,..., c n do jednoho libovolně velkého celého čísla C tak, aby se jednotlivá čísla c i dala jednoznačně dekódovat? 3. Navrhněte postup, jak v případě neomezené kapacity paměťové buňky pozměnit libovolný program RAMu tak, aby používal vždy jen konstantně mnoho paměťových buněk (možná za cenu časového zpomalení). Kolik nejméně buněk je potřeba? 4. Spočítejte přesně počet provedených instrukcí v předchozím vzorovém programu vzhledem k N. 5. Pokud zavedeme logaritmickou cenu instrukce, jaká bude přesná doba běhu programu? 6. Pokud zavedeme poměrnou logaritmickou cenu instrukce, jaká bude přesná doba běhu programu? 1.5. Dal¹í slo¾itosti Doposud jsme vždy pod pojmem časová či paměťová složitost rozuměli složitost v nejhorším možném případě vzhledem k velikosti vstupních dat. Někdy však má smysl určovat i tzv. složitost v průměrném případě. Funkce popisující průměrnou složitost je definována jako průměr časových (paměťových) nároků algoritmů pro určitou množinu vstupů. Alternativní pohled na průměrnou složitost spočívá v tom, že kdybychom náhodně volili jeden vstup z jisté množiny M, potom střední hodnota časových (paměťových) nároků programu měřená přes všechny vstupy z M bude právě průměrná časová (paměťová) složitost. Například algoritmus QuickSort vykazuje v průměrném případě velmi dobré vlastnosti. Vedle složitosti algoritmu (resp. programu) zavádíme také pojem složitost problému. Tento pojem vychází z teoretické představy, že máme k dispozici všechny algoritmy řešící daný problém a porovnáváme jejich složitost. Časová složitost problému je pak rovna časové složitosti nejrychlejšího z algoritmů, který problém řeší. Má tedy význam dolního odhadu složitosti S, kterého lze dosáhnout. Říká nám, že v principu nemůže existovat algoritmus, který by řešil tento problém s menší složitostí než je S, a zároveň říká, že existuje algoritmus řešící problém se složitostí S. Stanovit složitost nějakého problému je obvykle velice obtížný úkol. Nemůžeme samozřejmě posuzovat všechny algoritmy daný problém řešící, těch je nekonečně mnoho. Odvození je třeba provádět jinou cestou
18 Například složitost problému třídění prvků, které mezi sebou umíme pouze porovnávat, je dobře prostudována. Jeho složitost je Θ(N log N), což znamená, že existuje algoritmus schopný utřídit N prvků v čase O(N log N) a zároveň neexistuje asymptoticky rychlejší algoritmus
1. Èasová a pamì»ová slo¾itost
1. Èasová a pamì»ová slo¾itost Snem každého programátora je navrhovat co nejlepší algoritmy, navrhnout dobrý algoritmus dá však často práci. Nabízí se totiž otázka, jak vůbec poznáme, zda určitý algoritmus
1. Èasová a pamì»ová slo¾itost
1. Èasová a pamì»ová slo¾itost Cílem každého programátora je bezesporu navrhovat co nejlepší algoritmy. Navrhnout dobrý algoritmus dá však často značnou práci; nabízí se totiž otázka, jak vůbec poznáme,
1. Èasová a pamì»ová slo¾itost
1. Èasová a pamì»ová slo¾itost Cílem každého programátora je bezesporu navrhovat co nejlepší algoritmy. Navrhnout dobrý algoritmus dá však často značnou práci; nabízí se totiž otázka, jak vůbec poznáme,
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#)
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
Intervalové stromy. Představme si, že máme posloupnost celých čísel p 0, p 1,... p N 1, se kterou budeme. 1. Změna jednoho čísla v posloupnosti.
Intervalové stromy Představme si, že máme posloupnost celých čísel p 0, p 1,... p N 1, se kterou budeme průběžně provádět tyto dvě operace: 1. Změna jednoho čísla v posloupnosti. 2. Zjištění součtu čísel
Architektury CISC a RISC, uplatnění v personálních počítačích
Architektury CISC a RISC, uplatnění v personálních počítačích 1 Cíl přednášky Vysvětlit, jak pracují architektury CISC a RISC, upozornit na rozdíly. Zdůraznit, jak se typické rysy obou typů architektur
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
1. Èasová a prostorová slo¾itost
1. Èasová a prostorová slo¾itost V minulé kapitole jsme zkusili navrhnout algoritmy pro několik jednoduchých úloh. Zjistili jsme přitom, že pro každou úlohu existuje algoritmů více. Všechny fungují, ale
Výpočetní složitost I
Výpočetní složitost I prooborlogikanaffuk Petr Savický 1 Úvod Složitostí algoritmické úlohy se rozumí především její časová a paměťová náročnost při řešení na počítači. Časová náročnost se měří počtem
IB108 Sada 1, Příklad 1 Vypracovali: Tomáš Krajča (255676), Martin Milata (256615)
IB108 Sada 1, Příklad 1 ( ) Složitost třídícího algoritmu 1/-Sort je v O n log O (n.71 ). Necht n = j i (velikost pole, které je vstupním parametrem funkce 1/-Sort). Lehce spočítáme, že velikost pole předávaná
V 70. letech výzkumy četnosti výskytu instrukcí ukázaly, že programátoři a
1 Počítače CISC a RISC V dnešní době se ustálilo dělení počítačů do dvou základních kategorií podle typu použitého procesoru: CISC - počítač se složitým souborem instrukcí (Complex Instruction Set Computer)
13. Třídící algoritmy a násobení matic
13. Třídící algoritmy a násobení matic Minulou přednášku jsme probírali QuickSort, jeden z historicky prvních třídících algoritmů, které překonaly kvadratickou složitost aspoň v průměrném případě. Proč
Součin matice A a čísla α definujeme jako matici αa = (d ij ) typu m n, kde d ij = αa ij pro libovolné indexy i, j.
Kapitola 3 Počítání s maticemi Matice stejného typu můžeme sčítat a násobit reálným číslem podobně jako vektory téže dimenze. Definice 3.1 Jsou-li A (a ij ) a B (b ij ) dvě matice stejného typu m n, pak
0. Lineární rekurence Martin Mareš, 2010-07-04
0 Lineární rekurence Martin Mareš, 2010-07-04 V tomto krátkém textu se budeme zabývat lineárními rekurencemi, tj posloupnostmi definovanými rekurentní rovnicí typu A n+k = c 0 A n + c 1 A n+1 + + c k 1
2. Složitost, grafové algoritmy (zapsal Martin Koutecký)
2. Složitost, grafové algoritmy (zapsal Martin Koutecký) Model Ram Při analýze algoritmu bychom chtěli nějak popsat jeho složitost. Abychom mohli udělat toto, potřebujeme nejprve definovat výpočetní model.
LED_007.c Strana: 1/5 C:\Michal\AVR\Výukové programy\archiv\ Poslední změna: 4.10.2011 8:01:48
LED_007.c Strana: 1/5 Nyní již umíme používat příkazy k větvení programu (podmínky) "if" a "switch". Umíme také rozložit program na jednoduché funkce a používat cyklus "for". Co se týče cyklů, zbývá nám
GRAFY A GRAFOVÉ ALGORITMY
KATEDRA INFORMATIKY PŘÍRODOVĚDECKÁ FAKULTA UNIVERZITA PALACKÉHO GRAFY A GRAFOVÉ ALGORITMY ARNOŠT VEČERKA VÝVOJ TOHOTO UČEBNÍHO TEXTU JE SPOLUFINANCOVÁN EVROPSKÝM SOCIÁLNÍM FONDEM A STÁTNÍM ROZPOČTEM ČESKÉ
Jak pracovat s absolutními hodnotami
Jak pracovat s absolutními hodnotami Petr Matyáš 1 Co to je absolutní hodnota Absolutní hodnota čísla a, dále ji budeme označovat výrazem a, je jeho vzdálenost od nuly na ose x, tedy je to vždy číslo kladné.
(Auto)korelační funkce. 2. 11. 2015 Statistické vyhodnocování exp. dat M. Čada www.fzu.cz/ ~ cada
(Auto)korelační funkce 1 Náhodné procesy Korelace mezi náhodnými proměnnými má široké uplatnění v elektrotechnické praxi, kde se snažíme o porovnávání dvou signálů, které by měly být stejné. Příkladem
Paměti a jejich organizace
Kapitola 5 Paměti a jejich organizace 5.1 Vnitřní a vnější paměti, vlastnosti jednotlivých typů Vnější paměti Jsou umístěny mimo základní jednotku. Lze je zařadit mezi periferní zařízení. Zápis a čtení
Regulární matice. Věnujeme dále pozornost zejména čtvercovým maticím.
Regulární matice Věnujeme dále pozornost zejména čtvercovým maticím. Věta. Pro každou čtvercovou matici A = (a ij ) řádu n nad tělesem (T, +, ) jsou následující podmínky ekvivalentní: (i) Řádky matice
Další aspekty architektur CISC a RISC Aktuálnost obsahu registru
Cíl přednášky: Vysvětlit principy práce s registry v architekturách RISC a CISC, upozornit na rozdíly. Vysvětlit možnosti využívání sad registrů. Zabývat se principy využívanými v procesorech Intel. Zabývat
Kapitola 1. Úvod. 1.1 Značení. 1.2 Výroky - opakování. N... přirozená čísla (1, 2, 3,...). Q... racionální čísla ( p, kde p Z a q N) R...
Kapitola 1 Úvod 1.1 Značení N... přirozená čísla (1, 2, 3,...). Z... celá čísla ( 3, 2, 1, 0, 1, 2,...). Q... racionální čísla ( p, kde p Z a q N) q R... reálná čísla C... komplexní čísla 1.2 Výroky -
Úvod do programování
Úvod do programování Základní literatura Töpfer, P.: Algoritmy a programovací techniky, Prometheus, Praha učebnice algoritmů, nikoli jazyka pokrývá velkou část probíraných algoritmů Satrapa, P.: Pascal
Pojem architektura je převzat z jiného oboru lidské činnosti, než počítače.
1 Architektura počítačů Pojem architektura je převzat z jiného oboru lidské činnosti, než počítače. Neurčuje jednoznačné definice, schémata či principy. Hovoří o tom, že počítač se skládá z měnších částí
Digitální učební materiál
Digitální učební materiál Číslo projektu: CZ.1.07/1.5.00/34.0548 Název školy: Gymnázium, Trutnov, Jiráskovo náměstí 325 Název materiálu: VY_32_INOVACE_146_IVT Autor: Ing. Pavel Bezděk Tematický okruh:
1. Programování PLC. Programovatelné automaty II - 1 -
Programovatelné automaty II - 1-1. Programování PLC Centrální jednotka Poskytuje programovatelnému automatu inteligenci. Realizuje soubor instrukcí a systémových služeb, zajišťuje i základní komunikační
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é
PROCESOR. Typy procesorů
PROCESOR Procesor je ústřední výkonnou jednotkou počítače, která čte z paměti instrukce a na jejich základě vykonává program. Primárním úkolem procesoru je řídit činnost ostatních částí počítače včetně
Mimo samotné správnosti výsledku vypočteného zapsaným algoritmem je ještě jedno
12 Délka výpočtu algoritmu Mimo samotné správnosti výsledku vypočteného zapsaným algoritmem je ještě jedno neméně důležité hledisko k posouzení vhodnosti algoritmu k řešení zadané úlohy. Jedná se o čas,
Ten objekt (veličina), který se může svobodně měnit se nazývá nezávislý.
@001 1. Základní pojmy Funkce funkční? Oč jde? Třeba: jak moc se oblečeme, závisí na venkovní teplotě, jak moc se oblečeme, závisí na našem mládí (stáří) jak jsme staří, závisí na čase jak moc zaplatíme
Sběrnicová struktura PC Procesory PC funkce, vlastnosti Interní počítačové paměti PC
Informatika 2 Technické prostředky počítačové techniky - 2 Přednáší: doc. Ing. Jan Skrbek, Dr. - KIN Přednášky: středa 14 20 15 55 Spojení: e-mail: jan.skrbek@tul.cz 16 10 17 45 tel.: 48 535 2442 Obsah:
přirozený algoritmus seřadí prvky 1,3,2,8,9,7 a prvky 4,5,6 nechává Metody řazení se dělí:
Metody řazení ve vnitřní a vnější paměti. Algoritmy řazení výběrem, vkládáním a zaměňováním. Heapsort, Shell-sort, Radix-sort, Quicksort. Řazení sekvenčních souborů. Řazení souborů s přímým přístupem.
Co říci úvodem (FIXME): Pro koho je knížka určena: co čekáme, co nabízíme. Programovací jazyky vs. pseudokód Úsek s nejvìt¹ím souètem
1. Úvod Co říci úvodem (FIXME): Pro koho je knížka určena: co čekáme, co nabízíme. Programovací jazyky vs. pseudokód. Role cvičení, nápovědy k nim. Pořadí čtení, závislosti, kapitoly a cvičení s hvězdičkou.
Anotace. Dynamické programování, diskrétní simulace.
Anotace Dynamické programování, diskrétní simulace. Problémy, které byly Přednášející jde tentokrát do M1, počet platných uzávorkování pomocí n párů závorek, počet rozkladů přirozeného čísla na součet
Algoritmy I, složitost
A0B36PRI - PROGRAMOVÁNÍ Algoritmy I, složitost České vysoké učení technické Fakulta elektrotechnická v 1.01 Rychlost... Jeden algoritmus (program, postup, metoda ) je rychlejší než druhý. Co ta věta znamená??
5 Rekurze a zásobník. Rekurzivní volání metody
5 Rekurze a zásobník Při volání metody z metody main() se do zásobníku uloží aktivační záznam obsahující - parametry - návratovou adresu, tedy adresu, kde bude program pokračovat v metodě main () po skončení
Složitost algoritmů. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava
Složitost algoritmů doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 27. prosince 2015 Jiří Dvorský (VŠB TUO) Složitost algoritmů
Architektura počítače
Architektura počítače Výpočetní systém HIERARCHICKÁ STRUKTURA Úroveň aplikačních programů Úroveň obecných funkčních programů Úroveň vyšších programovacích jazyků a prostředí Úroveň základních programovacích
V každém kroku se a + b zmenší o min(a, b), tedy vždy alespoň o 1. Jestliže jsme na začátku dostali 2
Euklidův algoritmus Doprovodný materiál pro cvičení Programování I. NPRM044 Autor: Markéta Popelová Datum: 31.10.2010 Euklidův algoritmus verze 1.0 Zadání: Určete největšího společného dělitele dvou zadaných
Technické prostředky počítačové techniky
Počítač - stroj, který podle předem připravených instrukcí zpracovává data Základní části: centrální procesorová jednotka (schopná řídit se posloupností instrukcí a ovládat další části počítače) zařízení
Řešení problému batohu dynamickým programováním, metodou větví a hranic a aproximativním algoritmem
2. 1. 213 MI-PAA úkol č. 2 Antonín Daněk Řešení problému batohu dynamickým programováním, metodou větví a hranic a aproximativním algoritmem 1 SPECIFIKACE ÚLOHY Cílem tohoto úkolu bylo naprogramovat řešení
Kapitola 11. Vzdálenost v grafech. 11.1 Matice sousednosti a počty sledů
Kapitola 11 Vzdálenost v grafech V každém grafu lze přirozeným způsobem definovat vzdálenost libovolné dvojice vrcholů. Hlavním výsledkem této kapitoly je překvapivé tvrzení, podle kterého lze vzdálenosti
Jazyk matematiky. 2.1. Matematická logika. 2.2. Množinové operace. 2.3. Zobrazení. 2.4. Rozšířená číslená osa
2. Jazyk matematiky 2.1. Matematická logika 2.2. Množinové operace 2.3. Zobrazení 2.4. Rozšířená číslená osa 1 2.1 Matematická logika 2.1.1 Výrokový počet logická operace zapisujeme čteme česky negace
2 Základní funkce a operátory V této kapitole se seznámíme s použitím funkce printf, probereme základní operátory a uvedeme nejdůležitější funkce.
Vážení zákazníci, dovolujeme si Vás upozornit, že na tuto ukázku knihy se vztahují autorská práva, tzv copyright To znamená, že ukázka má sloužit výhradnì pro osobní potøebu potenciálního kupujícího (aby
PŘEDNÁŠKA 2 POSLOUPNOSTI
PŘEDNÁŠKA 2 POSLOUPNOSTI 2.1 Zobrazení 2 Definice 1. Uvažujme libovolné neprázdné množiny A, B. Zobrazení množiny A do množiny B je definováno jako množina F uspořádaných dvojic (x, y A B, kde ke každému
Kubatova 19.4.2007 Y36SAP - 13. procesor - control unit obvodový a mikroprogramový řadič RISC. 19.4.2007 Y36SAP-control unit 1
Y36SAP - 13 procesor - control unit obvodový a mikroprogramový řadič RISC 19.4.2007 Y36SAP-control unit 1 Von Neumannova architektura (UPS1) Instrukce a data jsou uloženy v téže paměti. Paměť je organizována
Implementace numerických metod v jazyce C a Python
Fakulta elektrotechnická Katedra matematiky Dokumentace k semestrální práci Implementace numerických metod v jazyce C a Python 2013/14 Michal Horáček a Petr Zemek Vyučující: Mgr. Zbyněk Vastl Předmět:
MNOŽINY. x A. Jeho varianty paradox mostu se šibenicí, paradox holiče.
MNOŽINY Naivní definice (pojetí): Množina [set] je přesně definovaný soubor prvků, které mají nějakou vlastnost. O čemkoliv je třeba umět jednoznačně rozhodnout, zda do dané množiny patří či nikoliv. Vztah
Skalární součin je nástroj, jak měřit velikost vektorů a úhly mezi vektory v reálných a komplexních vektorových prostorech.
Kapitola 9 Skalární součin Skalární součin je nástroj, jak měřit velikost vektorů a úhly mezi vektory v reálných a komplexních vektorových prostorech. Definice 9.1 Je-li x = (x 1,..., x n ) T R n 1 reálný
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
3. Matice a determinanty
. Matice a determinanty Teorie matic a determinantů představuje úvod do lineární algebry. Nejrozsáhlejší aplikace mají matice a determinanty při řešení systémů lineárních rovnic. Pojem determinantu zavedl
Lenka Zalabová. Ústav matematiky a biomatematiky, Přírodovědecká fakulta, Jihočeská univerzita. zima 2012
Algebra - třetí díl Lenka Zalabová Ústav matematiky a biomatematiky, Přírodovědecká fakulta, Jihočeská univerzita v Českých Budějovicích zima 2012 Obsah 1 Dělitelnost 2 Grupy zbytkových tříd 3 Jedna z
Kapitola 1. Tenzorový součin matic
Kapitola 1 Tenzorový součin matic Definice 1.1. Buď F komutativní těleso. Pro matice A F m n a B F r s definujeme tenzorový součin A B jako matici o rozměru mr ns zapsanou blokově: A 11 B A 12 B A 1n B
Přednáška 9, 28. listopadu 2014 Část 4: limita funkce v bodě a spojitost funkce
Přednáška 9, 28. listopadu 2014 Část 4: limita funkce v bodě a spojitost funkce Zápisem f : M R rozumíme, že je dána funkce definovaná na neprázdné množině M R reálných čísel, což je množina dvojic f =
2. Matice, soustavy lineárních rovnic
Matice, soustavy lineárních rovnic Tento učební text byl podpořen z Operačního programu Praha- Adaptabilita Irena Sýkorová Některé vlastnosti matic Uvažujmečtvercovoumatici A=(a ij ) n n Matice Asenazývásymetrická,jestližeplatí
Zdůvodněte, proč funkce n lg(n) roste alespoň stejně rychle nebo rychleji než než funkce lg(n!). Symbolem lg značíme logaritmus o základu 2.
1 3 4 5 6 7 8 9 10 11 1 13 14 15 16 17 18 19 0 1 3 4 5 6 7 8 9 30 31 3 Zdůvodněte, proč funkce f(n) = n log(n) 1 n 1/ roste rychleji než funkce g(n) = n. Zdůvodněte, proč funkce f(n) = n 3/ log(n) roste
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í
Na začátku rozdělíme práci a určíme, které podproblémy je potřeba vyřešit. Tyto
Kapitola 1 Rozděl a panuj Rozděl a panuj je programovací metoda. Často se označuje latinsky Divide et Empera nebo anglicky Divide and Conquer. Vychází z toho, že umíme zadaný problém rozložit na menší
8. Geometrie vrací úder (sepsal Pavel Klavík)
8. Geometrie vrací úder (sepsal Pavel Klavík) Když s geometrickými problémy pořádně nezametete, ony vám to vrátí! Ale když užzametat,takurčitěnepodkoberecamístosmetákupoužijtepřímku.vtéto přednášce nás
UNIVERSITA PALACKÉHO V OLOMOUCI PŘÍRODOVĚDECKÁ FAKULTA. KATEDRA MATEMATICKÉ ANALÝZY A APLIKACÍ MATEMATIKY školní rok 2009/2010 BAKALÁŘSKÁ PRÁCE
UNIVERSITA PALACKÉHO V OLOMOUCI PŘÍRODOVĚDECKÁ FAKULTA KATEDRA MATEMATICKÉ ANALÝZY A APLIKACÍ MATEMATIKY školní rok 2009/2010 BAKALÁŘSKÁ PRÁCE Testy dobré shody Vedoucí diplomové práce: RNDr. PhDr. Ivo
O teleskopických součtech a součinech
O teleskopických součtech a součinech JAROSLAV ŠVRČEK Přírodovědecká fakulta UP, Olomouc Stanovení součtusoučinu) několika číselčlenů číselné posloupnosti vyhovující danému předpisu) a řešení úloh, které
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
8) Jaké jsou důvody pro použití víceprůchodového překladače Dříve hlavně kvůli úspoře paměti, dnes spíše z důvodu optimalizace
1) Charakterizujte křížový překladač Překlad programu probíhá na jiném procesoru, než exekuce. Hlavním důvodem je náročnost překladače na cílovém stroji by ho nemuselo být možné rozběhnout. 2. Objasněte
Lineární algebra : Báze a dimenze
Lineární algebra : Báze a dimenze (5. přednáška) František Štampach, Karel Klouda LS 2013/2014 vytvořeno: 9. dubna 2014, 13:33 1 2 5.1 Báze lineárního prostoru Definice 1. O množině vektorů M z LP V řekneme,
Základy matematické analýzy
Základy matematické analýzy Spojitost funkce Ing. Tomáš Kalvoda, Ph.D. 1, Ing. Daniel Vašata 2 1 tomas.kalvoda@fit.cvut.cz 2 daniel.vasata@fit.cvut.cz Katedra aplikované matematiky Fakulta informačních
ZÁKLADY PROGRAMOVÁNÍ. Mgr. Vladislav BEDNÁŘ 2014 5, 5.1 a 5.2 8/14
ZÁKLADY PROGRAMOVÁNÍ Mgr. Vladislav BEDNÁŘ 2014 5, 5.1 a 5.2 8/14 Co je vhodné vědět, než si vybereme programovací jazyk a začneme programovat roboty. 1 / 18 0:40 Algoritmus Algoritmem by se dal nazvat
Kolekce ArrayList. Deklarace proměnných. Import. Vytvoření prázdné kolekce. napsal Pajclín
Kolekce ArrayList napsal Pajclín Tento článek jsem se rozhodl věnovat kolekci ArrayList, protože je to jedna z nejpoužívanějších. Tento článek není kompletním popisem třídy ArrayList, ale budu se snažit
Digitální paměťový osciloskop (DSO)
http://www.coptkm.cz/ Digitální paměťový osciloskop (DSO) Obr. 1 Blokové schéma DSO Konstrukce U digitálního paměťového osciloskopu je obrazovka čistě indikační zařízení. Vlastní měřicí přístroj je rychlý
Programování v C++ Úplnej úvod. Peta (maj@arcig.cz, SPR AG 2008-9)
Programování v C++ Úplnej úvod Co se naučíte? tak samozřejmě C++, s důrazem na: dynamické datové struktury Objektově Orientované Programování STL (standardní knihovna šablon) vytváření vlastních šablon
int => unsigned int => long => unsigned long => float => double => long double - tj. bude-li:
13.4.2010 Typová konverze - změna jednoho datového typu na jiný - známe dva základní implicitní ("sama od sebe") a explicitní (výslovně vyžádána programátorem) - C je málo přísné na typové kontroly = dokáže
Cílem kapitoly je seznámit studenta s pamětmi. Jejich minulostí, současností, budoucností a hlavními parametry.
Paměti Cílem kapitoly je seznámit studenta s pamětmi. Jejich minulostí, současností, budoucností a hlavními parametry. Klíčové pojmy: paměť, RAM, rozdělení pamětí, ROM, vnitřní paměť, vnější paměť. Úvod
Digitální učební materiál
Digitální učební materiál Číslo projektu: CZ.1.07/1.5.00/34.0548 Název školy: Gymnázium, Trutnov, Jiráskovo náměstí 325 Název materiálu: VY_32_INOVACE_145_IVT Autor: Ing. Pavel Bezděk Tematický okruh:
Aritmetika s velkými čísly na čipové kartě
Aritmetika s velkými čísly na čipové kartě Ivo Rosol ředitel divize vývoje OKsystem s.r.o. Praha, 23.5.2013 Spojujeme software, technologie a služby Čísla v kryptografii V kryptografii se zásadně pracuje
12. Aproximační algoritmy
12. Aproximační algoritmy (F.Haško,J.enda,.areš, ichal Kozák, Vojta Tůma) Na minulých přednáškách jsme se zabývali různými těžkými rozhodovacími problémy. Tato se zabývá postupy, jak se v praxi vypořádat
x86 assembler and inline assembler in GCC
x86 assembler and inline assembler in GCC Michal Sojka sojkam1@fel.cvut.cz ČVUT, FEL License: CC-BY-SA 4.0 Useful instructions mov moves data between registers and memory mov $1,%eax # move 1 to register
Lekce 9 IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO VÝUKY INFORMAČNÍCH TECHNOLOGIÍ JAZYK C
Identifikační údaje školy Číslo projektu Název projektu Číslo a název šablony Autor Tematická oblast Číslo a název materiálu Anotace Vyšší odborná škola a Střední škola, Varnsdorf, příspěvková organizace
Časová složitost / Time complexity
Časová složitost / Time complexity Jan Kybic http://cmp.felk.cvut.cz/~kybic kybic@fel.cvut.cz 2016 2018 1 / 24 Složitost algoritmů Algorithm complexity Časová a paměťová složitost Trvání výpočtu v závislosti
Kombinatorický předpis
Gravitace : Kombinatorický předpis Petr Neudek 1 Kombinatorický předpis Kombinatorický předpis je rozšířením Teorie pravděpodobnosti kapitola Kombinatorický strom. Její praktický význam je zřejmý právě
for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }
5. Operátor čárka, - slouží k jistému určení pořadí vykonání dvou příkazů - oddělím-li čárkou dva příkazy, je jisté, že ten první bude vykonán dříve než příkaz druhý. Např.: i = 5; j = 8; - po překladu
Břetislav Fajmon, UMAT FEKT, VUT Brno. Poznámka 1.1. A) první část hodiny (cca 50 minut): představení všech tří metod při řešení jednoho příkladu.
Břetislav Fajmon, UMAT FEKT, VUT Brno Poznámka 1.1. A) první část hodiny (cca 50 minut): představení všech tří metod při řešení jednoho příkladu. Na jiných příkladech je téma podrobně zpracováno ve skriptech
+ ω y = 0 pohybová rovnice tlumených kmitů. r dr dt. B m. k m. Tlumené kmity
Tlumené kmit V praxi téměř vžd brání pohbu nějaká brzdicí síla, jejíž původ je v třecích silách mezi reálnými těles. Matematický popis těchto sil bývá dosti komplikovaný. Velmi často se vsktuje tzv. viskózní
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
Složitost a NP-úplnost
Složitost a NP-úplnost RNDr. Ondřej Čepek, Ph.D. Do formátu TEX převedl Ladislav Strojil Připomínky, dotazy, opravy na emailu: Ladislav@Strojil.cz Verze 1.1.1 Nejnovější verze k nalezení vždy na http://ladislav.strojil.cz/np.php
Petr Chvosta. vlevo, bude pravděpodobnost toho, že se tyč na počátku intervalu τ B nachází nad vpravo
MOLEKULÁRNÍ MOTORY Petr Chvosta. Automobil v krupobití aneb brzděním k pohybu Uvažme automobil stojící na mírném svahu a bombardovaný rovnoměrně ze všech stran obrovskými kroupami. Svah stoupá směrem doprava
Operační systémy. Přednáška 8: Správa paměti II
Operační systémy Přednáška 8: Správa paměti II 1 Jednoduché stránkování Hlavní paměť rozdělená na malé úseky stejné velikosti (např. 4kB) nazývané rámce (frames). Program rozdělen na malé úseky stejné
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
Zavedení a vlastnosti reálných čísel
Zavedení a vlastnosti reálných čísel jsou základním kamenem matematické analýzy. Konstrukce reálných čísel sice není náplní matematické analýzy, ale množina reálných čísel R je pro matematickou analýzu
ISU Cvičení 7. Marta Čudová
ISU Cvičení 7 Marta Čudová Supercomputing Technologies Research Group Brno University of Technology, Faculty of Information Technology Božetěchova 1/2, 612 66 Brno - Královo Pole icudova@fit.vutbr.cz Osnova
Procesor. Procesor FPU ALU. Řadič mikrokód
Procesor Procesor Integrovaný obvod zajišťující funkce CPU Tvoří srdce a mozek celého počítače a do značné míry ovlivňuje výkon celého počítače (čím rychlejší procesor, tím rychlejší počítač) Provádí jednotlivé
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
Cílem kapitoly je seznámit studenta s pamětmi. Jejich minulostí, současností a hlavnímu parametry.
Paměti Cílem kapitoly je seznámit studenta s pamětmi. Jejich minulostí, současností a hlavnímu parametry. Klíčové pojmy: paměť, RAM, rozdělení pamětí, ROM, vnitřní paměť, vnější paměť. Úvod Operační paměť
KALENDÁŘOVÉ ÚLOHY PRO TALENTY, vč. metodického listu. doc. PhDr. Marta Volfová, CSc.
KALENDÁŘOVÉ ÚLOHY PRO TALENTY, vč. metodického listu doc. PhDr. Marta Volfová, CSc. Centrum talentů M&F&I, Univerzita Hradec Králové, 2010 Kalendářové úlohy jsou zahaleny určitou tajemností a přitahují
Vztah teorie vyčíslitelnosti a teorie složitosti. IB102 Automaty, gramatiky a složitost, /31
Vztah teorie vyčíslitelnosti a teorie složitosti IB102 Automaty, gramatiky a složitost, 2. 12. 2013 1/31 IB102 Automaty, gramatiky a složitost, 2. 12. 2013 2/31 Časová složitost algoritmu počet kroků výpočtu
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í
A0M15EZS Elektrické zdroje a soustavy ZS 2011/2012 cvičení 1. Jednotková matice na hlavní diagonále jsou jedničky, všude jinde nuly
Matice Matice typu (m, n) je uspořádaná m-tice prvků z řádky matice.. Jednotlivé složky této m-tice nazýváme Matice se zapisují Speciální typy matic Nulová matice všechny prvky matice jsou nulové Jednotková
BAKALÁŘSKÁ PRÁCE. Numerické metody jednorozměrné minimalizace
UNIVERZITA PALACKÉHO V OLOMOUCI PŘÍRODOVĚDECKÁ FAKULTA KATEDRA MATEMATICKÉ ANALÝZY A APLIKACÍ MATEMATIKY BAKALÁŘSKÁ PRÁCE Numerické metody jednorozměrné minimalizace Vedoucí bakalářské práce: RNDr. Horymír
Složitost 1.1 Opera ní a pam ová složitost 1.2 Opera ní složitost v pr rném, nejhorším a nejlepším p ípad 1.3 Asymptotická složitost
1 Složitost 1.1 Operační a paměťová složitost Nezávislé určení na konkrétní implementaci Několik typů operací = sčítání T+, logické T L, přiřazení T A(assign), porovnání T C(compare), výpočet adresy pole
Programování. Debugging a testování. Martin Urza
Programování Debugging a testování Martin Urza Co je debugging? V počítačích nulté generace byly důvodem některých chyb zkraty, které způsoboval mimo jiné hmyz, jenž do těchto strojů zalézal. Odstraňování