Informatika
INTERAKTIVNÍ PRŮVODCE · ŘÍJEN 2026

Informatika

Od bitů a algoritmů
po hranice toho, co lze spočítat

Na pozadí hledá algoritmus cestu bludištěm. Prohledávání do šířky se šíří po vrstvách jako vlna na vodě: nejdřív všechna pole ve vzdálenosti 1, pak 2, 3… Jakmile vlna dorazí do cíle, oranžová čára ukáže nejkratší možnou cestu. Kapitola 8 vysvětluje proč.

vrstva vlny–
prozkoumaná pole–
totéž dvojkově–
nejkratší cesta–
Úvodem

Jak průvodce používat

Informatika není nauka o ovládání počítačů, stejně jako astronomie není nauka o dalekohledech. Je to věda o informaci a o postupech, jak ji uchovat, přenést a zpracovat. Průvodce začíná u jednoho bitu a algoritmu, který zvládne i dítě s tužkou, a končí u otázek, na které neodpoví žádný počítač, ať je jakkoli rychlý.

🧩

Tři patra každé kapitoly. Nahoře krátké vysvětlení a laboratoř: převodník čísel, robot ovládaný vlastním programem, řadicí algoritmy v pohybu, šifra, kterou sami prolomíte, Turingův stroj. Pod ní mise za XP, od bitu až po Turingova mistra. Dole rozbalovací teorie pro ty, kdo chtějí jít do hloubky: definice, pseudokód, důkazy, řešené příklady a příklady k procvičení s úplným řešením. Barevná tečka v obsahu ukazuje úroveň. Postup se ukládá jen ve vašem prohlížeči.

Mapa průvodce

Tab. 0.1Kapitoly, úrovně a co se naučíte
KapitolaÚroveňCo se naučíte
1 Informace a bityzákladydvojkovou a šestnáctkovou soustavu, bajty, jak se ukládá text (ASCII, Unicode, UTF-8), obrázek a zvuk
2 Algoritmyzákladyco je algoritmus, pseudokód, vývojový diagram, větvení a cykly; naprogramujete robota
3 Počítač, internet a bezpečnostzákladyprocesor, paměť, operační systém, IP, DNS, HTTPS; silná hesla, dvoufázové ověření, phishing
4 Programovánístřední školaproměnné, typy, funkce, rekurzi a ladění na příkladech v Pythonu a JavaScriptu
5 Řazení a vyhledávánístřední školabublinkové řazení, vkládáním, slučováním, rychlé řazení a binární vyhledávání
6 Složitost algoritmůstřední školaO-notaci, růst funkcí a proč dobrý algoritmus porazí rychlejší počítač
7 Datové strukturystřední školapole, seznam, zásobník, frontu, strom, binární vyhledávací strom, hašovací tabulku a graf
8 Grafové algoritmystřední školaprohledávání do šířky a do hloubky, Dijkstrův algoritmus, minimální kostru (Borůvka, Jarník)
9 Kryptografiestřední školaod Caesarovy šifry po AES, hašovací funkce, RSA na malých číslech, digitální podpis
10 Databáze a datavysoká školarelační model, SQL (SELECT, JOIN, GROUP BY), normalizaci, indexy a transakce
11 Vyčíslitelnost a složitostvysoká školaTuringův stroj, problém zastavení, třídy P a NP, NP-úplnost a redukce
12 Umělá inteligence a softwarevysoká školaprohledávání a hry, perceptron, princip jazykových modelů, verzování, testování, etika

Co budete potřebovat

Pro první tři kapitoly stačí základní škola: násobení, mocniny a trocha trpělivosti. Od kapitoly 4 se hodí středoškolská matematika (funkce, logaritmus, posloupnosti), od kapitoly 9 dělitelnost a počítání se zbytky. Programovat umět nemusíte; ukázky kódu jsou krátké a vysvětlené řádek po řádku. Kdo chce zkoušet, vystačí si s prohlížečem: v jeho vývojářské konzoli lze spouštět JavaScript.

Průvodce navazuje na sousední obory a odkazuje na ně textem. Logaritmy, kombinatoriku a důkazy vykládá průvodce Matematika, výrokovou logiku a formální úsudek Logika a kritické myšlení, logické obvody a polovodiče, ze kterých je procesor postavený, Elektrotechnika. Strojové učení tu najdete jen stručně; do hloubky ho rozebírá průvodce Statistika a modely. Otázky vědomí a mysli strojů patří průvodci Filozofie, ekonomiku platforem a digitálních trhů průvodci Ekonomie.

Čtyři druhy rámečků

Příklad Řešený příklad

Výpočet nebo postup krok za krokem. Čísla v příkladech jsou přepočítaná skriptem, kód je vyzkoušený.

Ve skutečnosti

Kde se látka používá, jak vznikla a co se stalo, když se na ni zapomnělo.

Pomůcka

Rychlé pravidlo nebo způsob, jak si věc zapamatovat.

Pozor

Místo, kde se nejčastěji chybuje: v kódu, v úvaze i v představě o tom, co počítač „umí“.

Studijní materiál, nenahrazuje učebnici ani výuku. Průvodce nejmenuje komerční produkty ani firmy; domény v příkladech (alfabanka.example a podobně) jsou smyšlené a podle RFC 2606 vyhrazené pro ukázky. Kapitoly o bezpečnosti a kryptografii vykládají principy a obranu, ne postupy útoků. Normy, protokoly a údaje mají v příloze C zdroj a datum ověření 13. 10. 2026.

Rozsahem odpovídá: kapitoly 1–3 vzdělávací oblasti Informatika v RVP ZV (data a informace, algoritmizace, informační systémy, digitální technologie), kapitoly 4–9 vzdělávací oblasti Informatika v RVP G a typickému maturitnímu rozsahu informatiky a programování, kapitoly 10–12 úvodním vysokoškolským kurzům: algoritmy a datové struktury, databázové systémy, automaty a vyčíslitelnost, úvod do umělé inteligence a softwarového inženýrství.

Část IZáklady
1

Informace a bityzáklady

Počítač rozlišuje jen dva stavy: proud teče, nebo neteče; náboj je, nebo není. Říkáme jim 0 a 1. Všechno ostatní – čísla, písmena, fotografie, hudba – je dohoda o tom, jak dlouhou řadu nul a jedniček číst a co znamená.

💡

Představte si chodbu s osmi vypínači. Každý buď svítí, nebo ne. Jeden vypínač rozliší dvě situace, dva vypínače čtyři, osm vypínačů už 256. Kdybyste se se sousedem domluvili, že rozsvícená kombinace znamená určité písmeno, můžete si přes chodbu posílat zprávy. Přesně to dělá počítač, jen má vypínačů miliardy a přepíná je miliardkrát za sekundu.

Bitové žárovky
Klepnutím rozsviťte nebo zhasněte žárovku. Každá má svou váhu: nejpravější 1, další 2, 4, 8… až 128. Číslo je součet vah rozsvícených žárovek. Posuvník nastaví žárovky podle čísla, tlačítka dole ukazují, co s bity dělá procesor.
LABORATOŘ
Model: jeden bajt, tedy 8 bitů. Bez znaménka jde o čísla 0–255; „se znaménkem“ je tentýž bajt čtený ve dvojkovém doplňku (oddíl 1.4), rozsah −128 až 127. Posun doleva u čísla nad 127 ztratí nejvyšší bit – to je přetečení.
Převodník soustav
Napište celé nezáporné číslo a zvolte, v jaké soustavě je zapsané. Převodník ho ukáže ve čtyřech soustavách a vypíše postup převodu do dvojkové soustavy opakovaným dělením dvěma.
LABORATOŘ
Model: celá čísla do \(2^{53}\), tedy zhruba 9 biliard; větší by JavaScript nepočítal přesně. Šestnáctkové číslice A–F znamenají 10–15.
Kolik bajtů má text?
Napište cokoli, třeba se všemi háčky a čárkami nebo s emoji. Tabulka ukáže pro každý znak jeho kódový bod v Unicode a bajty, kterými se zapíše v kódování UTF-8.
LABORATOŘ
Model: kódování podle RFC 3629. Znaky z ASCII mají 1 bajt, česká písmena s diakritikou 2, většina ostatních znaků základní roviny 3, emoji a znaky mimo ni 4. Složená emoji (rodina, vlajky) se skládají z více kódových bodů.
Minihra: rozsviťte číslo
Rozsviťte žárovky tak, aby dávaly zadané číslo. Začněte od největší váhy: vejde se 128? Pak 64? Pět správně rozsvícených čísel a máte body.
MINIHRA
Cíl: –0 / 5
Klepejte na žárovky.
+Teorie: bit, soustavy, kódování čísel, textu, obrazu a zvuku

1.1Bit a množství informace

Bit je nejmenší jednotka informace: odpověď na jednu otázku typu ano/ne, kde jsou obě odpovědi stejně pravděpodobné. Slovo vzniklo zkrácením binary digit, dvojková číslice; v tisku ho poprvé použil Claude Shannon v roce 1948 a připsal ho kolegovi Johnu Tukeymu.bit, binary digit

Řada \(n\) bitů může nabýt \(2^{n}\) různých hodnot. Obráceně: abychom rozlišili \(N\) stejně pravděpodobných možností, potřebujeme \(\log_2 N\) bitů, v praxi zaokrouhleno nahoru.

Kolik bitů\[N = 2^{n},\qquad n = \lceil \log_2 N \rceil\]
Příklad Dvacet otázek

Ve hře „myslím si…“ smíte položit 20 otázek ano/ne. Kolik předmětů lze takto spolehlivě rozlišit? \(2^{20} = 1\,048\,576\), tedy přes milion. Každá dobrá otázka rozdělí zbývající možnosti napůl – stejný trik uvidíte v kapitole 5 jako binární vyhledávání.

Hod kostkou nese \(\log_2 6 = 2{,}585\) bitu informace, tah karty z balíčku 52 karet \(\log_2 52 = 5{,}700\) bitu. Na zápis výsledku kostky ale potřebujeme celé 3 bity, protože bit nelze rozpůlit.

Entropie (rozšíření)

Když možnosti nejsou stejně pravděpodobné, nese zpráva v průměru méně informace. Shannon (1948) ji měří entropií: \(H = -\sum_i p_i \log_2 p_i\) bitů na zprávu. Mince, která padá v 90 % případů na líc, má entropii \(H = -(0{,}9\log_2 0{,}9 + 0{,}1\log_2 0{,}1) = 0{,}469\) bitu. Proto jde dobře komprimovat text: písmena v něm nejsou stejně častá a dají se kódovat úsporněji. Entropie je dolní mez průměrné délky bezeztrátového kódu.entropy, source coding

1.2Poziční číselné soustavy

V desítkové soustavě znamená zápis 2026 součet \(2\cdot10^{3} + 0\cdot10^{2} + 2\cdot10^{1} + 6\cdot10^{0}\). Hodnota číslice závisí na její pozici. Stejně funguje každá poziční soustava se základem \(z\): číslice \(c_k\) na \(k\)-té pozici zprava (počítáno od nuly) má váhu \(z^{k}\).positional numeral system, radix

Hodnota zápisu\[(c_{n-1}\dots c_1 c_0)_z = \sum_{k=0}^{n-1} c_k\, z^{k},\qquad 0 \le c_k \lt z\]

Dvojková (binární) soustava má základ 2 a číslice 0 a 1. Šestnáctková (hexadecimální) má základ 16 a číslice 0–9 a A–F. Šestnáctková soustava je zkratka pro dvojkovou: jedna šestnáctková číslice odpovídá přesně čtyřem bitům, protože \(16 = 2^{4}\). Bajt se tak zapíše dvěma znaky.binary, hexadecimal

10110110 2⁷ = 1282⁶ = 642⁵ = 322⁴ = 162³ = 82² = 42¹ = 22⁰ = 1 horní půlbajt 1011 = Bdolní půlbajt 0110 = 6 128 + 32 + 16 + 4 + 2 = 182 = B6₁₆
Obr. 1.1 Bajt 10110110. Každý bit má váhu mocniny dvou; hodnota je součet vah jedniček. Čtveřice bitů (půlbajt) odpovídá jedné šestnáctkové číslici.

Převod z desítkové soustavy

Číslo opakovaně dělíme základem a zapisujeme zbytky. Zbytky čtené odspodu (od posledního k prvnímu) dávají zápis v nové soustavě. Funguje to proto, že zbytek po dělení dvěma je právě nejnižší bit a podíl je číslo posunuté o jedno místo doprava.

Příklad 2026 dvojkově a šestnáctkově

2026 : 2 = 1013 zb. 0; 1013 : 2 = 506 zb. 1; 506 : 2 = 253 zb. 0; 253 : 2 = 126 zb. 1; 126 : 2 = 63 zb. 0; 63 : 2 = 31 zb. 1; 31 : 2 = 15 zb. 1; 15 : 2 = 7 zb. 1; 7 : 2 = 3 zb. 1; 3 : 2 = 1 zb. 1; 1 : 2 = 0 zb. 1.

Odspodu: \(2026 = 11111101010_2\). Rozdělením do čtveřic zprava \(111\ 1110\ 1010\) dostaneme \(7\,\text{E}\,\text{A}\), tedy \(2026 = 7\text{EA}_{16}\). Kontrola: \(7\cdot256 + 14\cdot16 + 10 = 2026\).

Pomůcka

Mocniny dvojky stojí za to znát nazpaměť aspoň do \(2^{10} = 1\,024\): 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1 024. Převod do dvojkové soustavy pak jde i „shora“: od čísla odečítejte největší mocninu dvojky, která se vejde, a na její místo napište 1. To je přesně postup z minihry.

1.3Bajty a předpony

Bajt (B) je skupina 8 bitů a nejmenší jednotka, kterou běžné počítače adresují v paměti. Pro větší množství se používají předpony. Desítkové předpony soustavy SI znamenají mocniny tisíce: 1 kB = 1 000 B, 1 MB = \(10^{6}\) B, 1 GB = \(10^{9}\) B, 1 TB = \(10^{12}\) B. Protože paměti rostou po mocninách dvojky, zavedla norma IEC dvojkové předpony: 1 KiB (kibibajt) = 1 024 B, 1 MiB = \(2^{20}\) B, 1 GiB = \(2^{30}\) B.byte, binary prefixes (KiB, MiB, GiB)

Příklad Kam zmizel kus disku?

Disk prodávaný jako 1 TB má \(10^{12}\) bajtů. Operační systém, který počítá ve dvojkových jednotkách, ukáže \(10^{12}/2^{30} = 931{,}3\) „GB“ (správně GiB). Nic nechybí, jen se počítá jinou jednotkou; rozdíl je 6,9 %.

Pozor

Malé b znamená bit, velké B bajt. Rychlost připojení se udává v bitech za sekundu: 100 Mbit/s je nejvýš 12,5 MB/s. Soubor o velikosti 1 GB se tedy při 100 Mbit/s stahuje nejméně 80 sekund.

1.4Celá čísla se znaménkem a desetinná čísla

Záporná čísla ukládají počítače ve dvojkovém doplňku: nejvyšší bit má zápornou váhu. U bajtu je to \(-128\) místo \(+128\), takže 8 bitů pokryje čísla od \(-128\) do \(127\). Opačné číslo se získá převrácením všech bitů a přičtením jedničky. Výhoda: sčítání funguje stejně pro kladná i záporná čísla, procesor nepotřebuje zvláštní obvod na odčítání.two's complement

Rozsah n bitů\[\text{bez znaménka: } 0 \dots 2^{n}-1,\qquad \text{se znaménkem: } -2^{n-1} \dots 2^{n-1}-1\]
Příklad −5 v jednom bajtu

\(5 = 00000101_2\). Převrácením bitů dostaneme \(11111010\), přičtením jedničky \(11111011\). Kontrola: \(-128 + 64 + 32 + 16 + 8 + 2 + 1 = -5\). Bajt \(10110110\) z obr. 1.1 je tedy bez znaménka 182, se znaménkem \(182 - 256 = -74\).

Když výsledek nevejde do daného počtu bitů, nastane přetečení: v bajtu se znaménkem dá \(127 + 1\) výsledek \(-128\). Programovací jazyky se k tomu chovají různě – některé tiše „přetočí“ hodnotu, jiné ohlásí chybu, Python má celá čísla libovolné délky.integer overflow

Desetinná čísla se ukládají v plovoucí řádové čárce podle normy IEEE 754: znaménko, exponent a mantisa, podobně jako vědecký zápis \(6{,}022\cdot10^{23}\), jen se základem 2. Nejběžnější formát má 64 bitů (1 znaménko, 11 exponent, 52 mantisa) a přesnost zhruba 15–17 platných desítkových číslic.floating point, IEEE 754 double precision

Pozor

Číslo 0,1 nemá ve dvojkové soustavě konečný zápis (stejně jako 1/3 v desítkové), takže se uloží zaokrouhleně. Proto v Pythonu i JavaScriptu vyjde 0.1 + 0.2 jako 0,30000000000000004 a test 0.1 + 0.2 == 0.3 je nepravdivý. Desetinná čísla porovnávejte s tolerancí a peníze počítejte v celých haléřích nebo v desítkovém typu.

Ve skutečnosti

Při prvním letu rakety Ariane 5 (1996) převáděl řídicí program 64bitové desetinné číslo s horizontální rychlostí na 16bitové celé číslo se znaménkem. Hodnota se nevešla do rozsahu do 32 767, převod skončil chybou, navigační systém se vypnul a raketa se necelých 40 sekund po startu rozpadla. Kód byl převzatý z Ariane 4, která letěla pomaleji (zpráva vyšetřovací komise, 1996).

1.5Text: ASCII, Unicode a UTF-8

Text je posloupnost znaků a každý znak má domluvené číslo. ASCII (americká norma z roku 1963) používá 7 bitů, tedy 128 kódů: 33 řídicích (konec řádku, tabulátor…) a 95 tisknutelných znaků včetně mezery. Písmeno A má kód 65, a má 97, číslice 0 kód 48. Velké a malé písmeno se liší jediným bitem s hodnotou 32.ASCII, character encoding

Pro češtinu ASCII nestačilo, a tak vznikla desítka vzájemně nekompatibilních osmibitových tabulek; text napsaný v jedné se v druhé zobrazil jako „rozsypaný čaj“. Řešením je Unicode: jediný katalog znaků všech písem. Každý znak má kódový bod zapisovaný U+ a šestnáctkovým číslem, například Č je U+010C, € je U+20AC. Prostor má \(17 \cdot 65\,536 = 1\,114\,112\) kódových bodů (U+0000 až U+10FFFF). Verze 18.0 z 16. 9. 2026 jich obsazuje 172 808.Unicode, code point

Unicode říká, jaké číslo znak má, ne jak ho zapsat do bajtů. To dělá kódování. Na webu převládá UTF-8 (RFC 3629): znaky ASCII zapíše jedním bajtem beze změny, ostatní dvěma až čtyřmi bajty. První bajt vícebajtové sekvence začíná tolika jedničkami, kolik bajtů sekvence má; každý následující bajt začíná 10.UTF-8, variable-length encoding

Tab. 1.1Stavba sekvencí UTF-8 (x jsou bity kódového bodu)
Kódové bodyBajtyBitový vzorPříklad
U+0000 – U+007F10xxxxxxxA = 41
U+0080 – U+07FF2110xxxxx 10xxxxxxČ = C4 8C
U+0800 – U+FFFF31110xxxx 10xxxxxx 10xxxxxx€ = E2 82 AC
U+10000 – U+10FFFF411110xxx 10xxxxxx 10xxxxxx 10xxxxxx😀 = F0 9F 98 80
Č = U+010C = 0000 0001 0000 1100₂ potřebuje 11 bitů → dvoubajtová sekvence; bity rozdělíme 5 + 6 00100 001100 11000100 = C4 10001100 = 8C 2 bajty
Obr. 1.2 UTF-8 krok za krokem. Oranžové bity jsou značky: 110 říká „sekvence má dva bajty“, 10 „jsem pokračovací bajt“. Díky nim lze v proudu bajtů vždy najít začátek znaku.
Příklad Kolik bajtů má slovo

„Ahoj“ má 4 znaky a 4 bajty. „kůň“ má 3 znaky, ale 5 bajtů: k = 6B, ů = C5 AF, ň = C5 88. Věta „Žluťoučký kůň“ má 13 znaků a 19 bajtů, protože 6 písmen s diakritikou zabere po dvou bajtech.

Pozor

Délka textu „ve znacích“ není jednoznačná. Emoji 😀 je jeden kódový bod, 4 bajty v UTF-8, ale 2 jednotky v UTF-16, které JavaScript vrací jako "😀".length. Písmeno é lze navíc zapsat jedním kódovým bodem (U+00E9) i dvěma (e + kombinující čárka); vypadají stejně, ale jako řetězce se nerovnají, dokud je normalizace nepřevede na stejný tvar.

1.6Obrázek a zvuk

Rastrový obrázek je mřížka bodů (pixelů). Barva každého pixelu se obvykle skládá ze tří složek: červené, zelené a modré (RGB), každá 0–255, tedy 1 bajt. Tři bajty dají \(2^{24} = 16\,777\,216\) barev. Ve webových stránkách se barva píše šestnáctkově: oranžová tohoto průvodce je #EB6834, tedy R = 235, G = 104, B = 52.raster image, pixel, RGB

Příklad Kolik místa zabere obrazovka

Obraz 1 920 × 1 080 pixelů po 3 bajtech má \(1\,920\cdot1\,080\cdot3 = 6\,220\,800\) B, tedy 6,2 MB (5,93 MiB). Video s 25 snímky za sekundu by bez komprese potřebovalo přes 155 MB každou sekundu. Proto se obrázky a video komprimují: bezeztrátově (po rozbalení přesně stejná data; vhodné pro grafiku a text) nebo ztrátově (vynechá detaily, kterých si oko nevšimne; fotografie a video).

Zvuk je kmitání tlaku vzduchu. Mikrofon ho převede na spojitý elektrický signál a převodník ho vzorkuje: v pravidelných intervalech změří okamžitou hodnotu a kvantuje ji na nejbližší z konečně mnoha úrovní. Vzorkovací věta (Nyquist, Shannon) říká, že signál obsahující frekvence do \(f_{\max}\) lze z ideálně změřených vzorků přesně obnovit, je-li vzorkovací frekvence větší než \(2f_{\max}\).sampling, quantization, Nyquist–Shannon theorem

kvantovací úrovněčas → spojitý signálkvantovaný záznam
Obr. 1.3 Vzorkování a kvantování. Modrá křivka je skutečný signál, tečky jsou změřené vzorky, oranžové schody jejich zaokrouhlení na nejbližší z devíti úrovní. Víc úrovní (bitů na vzorek) zmenší chybu zaokrouhlení, hustší vzorkování zachytí vyšší tóny.
Příklad Zvuk ve kvalitě CD

CD vzorkuje 44 100krát za sekundu (lidské ucho slyší zhruba do 20 kHz, dvojnásobek je 40 kHz), 16 bitů na vzorek, 2 kanály: \(44\,100\cdot16\cdot2 = 1\,411\,200\) bit/s. Minuta zvuku zabere 10 584 000 B, asi 10,6 MB, třiapůlminutová píseň 37,0 MB. Ztrátově komprimovaná verze s 128 kbit/s má 3,36 MB, jedenáctkrát méně.

1.7Procvičení

1
Převeďte číslo 200 do dvojkové a šestnáctkové soustavy.
200 : 2 = 100 zb. 0; 100 : 2 = 50 zb. 0; 50 : 2 = 25 zb. 0; 25 : 2 = 12 zb. 1; 12 : 2 = 6 zb. 0; 6 : 2 = 3 zb. 0; 3 : 2 = 1 zb. 1; 1 : 2 = 0 zb. 1. Odspodu \(200 = 11001000_2\). Čtveřice 1100 a 1000 jsou C a 8, tedy \(200 = \text{C8}_{16}\). Kontrola: \(12\cdot16 + 8 = 200\).
2
Jakou hodnotu má šestnáctkové číslo 1A3?
\(1\cdot16^{2} + 10\cdot16 + 3 = 256 + 160 + 3 = 419\).
3
Kolik bitů nejméně potřebujete, abyste každému z 1 000 žáků školy přidělili jiné číslo?
\(\lceil\log_2 1\,000\rceil = 10\), protože \(2^{9} = 512\) nestačí a \(2^{10} = 1\,024\) ano.
4
Zapište číslo −20 jako bajt ve dvojkovém doplňku.
\(20 = 00010100_2\). Převrácení bitů: \(11101011\). Přičtení jedničky: \(11101100\). Kontrola: \(-128 + 64 + 32 + 8 + 4 = -20\). Bez znaménka by týž bajt znamenal 236.
5
Fotoaparát pořídí snímek 4 000 × 3 000 pixelů s 24bitovou barvou. Kolik bajtů zabere bez komprese?
\(4\,000\cdot3\,000\cdot3 = 36\,000\,000\) B, tedy 36 MB (34,3 MiB). Ztrátová komprese ho obvykle zmenší na jednotky MB.
6
Proč UTF-8 vyžaduje, aby pokračovací bajty začínaly bity 10? Co by se stalo bez této značky?
Žádný první bajt sekvence nezačíná 10 (začíná 0, 110, 1110 nebo 11110). Program proto může začít číst uprostřed proudu bajtů, přeskočit pokračovací bajty a najít začátek dalšího znaku; poškozený bajt zkazí jen jeden znak. Bez značky by se po chybě nebo při čtení od prostředka posunulo dělení na znaky a zbytek textu by se četl špatně.
Co si odnést
  • \(n\) bitů rozliší \(2^{n}\) možností; bajt má 8 bitů a 256 hodnot.
  • Dvojková soustava je řeč stroje, šestnáctková její zkratka: čtyři bity na číslici.
  • Čísla, text, obraz i zvuk jsou bity plus dohoda o jejich výkladu. Unicode číslo znaku, UTF-8 jeho bajty.
  • Počítač počítá s omezenou přesností: celá čísla mohou přetéct, desetinná se zaokrouhlují.
Část IZáklady
2

Algoritmyzáklady

Algoritmus je návod tak přesný, že ho může provést i někdo, kdo vůbec nerozumí, k čemu slouží. Počítač je přesně takový vykonavatel: neumí si nic domyslet, ale cokoli jednoznačně popíšete, provede bez únavy a bez chyby.

🍳

Recept na palačinky je skoro algoritmus: suroviny jsou vstup, palačinky výstup, kroky jdou po sobě a některé se opakují („smažte, dokud těsto nedojde“). Jenže „osolte podle chuti“ nebo „pánev dobře rozpalte“ by počítač neprovedl. Algoritmus nesmí nechat nic na odhadu.

Robot na mřížce
Napište program pro robota (oranžová šipka) tak, aby dojel do zeleného cíle. Příkazy: krok, vlevo, vpravo, opakuj 3 { … }, dokud podmínka { … }, když podmínka { … } jinak { … }. Podmínky: volno, zeď, vpravo-volno, vlevo-volno, cíl, necíl. Čtyři úrovně, každá učí něco nového.
MINIHRA

Napište program a spusťte ho.
Model: vlastní miniaturní jazyk. Interpret převede text na strom příkazů a ten pak provádí; za komentář se považuje cokoli za znakem #. Počet příkazů = počet klíčových slov krok, vlevo, vpravo, opakuj, dokud a když. Ochrana proti zacyklení: nejvýš 3 000 vyhodnocení.
Euklidův algoritmus krok za krokem
Největší společný dělitel dvou čísel: větší vydělte menším se zbytkem, pak dělte dělitele zbytkem a tak dál, dokud zbytek nevyjde nula. Graf ukazuje, kolik dělení potřebuje algoritmus pro zvolené \(a\) a všechna \(b\) od 1 do \(a\).
LABORATOŘ
Model: klasický Euklidův algoritmus s dělením se zbytkem. Je-li \(b \gt a\), první krok čísla prohodí (\(a \bmod b = a\)). Mez podle Lamého: počet dělení nepřesáhne pětinásobek počtu číslic menšího čísla.
+Teorie: vlastnosti algoritmu, pseudokód, diagramy, Euklides a správnost

2.1Co je algoritmus

Algoritmus je konečný a jednoznačný postup, který ze vstupních údajů v konečném počtu kroků vytvoří výsledek. Slovo pochází ze jména perského matematika al-Chvárizmího (9. století), jehož spis o počítání s indickými číslicemi se v latinském překladu šířil Evropou. Nejstarší algoritmus, který se dodnes běžně používá, popsal Eukleidés v Základech kolem roku 300 př. n. l.algorithm

Česká školní tradice vyjmenovává tyto vlastnosti:

  • Elementárnost: skládá se z kroků, které vykonavatel umí provést.
  • Determinovanost (jednoznačnost): po každém kroku je jasné, co následuje.
  • Konečnost: pro každý přípustný vstup skončí po konečném počtu kroků.
  • Rezultativnost: dává výsledek (výstup).
  • Hromadnost (obecnost): řeší celou třídu úloh, ne jeden konkrétní případ. Postup „sečti 3 a 5“ není algoritmus sčítání; „sečti čísla \(a\) a \(b\)“ ano.

Knuth v The Art of Computer Programming uvádí pět podobných rysů: konečnost, určitost, vstup, výstup a efektivitu (kroky jsou tak jednoduché, že by je člověk zvládl s tužkou a papírem). Formální definici „postupu“ dal až Turing v roce 1936; k ní se vrátíme v kapitole 11.

Pozor

Program a algoritmus nejsou totéž. Algoritmus je myšlenka postupu; program je její zápis v konkrétním jazyce. Jeden algoritmus lze zapsat v Pythonu, JavaScriptu i v robotím jazyce z laboratoře. A ne každý program je algoritmem v přísném smyslu: operační systém nebo webový server běží záměrně „donekonečna“.

2.2Jak algoritmus zapsat

Algoritmus lze popsat slovy, ale přirozený jazyk bývá dvojznačný. Proto se používá pseudokód: strukturovaný zápis podobný programu, který se nedrží syntaxe žádného jazyka a nechává stranou podrobnosti. V tomto průvodci píšeme přiřazení šipkou \(\leftarrow\), bloky odsazením a operaci zbytku po dělení jako mod.pseudocode

funkce NSD(a, b):
    dokud b ≠ 0:
        r ← a mod b          # zbytek po dělení
        a ← b
        b ← r
    vrať a

Druhou možností je vývojový diagram: grafický zápis, ve kterém tvar značky říká, o jaký krok jde. Symboly popisuje norma ISO 5807. Ovál je začátek a konec, obdélník zpracování, kosodélník vstup a výstup, kosočtverec rozhodnutí se dvěma východy.flowchart

začátek vstup: a, b b = 0 ? ano výstup: a konec ne r ← a mod b a ← b; b ← r cyklus
Obr. 2.1 Euklidův algoritmus jako vývojový diagram. Šipka zpět k rozhodnutí tvoří cyklus; rozhodnutí „b = 0?“ je jeho podmínka ukončení.

2.3Posloupnost, větvení, cyklus

Každý algoritmus lze sestavit ze tří stavebních kamenů: posloupnosti (kroky jdou za sebou), větvení (podle podmínky se pokračuje jednou, nebo druhou cestou) a cyklu (část se opakuje, dokud platí podmínka). Že nic dalšího není potřeba, dokázali Böhm a Jacopini (1966). Na jejich výsledek navázal Dijkstra (1968) výzvou psát programy bez skoků goto; tak vzniklo strukturované programování.sequence, selection, iteration; structured programming

posloupnost krok A krok B krok C větvení podmínka? ano ne krok A krok B cyklus podmínka? ano tělo cyklu ne pokračuj dál
Obr. 2.2 Tři řídicí struktury strukturovaného programování. Libovolný algoritmus jde poskládat z jejich vnořování.

Cykly mají dvě podoby. Cyklus s pevným počtem opakování (opakuj 4, v Pythonu for i in range(4)) zná počet průchodů předem. Cyklus s podmínkou (dokud volno, while) se opakuje, dokud podmínka platí, a počet průchodů závisí na datech. Právě proto úroveň 3 laboratoře nejde vyřešit počítáním kroků: chodby jsou různě dlouhé a program musí reagovat na to, co robot „vidí“.

Příklad Největší prvek seznamu

Vstup: seznam čísel \(x_1, \dots, x_n\) (\(n \ge 1\)). Výstup: největší z nich.

m ← x[1]
pro i od 2 do n:
    když x[i] > m:
        m ← x[i]
vrať m

Posloupnost (přiřazení), cyklus (projdi zbytek seznamu) a větvení (je prvek větší?). Algoritmus provede přesně \(n-1\) porovnání. Pro seznam 7, 3, 9, 2, 9, 4 nabývá \(m\) postupně hodnot 7, 7, 9, 9, 9, 9 a vrátí 9.

2.4Euklidův algoritmus

Největší společný dělitel (NSD) dvou přirozených čísel je největší číslo, které dělí obě. Euklidův algoritmus stojí na pozorování, že \(\mathrm{NSD}(a, b) = \mathrm{NSD}(b, a \bmod b)\): každé číslo, které dělí \(a\) i \(b\), dělí i zbytek \(a - q\,b\), a naopak. Čísla se tak zmenšují, ale jejich NSD zůstává stejný. Když zbytek vyjde 0, je NSD poslední nenulové číslo.greatest common divisor (GCD), Euclidean algorithm

Krok algoritmu\[\mathrm{NSD}(a, b) = \mathrm{NSD}(b,\ a \bmod b),\qquad \mathrm{NSD}(a, 0) = a\]
Příklad NSD(1071, 462)

\(1071 = 2\cdot462 + 147\), \(462 = 3\cdot147 + 21\), \(147 = 7\cdot21 + 0\). Tři dělení, \(\mathrm{NSD}(1071, 462) = 21\). Kontrola: \(1071 = 51\cdot21\), \(462 = 22\cdot21\) a 51 a 22 nemají společného dělitele.

Hledat NSD rozkladem na prvočísla je pro velká čísla beznadějné (kapitola 9 ukáže, že na tom stojí šifra RSA). Euklidův algoritmus je rychlý i pro čísla se stovkami číslic.

Jak rychlý? Nejhůř se algoritmu daří s dvojicemi po sobě jdoucích Fibonacciho čísel (1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89…), kde každý podíl vyjde 1 a čísla klesají nejpomaleji. \(\mathrm{NSD}(89, 55)\) potřebuje 9 dělení. Lamé (1844) dokázal, že počet dělení nepřesáhne pětinásobek počtu desítkových číslic menšího čísla; jde o jeden z prvních odhadů složitosti algoritmu v dějinách. Počet kroků tedy roste s počtem číslic, ne s velikostí čísel – to je v řeči kapitoly 6 logaritmická složitost.Lamé's theorem

Ve skutečnosti

Euklidův algoritmus a jeho rozšířená verze (která najde i čísla \(x, y\) s \(ax + by = \mathrm{NSD}(a, b)\)) běží pokaždé, když se ve vašem prohlížeči navazuje šifrované spojení: počítají se s nimi inverze v modulární aritmetice, bez kterých by RSA ani další šifry nefungovaly.

2.5Správnost a konečnost

Že algoritmus funguje na několika příkladech, nic nedokazuje. Správnost se dokazuje dvěma nástroji. Invariant je tvrzení, které platí před každým průchodem cyklem; z něj a z podmínky ukončení plyne správnost výsledku. Variant (také konvergentní funkce) je nezáporné celé číslo, které se každým průchodem zmenší; protože nemůže klesat donekonečna, cyklus skončí.loop invariant, loop variant, termination

Příklad Důkaz pro Euklida

Invariant: NSD aktuálních hodnot \(a, b\) se rovná NSD původních vstupů (plyne z rovnosti \(\mathrm{NSD}(a, b) = \mathrm{NSD}(b, a \bmod b)\)). Když cyklus skončí, je \(b = 0\) a \(\mathrm{NSD}(a, 0) = a\), takže výsledek je správný.

Variant: hodnota \(b\). Nový \(b\) je zbytek \(a \bmod b\), tedy menší než starý \(b\), a přitom nezáporný. Klesající posloupnost přirozených čísel je konečná, cyklus proto skončí.

Pomůcka

U každého cyklu se zeptejte: (1) Co platí pokaždé, když jsem na začátku cyklu? (2) Co se každým průchodem zmenšuje? Když na druhou otázku nemáte odpověď, cyklus se možná zacyklí. Robot z úrovně 4 laboratoře nemá variant zaručený obecně: pravidlo pravé ruky projde každé bludiště bez kruhových chodeb, ale v bludišti s ostrůvkem kolem cíle by kroužilo věčně.

2.6Procvičení

1
Najděte Euklidovým algoritmem NSD(252, 105). Kolik dělení je potřeba?
\(252 = 2\cdot105 + 42\); \(105 = 2\cdot42 + 21\); \(42 = 2\cdot21 + 0\). \(\mathrm{NSD} = 21\), tři dělení.
2
Kolikrát proběhne tělo cyklu „pro \(i\) od 1 do 10 s krokem 3“? Jaké hodnoty \(i\) nabude?
\(i = 1, 4, 7, 10\); tělo proběhne čtyřikrát. Další hodnota 13 už je za horní mezí.
3
Robot stojí na volné ploše a provede opakuj 4 { opakuj 3 { krok } vpravo }. Kde skončí a kolik kroků ujede?
Objede čtverec o straně 3 pole: 4 × 3 = 12 kroků a 4 otočky vpravo, tedy otočka o 360°. Skončí na výchozím poli, natočený stejně jako na začátku.
4
Je postup „dokud \(x \ne 0\): \(x \leftarrow x - 2\)“ algoritmem pro všechna celá čísla \(x\)? Pokud ne, opravte ho.
Není: pro liché nebo záporné \(x\) hodnota nule nikdy nedosáhne (například 5, 3, 1, −1, −3, …) a postup nekončí, chybí konečnost. Oprava: „dokud \(x \gt 0\)“. Variantem je pak \(\max(x, 0)\), který každým průchodem klesne o 2, dokud není nula.
5
Kolik dělení nejvýš potřebuje Euklidův algoritmus pro dvojici čísel menších než 1 000 podle Lamého věty? A kolik skutečně?
Menší číslo má nejvýš 3 číslice, mez je \(5\cdot3 = 15\) dělení. Prohledání všech dvojic programem ukáže skutečné maximum 14 dělení, a to pro dvojici Fibonacciho čísel 987 a 610.
6
Napište pseudokód, který zjistí, zda je přirozené číslo \(n \ge 2\) prvočíslo, zkoušením dělitelů. Kolik dělení nejvýš provede pro \(n = 97\)?
d ← 2; dokud d·d ≤ n: když n mod d = 0: vrať „složené“; d ← d + 1; vrať „prvočíslo“. Stačí zkoušet dělitele do \(\sqrt{n}\): má-li \(n\) dělitele větší než \(\sqrt{n}\), má i menšího. Pro 97 zkusí \(d = 2, 3, \dots, 9\) (protože \(10\cdot10 = 100 \gt 97\)), tedy 8 dělení, a ohlásí prvočíslo.
Co si odnést
  • Algoritmus je konečný, jednoznačný a obecný postup od vstupu k výstupu.
  • Stačí tři stavební kameny: posloupnost, větvení a cyklus.
  • Cyklus s podmínkou reaguje na data; proto program funguje i na vstupech, které jste předem neviděli.
  • Správnost cyklu dokazuje invariant, konečnost variant. Euklidův algoritmus je rychlý, protože počet kroků roste s počtem číslic.
Část IZáklady
3

Počítač, internet a bezpečnostzáklady

Počítač je stroj, který podle programu uloženého v paměti zpracovává data uložená v téže paměti. Internet je síť sítí, ve které si počítače předávají malé balíčky dat podle společných pravidel – protokolů. Kdo rozumí oběma, lépe pozná, kdy mu na síti hrozí nebezpečí.

📮

Internet funguje jako pošta. IP adresa je adresa domu, DNS je telefonní seznam, který ke jménu najde adresu, a velký balík se posílá jako řada malých dopisů (paketů), z nichž každý může jet jinou cestou. HTTPS je dopis v zalepené obálce s ověřeným odesílatelem: pošťák vidí, komu ho nese, ale nepřečte ho.

Cesta webové stránky
Co se stane mezi stiskem Enteru a prvním bajtem stránky? Prohlížeč se zeptá DNS na adresu, naváže spojení, dohodne šifrování a pošle požadavek. Každý krok stojí aspoň jednu cestu tam a zpět (RTT). Graf ukazuje, kde se čas ztrácí.
LABORATOŘ
Model: jedna stránka bez dalších souborů, server odpovídá okamžitě, přenos plnou rychlostí (bez pomalého rozjezdu TCP a bez ztrát paketů). DNS dotaz stojí 1 RTT, navázání TCP 1 RTT, TLS 1.3 1 RTT (TLS 1.2 2 RTT), QUIC spojuje transport a šifrování do 1 RTT. Opakované spojení umí TLS 1.3 i QUIC zkrátit; to model nezahrnuje.
Síla hesla v číslech
Kolik kombinací by musel vyzkoušet ten, kdo hádá náhodně vygenerované heslo? Zvolte délku, sadu znaků a rychlost pokusů. Křivka ukazuje průměrnou dobu uhodnutí podle délky (logaritmická osa: každá čárka je desetkrát víc).
LABORATOŘ
Model: heslo je vybrané náhodně a rovnoměrně z celého prostoru, útočník zkouší všechny kombinace; průměrně uhodne v polovině. Pro hesla vymyšlená člověkem (jména, data, slova s číslem na konci) to neplatí: zkoušejí se nejdřív nejčastější volby a padnou mnohem dřív. „Náhodná slova“ jsou slova vylosovaná ze seznamu 7 776 slov, jak se to dělá hodem kostkou. Rychlost pokusů závisí na tom, jak služba hesla ukládá (kapitola 9): u přihlašovacího formuláře jsou to jednotky pokusů, u uniklé databáze s rychlou hašovací funkcí miliardy za sekundu.
Minihra: phishing, nebo v pořádku?
Phishing je podvodná zpráva, která se vydává za banku, úřad nebo známého, aby z vás vylákala heslo, kód nebo platbu. Posuďte osm situací. Všechny domény jsou smyšlené.
MINIHRA
0 / 8
+Teorie: architektura počítače, operační systém, sítě, DNS, HTTPS a bezpečnost uživatele

3.1Z čeho se skládá počítač

Téměř všechny dnešní počítače vycházejí z von Neumannovy architektury, popsané v roce 1945 ve zprávě o počítači EDVAC. Jejím jádrem je myšlenka uloženého programu: instrukce programu leží ve stejné paměti jako data a dají se načíst, změnit i vytvořit jiným programem.von Neumann architecture, stored program

procesor (CPU) řadič ALU registry (nejrychlejší paměť) vstupklávesnice, síť, senzor výstupdisplej, síť, tiskárna operační paměť (RAM)program i data, adresované po bajtech sběrnice
Obr. 3.1 Von Neumannova architektura. Řadič čte instrukce z paměti a řídí ostatní části, aritmeticko-logická jednotka (ALU) počítá, registry drží mezivýsledky. Vše propojuje sběrnice.

Procesor pracuje v cyklu načti – dekóduj – proveď: z adresy v čítači instrukcí načte instrukci, zjistí, co znamená (sečti, porovnej, skoč jinam, ulož do paměti…), provede ji a posune čítač na další. Rytmus udávají takty. Při frekvenci 3 GHz trvá takt \(1/(3\cdot10^{9})\ \text{s} = 0{,}33\) ns; světlo za tu dobu urazí jen 10 cm. Moderní procesor zvládne v jednom taktu i několik instrukcí najednou a má víc jader, z nichž každé je samostatný procesor.fetch–decode–execute cycle, clock, core

Procesor se skládá z miliard tranzistorů zapojených do logických hradel (AND, OR, NOT). Jak se z hradel postaví sčítačka a paměťová buňka, vysvětluje průvodce Elektrotechnika; logiku, na které hradla stojí, průvodce Logika a kritické myšlení.

3.2Paměťová hierarchie

Rychlá paměť je drahá a malá, levná paměť velká a pomalá. Počítač proto skládá několik úrovní: registry, vyrovnávací paměti procesoru (cache L1, L2, L3), operační paměť RAM a trvalé úložiště (SSD, pevný disk). Co program právě potřebuje, se drží co nejblíž procesoru. Funguje to díky lokalitě: programy často sahají na stejná data znovu (časová lokalita) a na data uložená vedle sebe (prostorová lokalita).memory hierarchy, cache, locality of reference

Tab. 3.1Řádové doby přístupu a „lidské měřítko“ (1 ns natažená na 1 s)
Kde data ležíŘádověKdyby 1 ns byla 1 s
cache L11 ns1 s
cache L24 ns4 s
operační paměť RAM100 ns1,7 min
SSD (náhodné čtení)100 µs1,2 dne
pevný disk (vystavení hlavy)10 ms116 dní
paket přes oceán a zpět150 ms4,8 roku
Řádové hodnoty pro představu; konkrétní zařízení se liší i o řád. Paket ze střední Evropy na západní pobřeží USA a zpět je omezen rychlostí světla ve vlákně (asi 200 000 km/s) a délkou trasy.
Pomůcka

Pro programátora z tabulky plyne jednoduché pravidlo: práce s daty, která už jsou v paměti, je levná; každé čekání na disk nebo síť je drahé. Rychlé programy proto čtou data po velkých blocích, ukládají si výsledky (mezipaměť, cache) a posílají po síti méně požadavků.

3.3Operační systém

Operační systém je program, který spravuje hardware a nabízí ostatním programům jednotné služby. Jeho jádro běží ve zvláštním privilegovaném režimu procesoru; aplikace o jeho služby žádají systémovým voláním. Hlavní úlohy:operating system, kernel, system call

  • Procesy a plánování: každý spuštěný program je proces. Plánovač je střídá po milisekundách, takže se zdá, že běží současně, i když jader je méně než procesů.
  • Správa paměti: každý proces vidí vlastní virtuální paměť; systém ji mapuje na fyzickou RAM a odděluje procesy od sebe, takže chyba jednoho programu nepřepíše data druhého.
  • Souborový systém: uspořádá bajty na disku do souborů a složek (stromová struktura, kapitola 7).
  • Ovladače a vstup/výstup: skryjí rozdíly mezi tisíci typy zařízení.
  • Oprávnění a bezpečnost: kdo smí číst které soubory, která aplikace smí k mikrofonu nebo poloze.

3.4Sítě a internet

Data se po síti posílají v paketech, kousky o velikosti zhruba do 1 500 bajtů. Každý paket nese adresu odesílatele i příjemce a směrovače ho předávají dál, každý podle své tabulky „kterým směrem je to blíž“. Pakety jedné zprávy mohou jet různými cestami a dorazit v jiném pořadí. Této metodě se říká přepojování paketů; díky ní síť přežije výpadek části linek.packet switching, router

Komunikaci řídí vrstvy protokolů; každá řeší jednu starost a spoléhá na vrstvu pod sebou. Model TCP/IP má čtyři vrstvy:

  1. Linková (Ethernet, Wi-Fi): přenos rámce k sousednímu zařízení.
  2. Síťová (IP): doručení paketu přes mnoho sítí na cílovou IP adresu. IPv4 (RFC 791) má 32bitové adresy, tedy \(2^{32} = 4\,294\,967\,296\) adres, což je dnes málo. IPv6 (RFC 8200) má 128 bitů, \(2^{128} \approx 3{,}4\cdot10^{38}\) adres.
  3. Transportní (TCP, UDP): TCP (RFC 9293) z nespolehlivých paketů skládá spolehlivý proud bajtů: čísluje je, potvrzuje, ztracené posílá znovu a řadí. UDP (RFC 768) posílá samostatné zprávy bez záruk; hodí se tam, kde je pozdní data lepší zahodit (hovor, hra).
  4. Aplikační (HTTP, DNS, e-mail…): pravidla konkrétní služby.
rámec Wi-Fi / Ethernetadresy síťových karet paket IPIP odesílatele a příjemce segment TCPporty, pořadové číslo, potvrzení GET /index.html HTTP/1.1 … (data aplikace)
Obr. 3.2 Zapouzdření. Každá vrstva přidá svou hlavičku a obsah vyšší vrstvy nečte. Směrovač po cestě se dívá jen do hlavičky IP.

3.5DNS: telefonní seznam internetu

Lidé si pamatují jména (skola.example), počítače potřebují IP adresy. Převod zajišťuje systém doménových jmen (DNS), popsaný v RFC 1034 a 1035 (1987). Jména jsou hierarchická a čtou se zprava: kořen, doména nejvyšší úrovně (.cz, .org), doména druhé úrovně (název organizace), případně další úrovně. Váš počítač se zeptá rekurzivního resolveru (obvykle u poskytovatele připojení) a ten postupně obejde servery kořene, nejvyšší úrovně a dané domény. Odpovědi se ukládají do mezipaměti na dobu, kterou určí správce domény (TTL).Domain Name System, resolver, time to live

Pozor

O tom, komu doména patří, rozhoduje její konec, ne začátek. Adresa alfabanka.example.overeni-klienta.example patří vlastníkovi domény overeni-klienta.example; slovo „alfabanka“ na začátku si může napsat kdokoli. Podvodníci toho využívají spolu s doménami, které se liší jedním písmenem nebo znakem z jiné abecedy.

3.6HTTP a HTTPS

HTTP je protokol webu: prohlížeč pošle požadavek (metoda GET pro čtení, POST pro odeslání formuláře, cesta, hlavičky) a server vrátí odpověď se stavovým kódem a obsahem. Kódy 2xx znamenají úspěch (200 OK), 3xx přesměrování (301), 4xx chybu klienta (404 Nenalezeno, 403 Zakázáno), 5xx chybu serveru (500). Význam protokolu popisuje RFC 9110 (2022), verze HTTP/1.1, HTTP/2 a HTTP/3 se liší jen způsobem přenosu.HTTP request, response, status code

HTTPS je HTTP přenášené přes šifrovaný kanál TLS (aktuální verze 1.3, RFC 8446, 2018). TLS zajišťuje tři věci: důvěrnost (obsah nikdo po cestě nepřečte), integritu (nikdo ho nezmění bez odhalení) a ověření serveru: server předloží certifikát podepsaný certifikační autoritou, které váš prohlížeč důvěřuje, a dokáže, že vlastní k němu patřící soukromý klíč. Jak to funguje matematicky, ukáže kapitola 9.HTTPS, TLS, certificate authority

DNS resolverprohlížečwebový server jaká je adresa? IP adresa SYN SYN-ACK ACK + ClientHello ServerHello, certifikát, Finished Finished + GET / 200 OK + první bajty stránky 1. RTT2. RTT3. RTT4. RTT čas ↓
Obr. 3.3 Načtení stránky přes HTTPS (TCP + TLS 1.3). Modře DNS a HTTP, zeleně navázání spojení TCP, oranžově dohoda o šifrování. Do prvního bajtu stránky uplynou čtyři cesty tam a zpět; laboratoř nahoře je sečte.
Příklad Kolik trvá načtení

RTT 50 ms, DNS se musí zeptat, TLS 1.3: čtyři cesty tam a zpět, \(4\cdot50 = 200\) ms do prvního bajtu. Stránka 2 MB při rychlosti 50 Mbit/s se přenáší \(2\cdot8/50 = 0{,}32\) s. Celkem 0,52 s. Se servery na druhé straně oceánu (RTT 150 ms) by čekání na první bajt trvalo 600 ms – víc než samotný přenos. Proto se obsah webů kopíruje na servery blízko uživatelů.

Pozor

Zámek v adresním řádku říká jen to, že spojení je šifrované a vede na server, který vlastní certifikát pro zobrazenou doménu. Neříká, že je stránka poctivá. Certifikát si zdarma pořídí i podvodník pro svou doménu overeni-klienta.example. Kontrolujte doménu, ne zámek.

3.7Bezpečnost a soukromí uživatele

Většina útoků na běžné uživatele nevyužívá chyby v šifrování, ale lidskou důvěřivost a slabá nebo opakovaná hesla. Obrana je proto hlavně v návycích.

Hesla

Síla náhodného hesla se měří entropií: \(L\) znaků vybraných náhodně z \(N\) možností dává \(L\log_2 N\) bitů. Každý bit navíc zdvojnásobí počet pokusů. Délka pomáhá víc než složitost: 15 náhodných malých písmen má 70,5 bitu, 8 náhodných znaků ze všech 94 tisknutelných jen 52,4 bitu. Americký standard NIST SP 800-63B-4 (2025) proto žádá u hesla, které je jediným ověřovacím faktorem, aspoň 15 znaků, u hesla doplněného druhým faktorem aspoň 8; služby mají přijímat aspoň 64 znaků, nemají vynucovat pravidla typu „velké písmeno a číslice“ ani pravidelnou změnu hesla, ale mají odmítat hesla ze seznamů uniklých a běžných hesel.password entropy, passphrase

Entropie náhodného hesla\[H = L\cdot\log_2 N\ \text{bitů},\qquad \text{počet možností} = N^{L} = 2^{H}\]
Příklad Znaky, nebo slova?

Deset náhodných znaků z písmen a číslic: \(10\log_2 62 = 59{,}5\) bitu. Pět náhodných slov ze seznamu 7 776 slov: \(5\log_2 7\,776 = 64{,}6\) bitu – víc, a přitom se pět slov pamatuje snáz. Při miliardě pokusů za sekundu (\(10^{9}\)) by průměrné uhodnutí pěti slov trvalo \(2^{64{,}6}/2/10^{9}\) s, tedy asi 450 let; při \(10^{10}\) pokusech 45 let. Kdo si heslo vymyslí sám, má entropii mnohem menší, protože lidé volí předvídatelně.

  • Každá služba jiné heslo. Když uniknou hesla z jedné služby, útočníci je zkoušejí jinde. Správce hesel vygeneruje a zapamatuje náhodná hesla; vy si pamatujete jedno silné hlavní heslo.
  • Dvoufázové ověření (2FA) kombinuje dva různé faktory: něco, co znáte (heslo), něco, co máte (telefon, bezpečnostní klíč), nebo něco, čím jste (otisk prstu). Ukradené heslo samo nestačí.two-factor authentication
  • Přístupové klíče (passkeys, standard WebAuthn) nahrazují heslo dvojicí kryptografických klíčů vázanou na doménu služby. Na podvodné doméně nefungují, takže odolávají phishingu.

Phishing a sociální inženýrství

Varovné znaky: nátlak a spěch („do 24 hodin“), žádost o heslo, kód nebo údaje karty, odkaz na nečekanou doménu, příliš výhodná nabídka, zpráva od „banky“ nebo „kurýra“, kterou jste nečekali. Banka ani úřad po vás nikdy nebude chtít heslo nebo kód z SMS. Obrana: odkaz neotvírat, do služby se přihlásit sami (záložka, aplikace), při telefonátu zavěsit a zavolat zpět na oficiální číslo. Kód z SMS, který přišel, aniž jste o něj žádali, nikomu nesdělujte – znamená, že někdo zkouší vaše heslo.phishing, social engineering

Další návyky

  • Aktualizace opravují známé bezpečnostní chyby; instalujte je z nastavení systému nebo oficiálního obchodu s aplikacemi.
  • Zálohy podle pravidla 3-2-1: tři kopie, na dvou různých médiích, jedna mimo domov (a odpojená, aby ji nezašifroval vyděračský program).
  • Soukromí: aplikacím povolujte jen oprávnění, která potřebují; v nastavení cookies volte odmítnutí nepotřebných. Práva vůči firmám, které o vás zpracovávají údaje (přístup, oprava, výmaz), upravuje obecné nařízení EU o ochraně osobních údajů (GDPR).
  • Při podezření na podvod volejte banku na číslo z jejích oficiálních stránek nebo z platební karty a věc oznamte Policii ČR (158). Doporučení pro uživatele vydává Národní úřad pro kybernetickou a informační bezpečnost (NÚKIB).

3.8Procvičení

1
Kolikrát víc adres má IPv6 než IPv4?
\(2^{128}/2^{32} = 2^{96} \approx 7{,}9\cdot10^{28}\)krát. IPv4 má 4 294 967 296 adres, IPv6 asi \(3{,}4\cdot10^{38}\).
2
RTT je 40 ms, adresa je v mezipaměti DNS, spojení používá TCP a TLS 1.2. Kolik milisekund uplyne do prvního bajtu stránky? Kolik by to bylo s HTTP/3?
Bez DNS: TCP 1 RTT + TLS 1.2 2 RTT + HTTP 1 RTT = 4 RTT = 160 ms. S HTTP/3 (QUIC) spojí navázání spojení a šifrování do 1 RTT: 1 + 1 = 2 RTT = 80 ms.
3
Které heslo má větší entropii: 8 náhodných znaků ze všech 94 tisknutelných, nebo 4 náhodná slova ze seznamu 7 776 slov?
\(8\log_2 94 = 52{,}4\) bitu, \(4\log_2 7\,776 = 51{,}7\) bitu. Prakticky stejně; pátým slovem by heslo získalo dalších 12,9 bitu, tedy zhruba 7 776krát víc možností. Obojí platí jen pro náhodný výběr.
4
Komu patří adresa https://prihlaseni.alfabanka.example.platby-overeni.example/ucet?
Vlastníkovi domény platby-overeni.example: jméno se čte zprava, „.example“ je doména nejvyšší úrovně a „platby-overeni“ doména druhé úrovně. Vše vlevo jsou subdomény, které si vlastník pojmenuje libovolně. Odkaz s bankou Alfa nesouvisí.
5
Program potřebuje 10 000 hodnot. Ve variantě A čte každou zvlášť z SSD (100 µs na čtení), ve variantě B je má v RAM (100 ns). Kolik trvá čtení v obou variantách?
A: \(10\,000\cdot100\ \mu\text{s} = 1\) s. B: \(10\,000\cdot100\ \text{ns} = 1\) ms. Rozdíl je tisícinásobný, proto se data čtou z disku najednou a dál se s nimi pracuje v paměti.
6
Proč dvoufázové ověření kódem z SMS nechrání proti phishingu tak dobře jako přístupový klíč?
Kód z SMS si člověk přečte a může ho sám opsat do podvodné stránky; útočník ho hned použije na skutečné stránce. Přístupový klíč podepisuje výzvu spolu s doménou, na které se uživatel nachází; podpis pro podvodnou doménu na skutečné službě neplatí a prohlížeč klíč pro cizí doménu vůbec nenabídne.
Co si odnést
  • Procesor v cyklu čte a provádí instrukce uložené v paměti spolu s daty; rychlá paměť je malá, velká je pomalá.
  • Operační systém střídá procesy, odděluje jejich paměť a hlídá oprávnění.
  • Internet předává pakety; IP adresuje, TCP zajišťuje spolehlivost, DNS překládá jména, TLS šifruje a ověřuje server.
  • Bezpečnost uživatele stojí na návycích: dlouhá a různá hesla, správce hesel, druhý faktor, kontrola domény, aktualizace a zálohy.
Část IIProgramování a algoritmy
4

Programovánístřední škola

Programovat znamená zapsat algoritmus v jazyce, kterému rozumí počítač, a pak hledat, proč dělá něco jiného, než jste chtěli. Proměnné, typy, podmínky, cykly a funkce jsou ve všech běžných jazycích stejné myšlenky v různém pravopisu.

🧰

Proměnná je krabička se jmenovkou, funkce je recept, který si pojmenujete a pak jen zavoláte („udělej palačinky pro čtyři“). Rekurze je recept, který odkazuje sám na sebe: „Jak sníst kupu palačinek? Sněz jednu a pak sněz zbytek kupy. Když už žádná nezbývá, jsi hotový.“ Ta poslední věta je nejdůležitější.

Strom volání Fibonacciho funkce
Fibonacciho čísla: \(F(0) = 0\), \(F(1) = 1\), \(F(n) = F(n-1) + F(n-2)\). Přímý rekurzivní zápis počítá stejné hodnoty pořád znovu. Varianta s pamětí si spočtené výsledky ukládá. Pro \(n \le 7\) vidíte celý strom volání; oranžově jsou volání, která rovnou vrátila uložený výsledek.
LABORATOŘ
Model: počet volání funkce. Naivní verze provede \(2F(n+1)-1\) volání, verze s pamětí \(2n-1\) (pro \(n \ge 1\)). Hloubka zásobníku je v obou případech \(n\).
Collatzova posloupnost
Krátký cyklus while s nečekaně divokým chováním: je-li číslo sudé, vydělte ho dvěma, je-li liché, vynásobte třemi a přičtěte jedna. Opakujte, dokud nedostanete 1. Zda to skončí pro každé kladné celé číslo, dodnes nikdo nedokázal.
LABORATOŘ
def collatz(n):
    kroky = 0
    while n != 1:
        if n % 2 == 0:
            n = n // 2
        else:
            n = 3 * n + 1
        kroky += 1
    return kroky
Model: přesný výpočet; posloupnost je na logaritmické ose, aby byly vidět i malé hodnoty. Domněnka byla počítačově ověřena pro obrovský rozsah čísel, ale ověření není důkaz.
Minihra: najděte chybu
Šest krátkých úryvků, každý s jednou typickou chybou. Určete, o jakou jde. Po odpovědi se ukáže vysvětlení.
MINIHRA
0 / 6
+Teorie: proměnné a typy, řízení běhu, funkce, rekurze, ladění a testování

4.1Proměnné a typy

Proměnná je pojmenované místo pro hodnotu. Přiřazení x = 5 (v pseudokódu \(x \leftarrow 5\)) neznamená rovnost jako v matematice, ale příkaz „ulož do \(x\) hodnotu 5“. Proto dává smysl x = x + 1: vezmi starou hodnotu, přičti 1 a výsledek ulož zpět.variable, assignment

Každá hodnota má typ, který určuje, jaké operace s ní lze dělat: celé číslo (int), desetinné číslo (float), logická hodnota (True/False), text neboli řetězec (str), seznam či pole. Jazyky se liší tím, kdy typy kontrolují. Při statickém typování (C, Java) zná typ každé proměnné už překladač a chybu ohlásí před spuštěním. Při dynamickém typování (Python, JavaScript) se typ zjišťuje až za běhu.data type, static and dynamic typing

Jazyky se liší i tím, jak ochotně typy samy převádějí. Python je přísný: "5" + 3 skončí chybou TypeError. JavaScript převádí potichu, a výsledky pak překvapí:

Tab. 4.1Tytéž výrazy v Pythonu a JavaScriptu
VýrazPythonJavaScriptProč
"5" + 3chyba TypeError"53"JS převede číslo na text a spojí
"5" - 3chyba TypeError2odčítání textů neexistuje, JS převede text na číslo
7 / 23.53.5obyčejné dělení
celočíselně \(-7 : 2\)-7 // 2 = −4Math.trunc(-7/2) = −3Python zaokrouhluje dolů, trunc k nule
-7 % 21-1znaménko zbytku podle dělitele, resp. dělence
0.1 + 0.20.30000000000000004dvojková reprezentace (oddíl 1.4)
Pozor

Hodnota z formuláře nebo z klávesnice je vždy text. V JavaScriptu pak vek + 1 pro zadaných „17“ dá „171“. Vstup převádějte na číslo výslovně (Number(vek), v Pythonu int(vek)) a kontrolujte, že převod uspěl.

4.2Řízení běhu

Tři struktury z kapitoly 2 mají v každém jazyce svou podobu. Větvení if … elif … else, cyklus s pevným počtem opakování for, cyklus s podmínkou while. Příkaz break cyklus ukončí předčasně, continue přeskočí zbytek aktuálního průchodu. Tentýž program ve dvou jazycích:

# Python: součet sudých čísel
s = 0
for x in [3, 8, 5, 12, 7]:
    if x % 2 == 0:
        s = s + x
print(s)   # 20
// JavaScript: totéž
let s = 0;
for (const x of [3, 8, 5, 12, 7]) {
  if (x % 2 === 0) s = s + x;
}
console.log(s);  // 20

Python vyznačuje bloky odsazením, JavaScript složenými závorkami. JavaScript má dvě porovnání: == s převodem typů a === bez něj; používejte to druhé.

4.3Funkce

Funkce je pojmenovaný kus programu s parametry (vstupy) a návratovou hodnotou (výstupem). Funkce zkracují program, protože se kód nepíše dvakrát, a hlavně ho zpřehledňují: kdo volá prumer(znamky), nemusí vědět, jak se průměr počítá. Proměnné vytvořené uvnitř funkce jsou lokální: existují jen během jejího běhu a nejsou vidět zvenku. Oblasti, ve které je jméno platné, se říká rozsah platnosti.function, parameter, return value, local variable, scope

Funkce, která jen z argumentů spočítá výsledek a nic jiného nemění, se nazývá čistá. Funkce, která navíc něco vypíše, zapíše do souboru nebo změní globální proměnnou, má vedlejší efekt. Čisté funkce se snáz testují: pro stejné vstupy vždy vrátí totéž.pure function, side effect

Při každém volání si počítač na zásobník volání uloží rámec: hodnoty parametrů, lokální proměnné a místo, kam se má vrátit. Po návratu rámec odebere. Zásobník funguje jako stoh talířů: poslední přidaný se bere první (kapitola 7).call stack, stack frame

volání → fakt(3): n = 3 fakt(3): n = 3 fakt(2): n = 2 fakt(3): n = 3 fakt(2): n = 2 fakt(1): vrátí 1 2 · 1 = 2 3 · 2 = 6 dno zásobníku 1. krok2. krok3. krok: základní případ
Obr. 4.1 Zásobník volání funkce fakt(n) = n · fakt(n − 1), fakt(1) = 1. Rámce přibývají, dokud se nedojde k základnímu případu; pak se výsledky vracejí a rámce mizí v opačném pořadí.

4.4Rekurze

Rekurzivní funkce volá sama sebe na menší verzi téže úlohy. Musí mít základní případ, který se vyřeší přímo, a rekurzivní krok, který úlohu zmenší směrem k základnímu případu. Bez základního případu se funkce volá, dokud nedojde paměť na zásobníku; Python v tom případě ve výchozím nastavení skončí po 1 000 úrovních chybou RecursionError.recursion, base case

def fakt(n):
    if n <= 1:          # základní případ
        return 1
    return n * fakt(n - 1)
def fib(n, pamet={}):
    if n < 2: return n
    if n not in pamet:
        pamet[n] = fib(n-1) + fib(n-2)
    return pamet[n]

Rekurze se hodí na úlohy, které se přirozeně rozpadají na menší kopie sebe sama: procházení stromu složek, řazení slučováním (kapitola 5), hledání v bludišti. Každou rekurzi lze přepsat na cyklus se zásobníkem a naopak.

Hanojské věže

Na první tyči leží \(n\) kotoučů od největšího po nejmenší. Úkol: přenést je na třetí tyč, vždy jen jeden kotouč a nikdy větší na menší. Rekurzivní řešení: přeneste \(n-1\) horních kotoučů na pomocnou tyč, největší kotouč na cílovou a pak \(n-1\) kotoučů z pomocné na cílovou. Počet tahů splňuje \(T(n) = 2T(n-1) + 1\), \(T(1) = 1\), tedy \(T(n) = 2^{n} - 1\).Tower of Hanoi, recurrence

startpomocnácíl ① n − 1 kotoučů ② největší ③ n − 1 kotoučů
Obr. 4.2 Rekurzivní řešení Hanojských věží: dvakrát vyřešit menší úlohu (modře) a mezi tím jeden tah (oranžově). Odtud \(T(n) = 2T(n-1) + 1\).
Příklad Legenda o 64 kotoučích

Pro 10 kotoučů je třeba \(2^{10}-1 = 1\,023\) tahů. Pro 64 kotoučů z legendy \(2^{64}-1 = 18\,446\,744\,073\,709\,551\,615\) tahů; při jednom tahu za sekundu by to trvalo \(5{,}85\cdot10^{11}\) let, přes čtyřicetinásobek dosavadního stáří vesmíru. Algoritmus je přitom optimální: méně tahů nestačí.

Paměť místo opakování

Naivní rekurzivní Fibonacci počítá \(F(n-2)\) jednou přímo a jednou uvnitř \(F(n-1)\); počet volání roste zhruba jako \(1{,}618^{n}\). Pro \(n = 30\) je to 2 692 537 volání, pro \(n = 40\) už 331 160 281. Verze s pamětí (memoizací) spočítá každou hodnotu jednou: pro \(n = 40\) jen 79 volání. Obecný postup – rozložit úlohu na podúlohy, každou vyřešit jednou a výsledky skládat – se nazývá dynamické programování.memoization, dynamic programming

4.5Ladění a testování

Chyby jsou trojího druhu. Syntaktické (chybějící závorka) odhalí překladač nebo interpret ještě před spuštěním. Běhové (dělení nulou, index mimo rozsah) program za běhu shodí. Nejzrádnější jsou logické: program běží, ale počítá něco jiného.syntax error, runtime error, logic error

  1. Zopakujte chybu spolehlivě a najděte co nejmenší vstup, na kterém nastane.
  2. Vyslovte hypotézu, kde je problém, a ověřte ji: ladicím výpisem hodnot, nebo v debuggeru, kde program zastavíte na zarážce (breakpoint) a krokujete.
  3. Opravte příčinu, ne projev, a napište test, který chybu zachytí, kdyby se vrátila.
def prumer(cisla):
    return sum(cisla) / len(cisla)

# jednoduché testy: když neplatí, program ohlásí AssertionError
assert prumer([1, 2, 3]) == 2
assert prumer([5]) == 5
# prumer([]) skončí ZeroDivisionError: co má funkce vrátit pro prázdný seznam?
Ve skutečnosti

Slovo „bug“ (brouk) pro technickou závadu používali inženýři už v 19. století. Proslavila ho ale událost z 9. září 1947: tým kolem Grace Hopperové našel v reléovém počítači Mark II na Harvardu zachycenou můru a vlepil ji do provozního deníku s poznámkou o „prvním skutečném případu nalezeného brouka“. Deník je dnes ve sbírkách Smithsonian Institution.

Pomůcka

Metoda gumové kachničky: vysvětlete svůj kód řádek po řádku někomu, kdo nerozumí programování, třeba hračce na stole. Při převádění do slov si chyby všimnete sami častěji, než byste čekali.

4.6Paradigmata programování

Jazyky podporují různé styly myšlení. Imperativní program je posloupnost příkazů měnících stav (proměnné). Objektově orientovaný styl seskupuje data a funkce, které s nimi pracují, do objektů (student má jméno a umí spočítat průměr známek). Funkcionální styl skládá čisté funkce a vyhýbá se změnám stavu. Deklarativní styl popisuje, co chceme, ne jak to získat: typický příklad je SQL v kapitole 10. Python i JavaScript umožňují všechny tři první styly.imperative, object-oriented, functional, declarative programming

4.7Procvičení

1
Kolik volání funkce provede naivní rekurzivní výpočet \(F(10)\)? Kolik verze s pamětí?
Naivně \(2F(11) - 1 = 2\cdot89 - 1 = 177\) volání. S pamětí \(2\cdot10 - 1 = 19\) volání: každé \(F(k)\) pro \(k = 10, 9, \dots, 2\) se počítá jednou a druhé volání v každé úrovni vrátí uloženou hodnotu.
2
Co vypíše program: s = 0, for i in range(1, 5): s += i * i, print(s)?
range(1, 5) dává 1, 2, 3, 4 (horní mez se nezahrnuje). \(s = 1 + 4 + 9 + 16 = 30\).
3
Projděte Collatzovu posloupnost pro \(n = 6\). Kolik kroků trvá a jaké je největší číslo?
6 → 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1. Osm kroků, maximum 16.
4
Napište rekurzivní funkci pro ciferný součet přirozeného čísla. Co vrátí pro 2026?
def cs(n): return n if n < 10 else n % 10 + cs(n // 10). Základní případ je jednociferné číslo, krok odtrhne poslední cifru. \(cs(2026) = 6 + cs(202) = 6 + 2 + cs(20) = 8 + 0 + cs(2) = 10\).
5
Kolik tahů potřebují Hanojské věže s 20 kotouči? Jak dlouho by to trvalo při jednom tahu za sekundu?
\(2^{20}-1 = 1\,048\,575\) tahů, tedy \(1\,048\,575/86\,400 = 12{,}1\) dne nepřetržitého přenášení.
6
Funkce def posledni(a): return a[len(a)] má vrátit poslední prvek seznamu. Co je špatně a jak ji otestovat?
Indexy jdou od 0 do len(a) - 1, takže a[len(a)] skončí chybou IndexError (chyba o jedna). Správně a[len(a) - 1] nebo v Pythonu a[-1]. Testy: assert posledni([4, 7, 9]) == 9, assert posledni([5]) == 5 a rozhodnout, co dělat s prázdným seznamem.
Co si odnést
  • Přiřazení není rovnost; typ hodnoty určuje, co s ní lze dělat, a jazyky se liší v převodech typů.
  • Funkce s parametry a návratovou hodnotou dělí program na srozumitelné části; volání se ukládají na zásobník.
  • Rekurze potřebuje základní případ a krok, který se k němu blíží. Opakované výpočty ušetří paměť (memoizace).
  • Ladění je metoda: zopakovat, zmenšit, ověřit hypotézu, opravit příčinu, napsat test.
Část IIProgramování a algoritmy
5

Řazení a vyhledávánístřední škola

Seřadit data je jedna z nejčastějších úloh vůbec, a přitom na ní nejlépe vidět, jak velký rozdíl dělá volba algoritmu. Seřazená data se pak dají prohledávat bleskově: v milionu jmen najdete to správné na dvacet pohledů.

🃏

Když řadíte karty v ruce, berete jednu po druhé a zasouváte ji na správné místo mezi už seřazené. To je řazení vkládáním. Když hledáte slovo ve slovníku, otevřete ho uprostřed, podíváte se, jestli je hledané slovo před, nebo za, a půlku zahodíte. To je binární vyhledávání. Obojí děláte intuitivně; informatika umí spočítat, kolik vás to stojí.

Řadicí algoritmy v pohybu
Zvolte algoritmus a data a pusťte animaci. Oranžově jsou právě porovnávané prvky. Počítadla ukazují porovnání a zápisy do pole; tabulka dole srovná všechny čtyři algoritmy na stejných datech.
LABORATOŘ
Model: počítá se každé porovnání dvou prvků a každý zápis do pole (výměna jsou dva zápisy). Rychlé řazení bere za pivot poslední prvek úseku (Lomutovo dělení), slučování používá pomocné pole. Dolní mez \(\lceil\log_2 n!\rceil\) platí pro nejhorší případ každého řazení porovnáváním.
Minihra: uhodněte číslo na deset pokusů
Myslím si celé číslo od 1 do 1 000. Na každý tip odpovím „víc“, nebo „méně“. Kdo půlí interval, potřebuje nejvýš deset pokusů, protože \(2^{10} = 1\,024 \ge 1\,000\).
MINIHRA
pokus 0 / 10
Zadejte první tip. Nejlepší je začít uprostřed.
+Teorie: řazení výměnou, vkládáním, slučováním, rychlé řazení, dolní mez a binární vyhledávání

5.1Úloha řazení

Řazení uspořádá posloupnost \(a_1, \dots, a_n\) tak, aby \(a_1 \le a_2 \le \dots \le a_n\). Algoritmy porovnáváme podle počtu porovnání a přesunů v nejlepším, průměrném a nejhorším případě a podle dalších vlastností. Stabilní řazení zachová pořadí prvků se stejným klíčem (seřadíte-li žáky podle známky stabilně, zůstanou se stejnou známkou v abecedním pořadí). Řazení na místě potřebuje jen konstantní paměť navíc.sorting, stable sort, in-place

5.2Bublinkové řazení

Procházíme pole a prohazujeme sousedy ve špatném pořadí. Po prvním průchodu „vybublá“ největší prvek na konec, po druhém druhý největší a tak dál. Počet porovnání je \((n-1) + (n-2) + \dots + 1 = n(n-1)/2\); pro 10 prvků 45. Algoritmus je stabilní a na místě, ale pomalý; hodí se jako první příklad, ne do praxe.bubble sort

pro k od n−1 dolů do 1:
    pro i od 1 do k:
        když a[i] > a[i+1]: prohoď a[i], a[i+1]

5.3Řazení vkládáním

Levá část pole je seřazená. Vezmeme další prvek a posouváme ho doleva, dokud nenarazíme na menší. V nejhorším případě (obrácené pole) to stojí \(n(n-1)/2\) porovnání, v nejlepším (seřazené pole) jen \(n-1\). Počet posunů se přesně rovná počtu inverzí, tedy dvojic prvků ve špatném pořadí. Na téměř seřazených datech je proto řazení vkládáním velmi rychlé.insertion sort, inversion

Příklad Vkládání krok za krokem

Pole 5, 2, 4, 6, 1, 3. Postupně: 2 5 4 6 1 3 → 2 4 5 6 1 3 → 2 4 5 6 1 3 → 1 2 4 5 6 3 → 1 2 3 4 5 6. Celkem 12 porovnání a 9 posunů; pole má právě 9 inverzí (například 5 > 2, 5 > 4, 5 > 1…).

5.4Řazení slučováním

Metoda rozděl a panuj: pole rozdělíme na dvě poloviny, každou seřadíme (rekurzivně) a obě seřazené poloviny sloučíme: opakovaně bereme menší z dvou čel. Sloučení dvou úseků o celkové délce \(m\) stojí nejvýš \(m-1\) porovnání. Algoritmus popsal John von Neumann v roce 1945.merge sort, divide and conquer

38 27 43 3 9 82 10 38 27 43 3 9 82 10 38 27 43 3 9 82 10 27 38 3 43 9 10 82 3 27 38 43 3 9 10 27 38 43 82 děleníslučování
Obr. 5.1 Řazení slučováním sedmi čísel. Šedé úseky vznikají dělením, zelené slučováním; celkem 14 porovnání (1 + 1 + 3 + 1 + 2 + 6).

Hloubka rekurze je \(\lceil\log_2 n\rceil\) a na každé úrovni se sloučí dohromady \(n\) prvků. Odtud rekurence a výsledek:

Řazení slučováním\[T(n) = 2\,T(n/2) + n \quad\Longrightarrow\quad T(n) \approx n\log_2 n\]

Přesně je to v nejhorším případě \(n\lceil\log_2 n\rceil - 2^{\lceil\log_2 n\rceil} + 1\) porovnání: pro \(n = 8\) jde o 17, pro \(n = 1\,000\) o 8 977. Algoritmus je stabilní a jeho čas nezávisí na datech, potřebuje ale pomocné pole velikosti \(n\).

5.5Rychlé řazení

Hoare (1962) zvolil jiný postup: vybrat pivot, přeskupit pole tak, aby menší prvky byly vlevo a větší vpravo (rozdělení), a obě části seřadit rekurzivně. Sloučení odpadá, pivot už stojí na svém místě.quicksort, pivot, partition

Příklad Jedno rozdělení

Pole 7, 2, 1, 6, 8, 5, 3, 4, pivot je poslední prvek 4. Po rozdělení (7 porovnání) vznikne 2, 1, 3, 4, 8, 5, 7, 6: vlevo od pivotu jen menší, vpravo jen větší čísla. Dále se řadí zvlášť úseky 2, 1, 3 a 8, 5, 7, 6.

Při dobrém pivotu (blízko mediánu) se pole dělí napůl a čas je \(n\log n\). Průměrný počet porovnání přes všechna pořadí vstupu je \(2(n+1)H_n - 4n\), kde \(H_n = 1 + \tfrac12 + \dots + \tfrac1n\); asymptoticky \(2n\ln n \approx 1{,}39\,n\log_2 n\). Pro \(n = 1\,000\) vychází průměrně 10 986 porovnání. V nejhorším případě, když pivot je vždy nejmenší nebo největší prvek, je to \(n(n-1)/2\). Při volbě posledního prvku jako pivotu nastane nejhorší případ právě na seřazeném poli. Obrana: náhodný pivot nebo medián ze tří prvků.

Ve skutečnosti

Knihovny programovacích jazyků používají hybridy. Rychlé řazení přepne na řazení haldou, když se rekurze příliš prohloubí (introsort), a krátké úseky dořeší vkládáním. Python (a pro objekty i některé další jazyky) používá stabilní algoritmus Timsort, který v datech hledá už seřazené úseky a slučuje je; na reálných, částečně seřazených datech je proto často rychlejší než \(n\log n\).

5.6Rychleji to nejde: dolní mez

Každé řazení, které o prvcích zjišťuje informace jen porovnáváním, lze znázornit rozhodovacím stromem: v uzlech porovnání, v listech výsledná pořadí. Strom musí mít aspoň \(n!\) listů (každé pořadí vstupu vyžaduje jinou přestavbu) a binární strom s \(n!\) listy má hloubku aspoň \(\log_2 n!\). Nejhorší případ tedy potřebuje aspoň \(\lceil\log_2 n!\rceil\) porovnání.decision tree, lower bound

Dolní mez řazení porovnáváním\[\log_2 n! = n\log_2 n - n\log_2 e + O(\log n) \approx n\log_2 n - 1{,}44\,n\]

Pro 10 prvků je \(\log_2 10! = 21{,}8\), takže aspoň 22 porovnání; bublinkové řazení jich spotřebuje 45. Pro 1 000 prvků je mez 8 530 a řazení slučováním s 8 977 porovnáními v nejhorším případě je jí velmi blízko. Řazení slučováním je tedy asymptoticky optimální. Rychleji než \(n\log n\) umějí řadit jen algoritmy, které o klíčích vědí víc (například řazení počítáním pro malá celá čísla).

5.7Binární vyhledávání

V seřazeném poli hledáme hodnotu \(x\). Porovnáme ji s prostředním prvkem: je-li menší, hledáme dál jen v levé polovině, je-li větší, v pravé. Invariant: pokud \(x\) v poli je, leží v aktuálním úseku. Každý krok úsek aspoň způlí, takže stačí \(\lfloor\log_2 n\rfloor + 1\) porovnání: pro 1 000 prvků 10, pro milion 20, pro miliardu 30.binary search

1.2.3. 25812162338415662707285919599 25812162338 162338 po 1. kroku: 41 > 23, zbývá levá část2. krok: 12 < 23, zbývá pravá část 23 nalezeno ve 3. kroku oranžově prostřední prvek, modře úsek, ve kterém hledané číslo ještě může být
Obr. 5.2 Binární vyhledávání čísla 23 mezi 16 čísly. Nejvýš \(\lfloor\log_2 16\rfloor + 1 = 5\) porovnání, zde stačila tři.
def hledej(a, x):
    lo, hi = 0, len(a) - 1
    while lo <= hi:
        m = (lo + hi) // 2
        if a[m] == x: return m
        if a[m] < x: lo = m + 1
        else:        hi = m - 1
    return -1     # není v poli
Pozor

Binární vyhledávání se snadno napíše špatně: lo = m místo lo = m + 1 vede k zacyklení, < místo <= přehlédne poslední prvek. V jazycích s pevnou šířkou celých čísel přetéká výraz (lo + hi) / 2 pro velká pole; bezpečně je lo + (hi − lo) / 2. Tato chyba přežila v rozšířených knihovnách desítky let, než ji v roce 2006 popsal Joshua Bloch.

Tab. 5.1Srovnání řadicích algoritmů (počet porovnání)
Algoritmusnejlepšíprůměrnýnejhoršípaměť navícstabilní
bublinkové\(n^{2}/2\)*\(n^{2}/2\)\(n^{2}/2\)\(O(1)\)ano
vkládáním\(n\)\(n^{2}/4\)\(n^{2}/2\)\(O(1)\)ano
slučováním\(\tfrac12 n\log_2 n\)\(n\log_2 n\)\(n\log_2 n\)\(O(n)\)ano
rychlé\(n\log_2 n\)\(1{,}39\,n\log_2 n\)\(n^{2}/2\)\(O(\log n)\)ne
Řádové hodnoty pro velká \(n\). * Varianta, která skončí po průchodu bez výměny, má v nejlepším případě \(n-1\) porovnání.

5.8Procvičení

1
Kolik porovnání provede bublinkové řazení (bez předčasného ukončení) na 100 prvcích? Kolik je dolní mez pro řazení porovnáváním?
\(100\cdot99/2 = 4\,950\). Dolní mez \(\lceil\log_2 100!\rceil = 525\), protože \(\log_2 100! = 524{,}8\). Bublinkové řazení je zhruba desetkrát nad mezí.
2
Kolik porovnání nejvýš potřebuje binární vyhledávání v telefonním seznamu s 8 miliony jmen?
\(\lfloor\log_2(8\cdot10^{6})\rfloor + 1 = 22 + 1 = 23\), protože \(2^{22} = 4\,194\,304 \le 8\,000\,000 \lt 2^{23}\).
3
Seřaďte vkládáním pole 3, 1, 2. Kolik porovnání a posunů proběhne?
Vložení 1: porovnání s 3 (posun), → 1 3 2; 1 porovnání. Vložení 2: porovnání s 3 (posun), s 1 (stop) → 1 2 3; 2 porovnání. Celkem 3 porovnání a 2 posuny; pole má 2 inverze (3 > 1, 3 > 2).
4
Počítač provede \(10^{9}\) porovnání za sekundu. Jak dlouho bude řadit milion prvků bublinkově a jak dlouho slučováním?
Bublinkově \(10^{6}\cdot(10^{6}-1)/2 \approx 5\cdot10^{11}\) porovnání, tedy 500 s, přes 8 minut. Slučováním asi \(10^{6}\log_2 10^{6} \approx 2\cdot10^{7}\) porovnání, tedy 0,02 s. Rozdíl je 25 000násobný.
5
Proč je rychlé řazení s pivotem „poslední prvek“ na už seřazeném poli pomalé?
Pivot je vždy největší prvek úseku, rozdělení odštěpí jen jediný prvek a zbytek má délku \(n-1\). Hloubka rekurze je \(n\) a porovnání \((n-1) + (n-2) + \dots = n(n-1)/2\), stejně jako u bublinkového řazení. Náhodný pivot dělá tento případ extrémně nepravděpodobným.
6
Seznam žáků je seřazený podle jména. Chcete ho seřadit podle třídy tak, aby v každé třídě zůstali žáci abecedně. Jaké řazení potřebujete?
Stabilní (vkládáním, slučováním, Timsort). Stabilní řazení podle třídy zachová u žáků se stejnou třídou původní abecední pořadí. Rychlé řazení v základní podobě stabilní není.
Co si odnést
  • Jednoduché řazení (bublinkové, vkládáním) potřebuje řádově \(n^{2}\) porovnání; vkládání je ale skvělé na téměř seřazená data.
  • Rozděl a panuj: slučování a rychlé řazení zvládnou \(n\log n\), rychleji porovnáváním řadit nejde.
  • Volba pivotu rozhoduje: špatný pivot vrátí rychlé řazení na \(n^{2}\).
  • Seřazená data prohledá binární vyhledávání za \(\log_2 n\) kroků: milion prvků, dvacet porovnání.
Část IIProgramování a algoritmy
6

Složitost algoritmůstřední škola

Rychlost programu v sekundách závisí na počítači, jazyce i náhodě. Složitost algoritmu ne: popisuje, jak rychle roste počet kroků, když roste velikost vstupu. A právě růst rozhoduje. Algoritmus, který roste pomalu, porazí na velkých datech i tisíckrát rychlejší počítač.

✈️

Do sousední vesnice dojdete pěšky rychleji, než se dostanete na letiště a odbavíte. Do Austrálie už ne. U malých vstupů je jedno, jaký algoritmus zvolíte; konstanty a režie rozhodují víc. U velkých vstupů rozhoduje jen to, jak cena roste se vzdáleností – a pěšky to do Austrálie nejde, ať jste jakkoli zdatní.

Závod funkcí
Křivky ukazují počet kroků algoritmů různé složitosti v závislosti na velikosti vstupu \(n\). Na logaritmické ose je každá vodorovná čára desetkrát výš než předchozí. Tabulka dole spočítá, jak velký vstup stihne počítač za daný čas – a co by mu pomohlo tisíckrát rychlejší hardware.
LABORATOŘ
Model: algoritmus provede přesně \(f(n)\) elementárních operací (logaritmus o základu 2), každá trvá stejně. Skutečné programy mají navíc konstantní faktory a režii, na tvaru růstu to ale nic nemění.
Kolikrát se provede?
Vyberte úryvek kódu a posuňte \(n\). Počítadlo ukáže, kolikrát proběhne nejvnitřnější řádek, a graf porovná výsledek s typickými funkcemi.
LABORATOŘ
Model: počítá se, kolikrát se provede řádek x += 1. Python, rozsahy podle range.
Minihra: do které třídy patří?
Zařaďte funkce a úlohy podle rychlosti růstu. Konstanty a menší členy nerozhodují.
MINIHRA
0 / 9
+Teorie: O-notace, hierarchie růstu, rekurence, mistrovská věta a amortizace

6.1Jak měřit rychlost algoritmu

Místo sekund počítáme elementární operace: přiřazení, porovnání, aritmetiku, přístup do pole. Předpokládáme, že každá trvá konstantní dobu (model počítače RAM). Časová složitost je funkce \(T(n)\), která velikosti vstupu \(n\) přiřadí počet operací. Protože pro stejně velké vstupy se počet liší (seřazené a obrácené pole), rozlišujeme nejhorší, průměrný a nejlepší případ. Nejčastěji se uvádí nejhorší: je to záruka.time complexity, worst case, average case

6.2O-notace

Zajímá nás chování pro velká \(n\), proto zanedbáváme konstanty a menší členy. Formálně:Big O, Big Omega, Big Theta

Asymptotická notace\[\begin{aligned}f(n) = O(g(n)) &\iff \exists\, c \gt 0,\ n_0:\ \forall n \ge n_0:\ f(n) \le c\cdot g(n),\\ f(n) = \Omega(g(n)) &\iff \exists\, c \gt 0,\ n_0:\ \forall n \ge n_0:\ f(n) \ge c\cdot g(n),\\ f(n) = \Theta(g(n)) &\iff f(n) = O(g(n))\ \text{a zároveň}\ f(n) = \Omega(g(n)).\end{aligned}\]

\(O\) je horní odhad („roste nejvýš tak rychle jako“), \(\Omega\) dolní, \(\Theta\) přesný řád. Rovnítko se tu čte „patří do třídy“, není to symetrická rovnost.

n₀ c · g(n)f(n) pro všechna n ≥ n₀ platí f(n) ≤ c · g(n) tady na tom nezáleží n
Obr. 6.1 \(f(n) = O(g(n))\): od nějakého \(n_0\) dál leží \(f\) pod \(c\)-násobkem \(g\). Co se děje pro malá \(n\), definici nezajímá.
Příklad Důkaz, že \(3n^{2} + 10n + 5 = O(n^{2})\)

Zvolíme \(c = 4\). Nerovnost \(3n^{2} + 10n + 5 \le 4n^{2}\) je ekvivalentní s \(n^{2} - 10n - 5 \ge 0\), což platí pro \(n \ge 5 + \sqrt{30} \approx 10{,}48\), tedy od \(n_0 = 11\). Stejně dobře by šlo \(c = 18\), \(n_0 = 1\), protože \(3n^{2} + 10n + 5 \le 3n^{2} + 10n^{2} + 5n^{2}\). Obě volby dokazují totéž. A protože zároveň \(3n^{2} + 10n + 5 \ge 3n^{2}\), platí i \(\Theta(n^{2})\).

Pomůcka

Ve výrazu ponechte jen nejrychleji rostoucí člen a škrtněte jeho konstantu: \(5n^{3} + 100n^{2}\log n + 10^{6} = \Theta(n^{3})\). Základ logaritmu je jedno, protože \(\log_a n = \log_b n / \log_b a\) se liší jen konstantou; proto se píše prostě \(O(\log n)\).

6.3Hierarchie růstu

Pro velká \(n\) platí \(1 \prec \log n \prec \sqrt{n} \prec n \prec n\log n \prec n^{2} \prec n^{3} \prec 2^{n} \prec n! \prec n^{n}\), kde \(f \prec g\) znamená, že podíl \(f/g\) jde k nule. Algoritmy s polynomiální složitostí (\(n^{k}\)) považujeme za prakticky použitelné, exponenciální za použitelné jen pro malá \(n\). Tabulka ukazuje proč.

Tab. 6.1Doba běhu při \(10^{9}\) operacích za sekundu
\(f(n)\)\(n = 10\)\(n = 100\)\(n = 1\,000\)\(n = 10^{6}\)
\(\log_2 n\)3 ns7 ns10 ns20 ns
\(n\)10 ns100 ns1 µs1 ms
\(n\log_2 n\)33 ns664 ns10 µs20 ms
\(n^{2}\)100 ns10 µs1 ms16,7 min
\(n^{3}\)1 µs1 ms1 s31,7 let
\(2^{n}\)1 µs\(4\cdot10^{13}\) let\(3\cdot10^{284}\) let–
\(n!\)3,6 ms\(3\cdot10^{141}\) let––
Stáří vesmíru je asi \(1{,}4\cdot10^{10}\) let. Algoritmus s \(2^{n}\) kroky by pro \(n = 100\) běžel zhruba třítisíckrát déle.

6.4Algoritmus, nebo hardware?

Gordon Moore v roce 1965 předpověděl, že počet tranzistorů na čipu se bude pravidelně zdvojnásobovat (od roku 1975 uváděl zhruba každé dva roky). Výkon počítačů tak po desetiletí rostl exponenciálně. Přesto lepší algoritmus obvykle přinese víc než lepší počítač: tisíckrát rychlejší stroj zvětší zvládnutelný vstup u algoritmu \(n^{2}\) jen \(\sqrt{1\,000} \approx 31{,}6\)krát, u \(n^{3}\) desetkrát a u \(2^{n}\) jen o 10 (\(\log_2 1\,000 \approx 9{,}97\)).Moore's law

Tab. 6.2Největší \(n\), které algoritmus zvládne za hodinu
\(f(n)\)\(10^{9}\) op/s\(10^{12}\) op/s (1 000× rychleji)zlepšení
\(n\log_2 n\)\(9{,}9\cdot10^{10}\)\(7{,}8\cdot10^{13}\)791×
\(n^{2}\)1 897 36660 000 00031,6×
\(n^{3}\)15 326153 26110×
\(2^{n}\)4151+10
\(n!\)1517+2
Příklad Milion prvků

Řadit milion prvků algoritmem \(n^{2}\) znamená \(10^{12}\) operací, na počítači s \(10^{9}\) operacemi za sekundu 1 000 s, tedy 16,7 min. Algoritmus \(n\log_2 n\) potřebuje \(2\cdot10^{7}\) operací, tedy 0,02 s, i na stroji tisíckrát pomalejším by skončil za 20 s.

6.5Jak složitost určit

  • Posloupnost kroků: složitosti se sčítají a vítězí největší, \(O(n) + O(n^{2}) = O(n^{2})\).
  • Cyklus: počet průchodů krát cena těla. Vnořené cykly přes \(n\) dávají \(n\cdot n\); vnitřní cyklus „do \(i\)“ dává \(0 + 1 + \dots + (n-1) = n(n-1)/2\), tedy také \(\Theta(n^{2})\).
  • Půlení: cyklus, který \(n\) pokaždé vydělí dvěma, proběhne \(\lfloor\log_2 n\rfloor + 1\)krát; pro \(n = 1\,000\) desetkrát.
  • Rekurze vede na rekurenci, rovnici, ve které je \(T(n)\) vyjádřeno přes \(T\) menších vstupů.
n n/2 n/2 n/4n/4n/4n/4 ⋮ … n listů po 1 … n2 · n/2 = n4 · n/4 = n log₂ n úrovní
Obr. 6.2 Strom rekurze řazení slučováním. Každá úroveň dohromady zpracuje \(n\) prvků, úrovní je \(\log_2 n\), celkem \(n\log_2 n\).

Mistrovská věta (rozšíření)

Pro algoritmy „rozděl a panuj“, které úlohu velikosti \(n\) rozdělí na \(a\) podúloh velikosti \(n/b\) a rozdělení a složení stojí \(\Theta(n^{d})\), platí:master theorem

Mistrovská věta\[T(n) = a\,T(n/b) + \Theta(n^{d}) \;\Longrightarrow\; T(n) = \begin{cases}\Theta(n^{d}) & \text{je-li } d \gt \log_b a,\\ \Theta(n^{d}\log n) & \text{je-li } d = \log_b a,\\ \Theta(n^{\log_b a}) & \text{je-li } d \lt \log_b a.\end{cases}\]

Řazení slučováním: \(a = 2\), \(b = 2\), \(d = 1 = \log_2 2\), tedy \(\Theta(n\log n)\). Binární vyhledávání: \(a = 1\), \(b = 2\), \(d = 0 = \log_2 1\), tedy \(\Theta(\log n)\). Karacubovo násobení velkých čísel (1960) převádí násobení dvou \(n\)-ciferných čísel na tři násobení polovičních: \(a = 3\), \(b = 2\), \(d = 1 \lt \log_2 3\), tedy \(\Theta(n^{\log_2 3}) = \Theta(n^{1{,}585})\) místo školních \(n^{2}\).

6.6Paměť a amortizace

Paměťová složitost měří spotřebu paměti navíc ke vstupu: řazení slučováním potřebuje \(\Theta(n)\), rychlé řazení \(\Theta(\log n)\) na zásobník rekurze. Často se dá čas vyměnit za paměť, jako u memoizace v kapitole 4.space complexity, amortized analysis

Amortizovaná složitost je průměrná cena operace v nejhorší posloupnosti operací. Typický příklad je dynamické pole (seznam v Pythonu): když se zaplní, alokuje se pole dvojnásobné velikosti a prvky se zkopírují. Jednotlivé přidání tak občas stojí \(\Theta(n)\), ale při \(n\) přidáních se kopíruje nejvýš \(1 + 2 + 4 + \dots \lt 2n\) prvků. Průměrně tedy přidání stojí \(O(1)\).

6.7Procvičení

1
Určete složitost: for i in range(n): for j in range(i, n): x += 1.
Vnitřní cyklus proběhne \(n - i\)krát, celkem \(n + (n-1) + \dots + 1 = n(n+1)/2\). Složitost \(\Theta(n^{2})\).
2
Platí \(2^{n+1} = O(2^{n})\)? A \(2^{2n} = O(2^{n})\)?
\(2^{n+1} = 2\cdot2^{n}\), stačí \(c = 2\): ano. \(2^{2n} = 4^{n}\) a podíl \(4^{n}/2^{n} = 2^{n}\) roste nade všechny meze, žádná konstanta nestačí: ne.
3
Algoritmus s \(n^{3}\) operacemi zvládne za hodinu \(n = 15\,326\). Jak velké \(n\) zvládne za 8 hodin?
Čas osmkrát delší, \(n^{3}\) smí být osmkrát větší, \(n\) tedy \(\sqrt[3]{8} = 2\)krát: zhruba 30 650.
4
Vyřešte rekurenci \(T(n) = 4T(n/2) + n\) mistrovskou větou.
\(a = 4\), \(b = 2\), \(d = 1\). \(\log_2 4 = 2 \gt 1\), třetí případ: \(T(n) = \Theta(n^{2})\). Rozdělení na čtyři poloviční úlohy se nevyplatí, výsledek je stejný jako přímý kvadratický algoritmus.
5
Kolikrát proběhne tělo cyklu while n > 1: n = n // 2 pro \(n = 1\,000\,000\)?
Hodnoty 1 000 000, 500 000, 250 000, …, 3, 1: cyklus proběhne \(\lfloor\log_2 10^{6}\rfloor = 19\)krát (\(2^{19} = 524\,288 \le 10^{6} \lt 2^{20}\)).
6
Algoritmus A má \(100\,n\log_2 n\) operací, algoritmus B \(n^{2}\). Od jakého \(n\) je A rychlejší?
Hledáme \(100\log_2 n \lt n\). Pro \(n = 512\): \(100\cdot9 = 900 \gt 512\); pro \(n = 1\,024\): \(1\,000 \lt 1\,024\). Přesně od \(n = 997\) (\(100\log_2 997 = 996{,}1\)). Pro menší vstupy je B rychlejší díky menší konstantě; asymptoticky vyhrává A.
Co si odnést
  • Složitost popisuje růst počtu kroků s velikostí vstupu; konstanty a menší členy zanedbáváme.
  • \(O\) je horní odhad, \(\Omega\) dolní, \(\Theta\) přesný řád.
  • Polynomiální algoritmy škálují, exponenciální ne. Tisíckrát rychlejší počítač přidá algoritmu \(2^{n}\) jen deset prvků vstupu.
  • Rekurze vedou na rekurence; „rozděl a panuj“ řeší mistrovská věta.
Část IIIStruktury, grafy a šifry
7

Datové strukturystřední škola

Datová struktura je způsob, jak data uspořádat v paměti, aby s nimi šly rychle dělat operace, které potřebujete. Neexistuje nejlepší struktura, jen vhodná pro danou úlohu: co je u jedné zadarmo, stojí u druhé celý průchod daty.

📚

Talíře v kuchyni berete shora: poslední položený jde první (zásobník). U pokladny jde první ten, kdo přišel první (fronta). V knihovně nehledáte knihu tak, že projdete všechny regály, ale podle signatury jdete rovnou k polici (hašovací tabulka), a rodokmen kreslíte jako strom. Každá z těchto organizací se v informatice jmenuje a má spočítanou cenu.

Zásobník a fronta
Tlačítko Přidat vloží další písmeno do zásobníku i do fronty zároveň, Odebrat z obou jedno vezme. Zásobník vrací poslední vložené (LIFO), fronta první vložené (FIFO). Dole zásobník v akci: kontrola párování závorek.
LABORATOŘ
zásobník
← vrchol
frontačelo →
← konec
Model: otevírací závorku vložíme na zásobník; zavírací musí odpovídat té na vrcholu, kterou odebereme. Na konci musí být zásobník prázdný. Tak kontrolují závorky překladače i editory kódu.
Binární vyhledávací strom
Každý uzel má vlevo jen menší a vpravo jen větší hodnoty. Hledání proto sleduje jedinou cestu od kořene; trvá tolik kroků, jak je strom hluboký. Vložte stejný počet čísel náhodně a pak seřazeně a porovnejte výšku.
LABORATOŘ
Model: nevyvážený strom, hodnoty 1–99 bez opakování. Výška je počet hran na nejdelší cestě z kořene do listu; ideální (úplně vyvážený) strom s \(n\) uzly má výšku \(\lceil\log_2(n+1)\rceil - 1\).
Hašovací tabulka
Hašovací funkce převede klíč (název města) na číslo přihrádky 0 až \(m-1\). Více klíčů ve stejné přihrádce je kolize; tady se řeší řetězením do seznamu (oranžově). Zkuste malou tabulku, velkou tabulku a špatnou hašovací funkci.
LABORATOŘ
Model: kódy znaků Unicode; součet: \(h = (\sum c_i) \bmod m\); polynomiální: \(h = (\dots((c_1\cdot31 + c_2)\cdot31 + c_3)\dots) \bmod m\); první písmeno: kód prvního znaku \(\bmod m\). Klíče jsou česká města.
Minihra: kterou strukturu zvolíte?
Ke každé situaci vyberte nejvhodnější datovou strukturu.
MINIHRA
0 / 7
+Teorie: pole a seznamy, zásobník a fronta, stromy, halda, hašování, grafy

7.1Abstraktní datový typ a jeho implementace

Abstraktní datový typ říká, jaké operace s daty lze dělat (vlož, odeber, najdi), a ne, jak jsou data uložena. Datová struktura je konkrétní uspořádání v paměti, které operace implementuje. Tentýž abstraktní typ „množina“ lze implementovat polem, stromem i hašovací tabulkou, s velmi rozdílnou cenou operací.abstract data type (ADT), data structure

7.2Pole a spojový seznam

Pole ukládá prvky v paměti těsně za sebou. Adresu \(i\)-tého prvku spočítá procesor jedním násobením, proto je přístup podle indexu \(O(1)\). Vložení doprostřed ale vyžaduje posunout všechny následující prvky, \(O(n)\). Spojový seznam ukládá každý prvek zvlášť spolu s ukazatelem (adresou) na další prvek. Vložení za známý prvek je \(O(1)\) – stačí přepojit ukazatele –, ale k \(i\)-tému prvku se musíme „dokrokovat“, \(O(n)\).array, linked list, pointer

pole 73925 [0][1][2][3][4] adresa [i] = začátek + i · velikost seznam 7 3 9 2∅ uzly kdekoliv paměti
Obr. 7.1 Pole leží v paměti v jednom kuse, takže \(i\)-tý prvek najdeme výpočtem adresy. Spojový seznam je řetěz uzlů; každý zná jen adresu následníka.

Pole pevné velikosti se v praxi nahrazuje dynamickým polem (seznam v Pythonu, pole v JavaScriptu), které se při zaplnění zdvojnásobí. Přidání na konec stojí amortizovaně \(O(1)\) (oddíl 6.6). Díky souvislému uložení je pole navíc přátelské k vyrovnávací paměti procesoru (oddíl 3.2) a v praxi bývá rychlejší, než by napovídala O-notace.

7.3Zásobník a fronta

Zásobník má operace vlož na vrchol (push) a odeber z vrcholu (pop); poslední vložený prvek odchází první (LIFO). Používá se pro zásobník volání funkcí (oddíl 4.3), tlačítko Zpět, vyhodnocování výrazů a párování závorek. Fronta vkládá na konec a odebírá z čela; první vložený odchází první (FIFO). Používá se pro tiskové úlohy, zpracování požadavků na serveru a prohledávání do šířky (kapitola 8). Obě operace mají v obou strukturách složitost \(O(1)\); fronta se v poli realizuje jako kruhový buffer, kde se čelo i konec posouvají dokola.stack (LIFO), queue (FIFO), circular buffer

Příklad Závorky

Výraz ([)]: vložíme ( a [. Přijde ), ale na vrcholu je [, která k ní nepatří: chyba na pozici 3, i když počty závorek souhlasí. Výraz (a[b]{c}) projde: zásobník se zaplní na (, [, pak se [ odebere, přidá se {, odebere se } a nakonec ). Pouhé počítání závorek nestačí; je potřeba zásobník, protože poslední otevřená závorka se musí zavřít první.

7.4Stromy

Strom je hierarchická struktura: má kořen, každý uzel kromě kořene má právě jednoho rodiče a uzly bez potomků jsou listy. Hloubka uzlu je počet hran od kořene, výška stromu je největší hloubka. Stromy jsou složky na disku, struktura webové stránky (DOM), rozbor věty i rodokmen. Binární strom má u každého uzlu nejvýš dva potomky: levého a pravého.tree, root, leaf, depth, height, binary tree

Binární vyhledávací strom (BVS) splňuje invariant: všechny hodnoty v levém podstromu uzlu jsou menší než hodnota uzlu, všechny v pravém větší. Hledání, vkládání i mazání sledují jedinou cestu od kořene, stojí tedy \(O(h)\), kde \(h\) je výška. Ta je mezi \(\lceil\log_2(n+1)\rceil - 1\) (vyvážený strom; pro milion uzlů 19) a \(n - 1\) (strom zdegenerovaný v řetěz, například při vkládání seřazených hodnot). Při vkládání v náhodném pořadí je průměrná hloubka uzlu asi \(2\ln n \approx 1{,}39\log_2 n\).binary search tree (BST)

50 3070 2040 6080 3545 65 hledám 45:45 < 50 → vlevo45 > 30 → vpravo45 > 40 → vpravonalezeno: 4 porovnání průchod inorder: 20 30 35 40 45 50 60 65 70 80
Obr. 7.2 Binární vyhledávací strom vzniklý vkládáním 50, 30, 70, 20, 40, 60, 80, 35, 45, 65. Hledání jde po jediné cestě (oranžově). Průchod v pořadí levý podstrom – uzel – pravý podstrom (inorder) vypíše hodnoty seřazeně.

Vyvážené stromy po každém vložení nebo smazání strom lokálně přestaví (rotace), aby výška zůstala \(O(\log n)\). Nejstarší jsou AVL stromy (Adelson-Velskij a Landis, 1962), v knihovnách jsou běžné červeno-černé stromy. Databáze používají B-stromy s mnoha potomky v uzlu (kapitola 10).balanced tree, AVL tree, red-black tree

7.5Halda a prioritní fronta

Prioritní fronta vrací vždy prvek s nejvyšší prioritou (nejmenším klíčem): pohotovost ošetřuje nejvážnější případy, plánovač procesů nejdůležitější úlohy, Dijkstrův algoritmus nejbližší vrchol. Implementuje se binární haldou: téměř úplným binárním stromem, ve kterém je každý rodič menší nebo roven svým potomkům. Minimum je v kořeni; vložení i odebrání minima opraví haldu výměnami po jedné cestě, \(O(\log n)\). Halda se ukládá do pole bez ukazatelů: potomci prvku na indexu \(i\) jsou na indexech \(2i+1\) a \(2i+2\).priority queue, binary heap

7.6Hašovací tabulka

Hašovací tabulka ukládá dvojice klíč–hodnota do pole \(m\) přihrádek. Hašovací funkce \(h\) spočítá z klíče číslo přihrádky; dobrá funkce rozhází klíče rovnoměrně. Když dva klíče padnou do stejné přihrádky, nastane kolize. Řeší se řetězením (přihrádka drží seznam) nebo otevřeným adresováním (hledá se jiná volná přihrádka). Poměr \(\alpha = n/m\) se nazývá faktor naplnění. Při rovnoměrném hašování je průměrná délka řetězce \(\alpha\) a hledání trvá v průměru \(O(1 + \alpha)\). Když \(\alpha\) překročí mez (typicky kolem 0,75), tabulka se zvětší a klíče se přehašují.hash table, hash function, collision, chaining, load factor

Příklad Zvířata v sedmi přihrádkách

Hašovací funkce „součet kódů znaků mod 7“: pes = 112 + 101 + 115 = 328, 328 mod 7 = 6. Kočka dá 691 mod 7 = 5, myš 583 mod 7 = 2, kůň 802 mod 7 = 4, koza 437 mod 7 = 3, ovce 429 mod 7 = 2. Myš a ovce kolidují v přihrádce 2. Součet je mimochodem špatná funkce: všechny přesmyčky (kos, sok) mají stejný haš.

Narozeninový paradox

Kolize přicházejí dřív, než by se zdálo. Pravděpodobnost, že mezi \(k\) lidmi mají aspoň dva narozeniny ve stejný den (365 dní, rovnoměrně), je

Narozeninový paradox\[P(k) = 1 - \frac{365}{365}\cdot\frac{364}{365}\cdots\frac{365-k+1}{365}\]

Pro 23 lidí vychází 50,7 %, pro 50 lidí 97,0 %, pro 70 lidí 99,9 %. Obecně se první kolize v tabulce s \(m\) přihrádkami čeká už kolem \(\sqrt{m}\) klíčů. Stejná úvaha určuje, jak dlouhý musí být kryptografický haš (kapitola 9).birthday paradox

7.7Grafy

Graf \(G = (V, E)\) je množina vrcholů \(V\) a hran \(E\) mezi nimi. Hrany mohou být orientované (jednosměrky, odkazy mezi stránkami) nebo neorientované (přátelství), a ohodnocené (délka silnice). Stromy jsou zvláštní případ grafu: souvislý graf bez cyklů. Ukládá se dvojím způsobem:graph, vertex, edge, adjacency matrix, adjacency list

ABCD matice sousednosti A B C DA 0 1 1 0B 1 0 1 1C 1 1 0 0D 0 1 0 0 seznamy sousedů A: B, CB: A, C, DC: A, BD: B paměť n² bitůpaměť n + 2m položek
Obr. 7.3 Jeden graf (4 vrcholy, 4 hrany) ve dvou reprezentacích. Matice odpoví na otázku „je hrana mezi u a v?“ okamžitě; seznamy šetří paměť u řídkých grafů a rychle vyjmenují sousedy.
Příklad Řídký graf

Silniční síť s milionem křižovatek, každá má v průměru 10 sousedů. Matice sousednosti by měla \(10^{12}\) políček, i po jednom bitu 125 GB. Seznamy sousedů mají \(10^{7}\) položek, při 4 bajtech na položku asi 40 MB. Skutečné grafy (silnice, sociální sítě, web) jsou skoro vždy řídké.

Tab. 7.1Cena operací (průměrně, \(n\) prvků)
Strukturapřístup / hledánívloženísmazánípoznámka
pole (nesetříděné)\(O(1)\) index, \(O(n)\) hodnota\(O(1)\)* na konec\(O(n)\)* amortizovaně
setříděné pole\(O(\log n)\)\(O(n)\)\(O(n)\)binární vyhledávání
spojový seznam\(O(n)\)\(O(1)\)\(O(1)\)známe-li místo
zásobník, frontajen vrchol / čelo\(O(1)\)\(O(1)\)
vyvážený BVS\(O(\log n)\)\(O(\log n)\)\(O(\log n)\)udržuje pořadí
binární halda\(O(1)\) minimum\(O(\log n)\)\(O(\log n)\) minimumprioritní fronta
hašovací tabulka\(O(1)\)\(O(1)\)\(O(1)\)průměrně; nejhůř \(O(n)\), bez pořadí

7.8Procvičení

1
Do prázdného zásobníku a prázdné fronty vložíte postupně 1, 2, 3, pak jednou odeberete, vložíte 4 a dvakrát odeberete. Co vrátí zásobník a co fronta?
Zásobník: po 1, 2, 3 odebere 3, vloží 4 (obsah 1, 2, 4), odebere 4 a 2. Celkem vrátí 3, 4, 2. Fronta: odebere 1, vloží 4 (obsah 2, 3, 4), odebere 2 a 3. Celkem vrátí 1, 2, 3.
2
Do prázdného BVS vložte 8, 3, 10, 1, 6, 14, 4, 7, 13. Jaká je výška stromu a kolik porovnání stojí hledání čísla 7?
Kořen 8; vlevo 3 (s potomky 1 a 6; pod 6 jsou 4 a 7), vpravo 10 (pravý potomek 14, pod ním vlevo 13). Výška 3 (cesty 8–3–6–4, 8–3–6–7, 8–10–14–13). Hledání 7: porovnání s 8, 3, 6, 7, tedy 4.
3
Jakou výšku bude mít BVS, do kterého vložíte čísla 1, 2, …, 100 v tomto pořadí? A jakou nejmenší výšku může mít strom se 100 uzly?
Každé číslo je větší než všechna předchozí, jde vždy doprava: řetěz s výškou 99. Nejmenší možná výška je \(\lceil\log_2 101\rceil - 1 = 7 - 1 = 6\).
4
Hašovací tabulka má 1 000 přihrádek a 750 klíčů. Jaký je faktor naplnění a průměrná délka řetězce? Kolik porovnání v průměru stojí neúspěšné hledání?
\(\alpha = 750/1\,000 = 0{,}75\). Průměrná délka řetězce 0,75; neúspěšné hledání projde celý řetězec, tedy v průměru 0,75 porovnání klíčů (plus výpočet haše).
5
V haldě uložené v poli je prvek na indexu 5. Na kterých indexech jsou jeho potomci a rodič?
Potomci \(2\cdot5 + 1 = 11\) a \(2\cdot5 + 2 = 12\), rodič \(\lfloor(5-1)/2\rfloor = 2\).
6
Kolik paměti zabere matice sousednosti pro graf s 50 000 vrcholy, je-li každé políčko 1 bajt? A seznamy sousedů při 200 000 hranách a 4 bajtech na položku?
Matice \(50\,000^{2} = 2{,}5\cdot10^{9}\) B, tedy 2,5 GB. Seznamy: každá neorientovaná hrana je ve dvou seznamech, \(2\cdot200\,000\cdot4 = 1{,}6\) MB (plus malá režie na vrcholy).
Co si odnést
  • Pole má rychlý přístup podle indexu, spojový seznam rychlé vkládání; žádná struktura není nejlepší na všechno.
  • Zásobník (LIFO) a fronta (FIFO) jsou jednoduché a všudypřítomné.
  • Binární vyhledávací strom hledá za \(O(\text{výška})\); bez vyvažování může zdegenerovat na seznam.
  • Hašovací tabulka hledá v průměru za konstantní čas, kolize jsou ale nevyhnutelné a přicházejí brzy.
  • Grafy se ukládají maticí nebo seznamy sousedů; řídké grafy patří do seznamů.
Část IIIStruktury, grafy a šifry
8

Grafové algoritmystřední škola

Mapa, bludiště, síť počítačů, rozvodná síť i vztahy mezi lidmi jsou grafy. Na grafech stojí navigace, směrování paketů na internetu i plánování elektrických vedení. Čtyři základní algoritmy této kapitoly zvládnou většinu z toho.

🗺️

Když hodíte kámen do rybníka, vlna dorazí nejdřív k nejbližším stéblům, pak k vzdálenějším. Prohledávání do šířky dělá totéž: první dosažení každého místa je zároveň nejkratší cestou. Navigace v telefonu přidává jen to, že silnice mají různou délku a rychlost – a to už je Dijkstrův algoritmus.

Hledání cesty na mřížce
Klepáním nebo tažením po mřížce kreslete zdi a bahno (průchod bahnem stojí 5 místo 1). Pak spusťte algoritmus a sledujte, v jakém pořadí prozkoumává pole (modře) a jakou cestu najde (oranžově). Ve výchozí mapě vede nejkratší cesta bahnem a levnější oklikou: porovnejte BFS s Dijkstrou a Dijkstru s A*.
LABORATOŘ
Model: pohyb na čtyři sousední pole. BFS a DFS cenu polí ignorují (hledají podle počtu kroků), Dijkstra a A* počítají cenu (pole 1, bahno 5). A* používá jako odhad zbývající cesty manhattanskou vzdálenost do cíle, která skutečnou cenu nikdy nepřecení.
Minihra: nejlevnější elektrická síť
Osm obcí je třeba propojit vedením tak, aby se proud dostal všude. Čísla jsou ceny jednotlivých úseků. Vyberte úseky (klepnutím na čáru nebo na tlačítko v seznamu) tak, aby byly všechny obce propojené a celková cena co nejnižší. Podobnou úlohu řešil Otakar Borůvka v roce 1926 pro elektrifikaci Moravy.
MINIHRA
Vyberte úseky. Hledáte kostru: propojení všech obcí bez zbytečných smyček.
+Teorie: prohledávání do šířky a do hloubky, Dijkstra, A*, minimální kostra

8.1Cesty a souvislost

Cesta v grafu je posloupnost vrcholů spojených hranami, cyklus je cesta, která se vrací do výchozího vrcholu. Graf je souvislý, když mezi každými dvěma vrcholy vede cesta. Stupeň vrcholu je počet hran, které z něj vycházejí; součet stupňů všech vrcholů je \(2m\), protože každá hrana se počítá u obou konců. Teorie grafů začala Eulerovou úvahou o sedmi mostech v Královci (1736): projít každý most právě jednou nejde, protože všechny čtyři části města měly lichý počet mostů, a takový tah existuje, jen když lichý stupeň mají nejvýš dva vrcholy.path, cycle, connected graph, degree

8.2Prohledávání do šířky (BFS)

BFS začne ve výchozím vrcholu a navštěvuje vrcholy po vrstvách: nejdřív všechny ve vzdálenosti 1, pak 2 a tak dál. Pomocí fronty: z čela vezmeme vrchol, jeho dosud nenavštívené sousedy označíme a zařadíme na konec. Protože vrstvy přicházejí v pořadí vzdálenosti, první návštěva každého vrcholu proběhne po nejkratší cestě (v počtu hran). Každý vrchol i hrana se zpracují jednou, složitost je \(O(n + m)\).breadth-first search (BFS)

BFS(G, s):
    vzd[s] ← 0;  fronta ← [s]
    dokud fronta není prázdná:
        u ← odeber z čela fronty
        pro každého souseda v vrcholu u:
            když v ještě nemá vzdálenost:
                vzd[v] ← vzd[u] + 1;  před[v] ← u
                vlož v na konec fronty
0 1 2 3 4 5 6 7 8 9 1 4 5 6 8 9 10 2 3 4 6 7 9 11 3 5 7 8 10 12 4 6 7 8 9 11 13 5 6 7 8 10 11 12 14 startvlevo nahoře cílvpravo dole
Obr. 8.1 Vlna prohledávání do šířky. Číslo v poli je jeho vzdálenost od startu (pole se střídají po vrstvách), tmavá pole jsou zdi. Oranžově nejkratší cesta do cíle: 14 kroků. Cesta se zpětně rekonstruuje podle zapamatovaných předchůdců.

8.3Prohledávání do hloubky (DFS)

DFS jde co nejdál jedním směrem a teprve ve slepé uličce se vrací k poslední odbočce. Používá zásobník, nejčastěji skrytě v podobě rekurze. Najde nějakou cestu, ne nutně nejkratší. Hodí se ale na mnoho jiných úloh: zjistit, zda je graf souvislý a zda obsahuje cyklus, najít komponenty souvislosti, generovat bludiště nebo topologicky uspořádat úkoly, které na sobě závisejí (co se musí udělat dřív). Složitost je také \(O(n + m)\).depth-first search (DFS), topological sort

Pomůcka

BFS = fronta = vlna = nejkratší cesta v počtu kroků. DFS = zásobník = průzkumník s klubkem nití, který se vrací jen ze slepých uliček. Kód obou algoritmů se liší jedinou datovou strukturou.

8.4Dijkstrův algoritmus

Když mají hrany různou délku (nezápornou), nejkratší cestu najde algoritmus, který Edsger Dijkstra publikoval v roce 1959. Udržuje odhad vzdálenosti \(d(v)\) každého vrcholu; na začátku \(d(s) = 0\) a ostatní \(\infty\). Opakovaně vybere nezpracovaný vrchol s nejmenším odhadem, prohlásí ho za hotový a relaxuje jeho hrany: když \(d(u) + w(u, v) \lt d(v)\), sníží \(d(v)\). Výběr nejbližšího vrcholu zajišťuje prioritní fronta (halda, oddíl 7.5); složitost je pak \(O((n + m)\log n)\).Dijkstra's algorithm, relaxation

SABCDT 4215810262 03281012
Obr. 8.2 Dijkstrův algoritmus. Šedá čísla jsou délky hran, modrá výsledné vzdálenosti od S. Oranžově strom nejkratších cest; do T vede S – B – A – C – D – T délky 12, přestože přímá hrana S–A má délku 4.
Tab. 8.1Průběh Dijkstrova algoritmu na obr. 8.2 (odhady po zpracování vrcholu)
Krokhotový vrcholABCDT
1S (0)42∞∞∞
2B (2)3–1012∞
3A (3)––812∞
4C (8)–––1014
5D (10)––––12
6T (12)–––––
Tučně odhad, který se v daném kroku zlepšil relaxací.

Proč je to správně: když vybereme vrchol \(u\) s nejmenším odhadem, žádná jiná cesta do \(u\) nemůže být kratší, protože by musela vést přes nějaký jiný nezpracovaný vrchol s odhadem aspoň \(d(u)\) a hrany nemají zápornou délku.

Pozor

Se zápornými hranami Dijkstrův algoritmus selhává: „hotový“ vrchol by se dal později zlevnit. Pro záporné hrany slouží Bellmanův–Fordův algoritmus se složitostí \(O(nm)\), který navíc odhalí záporný cyklus (cestu, která by šla zkracovat donekonečna).

8.5A*: Dijkstra s kompasem

Algoritmus A* (Hart, Nilsson, Raphael, 1968) vybírá vrchol podle součtu \(f(v) = g(v) + h(v)\), kde \(g\) je známá cena cesty ze startu a \(h\) heuristika, odhad zbývající ceny do cíle. Je-li heuristika přípustná (nikdy nepřecení skutečnou cenu), najde A* nejkratší cestu a obvykle prozkoumá mnohem méně vrcholů než Dijkstra, protože se „táhne“ k cíli. Na mřížce se používá manhattanská vzdálenost, na mapě vzdušná čára. Při \(h = 0\) je A* totéž co Dijkstra.A* search, admissible heuristic

Ve skutečnosti

Navigační aplikace pracují s grafy o desítkách milionů vrcholů. Čistý Dijkstra by na dotaz přes celý kontinent byl pomalý, proto se graf předzpracuje: spočítají se zkratky mezi důležitými křižovatkami a hledá se z obou konců. Směrovače na internetu počítají cesty Dijkstrovým algoritmem v protokolu OSPF.

8.6Minimální kostra

Kostra souvislého grafu je podmnožina hran, která propojí všechny vrcholy a neobsahuje cyklus; má vždy \(n - 1\) hran. Minimální kostra má nejmenší součet ohodnocení. Úlohu poprvé formuloval a vyřešil brněnský matematik Otakar Borůvka (1926) při návrhu elektrické sítě na Moravě; Vojtěch Jarník (1930) v dopise Borůvkovi popsal jiný postup, který později znovu objevil Prim (1957). Kruskal (1956) přidal třetí. Všechny jsou hladové a správné díky jedné vlastnosti:minimum spanning tree (MST), Borůvka's, Jarník's (Prim's), Kruskal's algorithm

Vlastnost řezu\[\text{Rozdělíme-li vrcholy na dvě skupiny, nejlehčí hrana mezi nimi patří do minimální kostry.}\]
  • Kruskal: hrany seřadí od nejlehčí a postupně přidává každou, která nevytvoří cyklus. Cykly hlídá struktura union-find. Složitost \(O(m\log m)\), hlavně řazení.
  • Jarník (Prim): strom roste z jednoho vrcholu; vždy přidá nejlehčí hranu, která vede ze stromu ven. S haldou \(O(m\log n)\).
  • Borůvka: každá komponenta najednou přidá svou nejlehčí odchozí hranu; počet komponent se v každém kole aspoň způlí, kol je nejvýš \(\log_2 n\). Dobře se paralelizuje.
Příklad Kruskal na čtyřech vrcholech

Hrany: A–B 1, B–C 2, A–C 3, C–D 4, B–D 5. Přidáme A–B (1), B–C (2); A–C (3) by uzavřela cyklus A–B–C, přeskočíme; přidáme C–D (4). Máme \(n - 1 = 3\) hrany, kostra stojí 7. Hrana B–D (5) už se nezkoumá.

8.7Procvičení

1
Graf má 10 vrcholů a každý má stupeň 3. Kolik má hran?
Součet stupňů je \(10\cdot3 = 30 = 2m\), tedy \(m = 15\) hran.
2
V grafu na obr. 8.2 se hrana C–D prodlouží z 2 na 7. Jaká je nová nejkratší cesta z S do T a její délka?
Vzdálenosti S 0, B 2, A 3, C 8. D: min(B + 10 = 12, C + 7 = 15) = 12. T: min(C + 6 = 14, D + 2 = 14) = 14. Nejkratší cesty mají délku 14, například S – B – A – C – T.
3
Proč BFS najde na mřížce s bahnem cestu s nejmenším počtem kroků, ale ne nutně nejlevnější?
BFS prochází vrstvy podle počtu hran a cenu polí nevidí. Cesta přes bahno může mít méně kroků, ale vyšší cenu (bahno stojí 5). Nejlevnější cestu najde Dijkstra nebo A*, které vybírají podle součtu cen.
4
Kolik hran má kostra grafu se 100 vrcholy? Kolik nejvýš hran Kruskalův algoritmus přeskočí, má-li graf 300 hran?
Kostra má 99 hran. Algoritmus může skončit, jakmile jich má 99; v nejhorším případě prozkoumá všech 300 hran a přeskočí \(300 - 99 = 201\).
5
Je manhattanská vzdálenost přípustná heuristika pro mřížku, po které se smí chodit i úhlopříčně za cenu 1?
Není. Úhlopříčný krok stojí 1, ale změní obě souřadnice, takže skutečná cena může být menší než manhattanská vzdálenost (do pole o 3 vpravo a 3 dolů vedou 3 kroky, odhad říká 6). Heuristika cenu přeceňuje a A* by mohl najít delší cestu. Přípustný je Čebyševův odhad \(\max(|dx|, |dy|)\).
6
Úkoly: snídaně závisí na nákupu, nákup na penězích, vaření na nákupu, mytí nádobí na snídani i vaření. Jak je seřadit, aby každý úkol přišel po těch, na kterých závisí?
Topologické uspořádání (DFS nebo postupné odebírání úkolů bez nesplněných závislostí): peníze, nákup, snídaně, vaření, mytí nádobí (pořadí snídaně a vaření lze prohodit). Kdyby závislosti tvořily cyklus, uspořádání by neexistovalo.
Co si odnést
  • BFS (fronta) najde nejkratší cesty v počtu hran, DFS (zásobník) prozkoumá graf do hloubky; obě za \(O(n + m)\).
  • Dijkstra najde nejkratší cesty pro nezáporné délky hran; A* k tomu přidá odhad zbývající vzdálenosti.
  • Minimální kostru najdou hladové algoritmy Borůvky, Jarníka a Kruskala; dva z nich jsou česká stopa v dějinách informatiky.
Část IIIStruktury, grafy a šifry
9

Kryptografiestřední škola

Kryptografie chrání zprávy před zvědavci, padělateli a podvodníky. Dva tisíce let to byla hra důvtipu, kterou šifranti většinou prohrávali. Dnešní šifry stojí na matematických úlohách, které umíme jedním směrem spočítat snadno a opačným směrem prakticky vůbec – a na zásadě, že tajný má být jen klíč.

🔐

Představte si visací zámek, který zaklapne každý, ale otevře jen majitel klíče. Rozdáte otevřené zámky celému světu; kdo vám chce poslat tajnou zprávu, zamkne ji do krabičky vaším zámkem. Nikdo jiný ji neotevře, ani odesílatel. Tak funguje šifrování veřejným klíčem, bez kterého by nešlo bezpečně nakupovat ani se přihlásit k bance.

Caesarova šifra a frekvenční analýza
Caesar posouval každé písmeno abecedy o stejný počet míst. Zvolte posun a sledujte šifrový text. Pak klepněte na Prolomit: program zkusí všech 25 posunů a vybere ten, po kterém četnosti písmen nejvíc připomínají češtinu.
LABORATOŘ
Klepněte na Prolomit.
Model: diakritika se odstraní, šifrují se jen písmena A–Z. Sloupce jsou četnosti písmen šifrového textu, oranžové čárky četnosti, které by měla čeština při zvoleném posunu. Referenční četnosti písmen jsou spočítané z textu kapitol 1–8 tohoto průvodce (přes 33 000 písmen bez diakritiky). Shodu měří statistika \(\chi^{2} = \sum (O - E)^{2}/E\): čím menší, tím víc se rozložení podobá češtině.
Minihra: přečtěte tajnou zprávu
Zpráva je zašifrovaná Caesarovou šifrou s neznámým posunem. Hledejte posun ručně; nápověda: nejčastější písmeno šifrového textu bude nejspíš E, A nebo O.
MINIHRA
RSA na malých číslech
Zvolte dvě prvočísla. Program spočítá veřejný klíč \((n, e)\) a soukromý klíč \(d\), zašifruje zprávu \(m\) (číslo menší než \(n\)) a zase ji rozšifruje. Dole tentýž klíč podepisuje: podpis vytvoří jen držitel \(d\), ověří ho kdokoli s \(e\).
LABORATOŘ
Model: učebnicové RSA bez doplňování (paddingu) s prvočísly do 100. Skutečné klíče mají modul aspoň 2 048 bitů (přes 600 desítkových číslic) a zprávy se před šifrováním doplňují náhodností; bez toho by RSA bylo nebezpečné. Ukázka slouží jen k pochopení principu.
+Teorie: klasické šifry, AES, hašovací funkce, Diffie–Hellman, RSA, podpis a certifikáty

9.1Co kryptografie chrání

Kryptografie zajišťuje čtyři vlastnosti: důvěrnost (zprávu přečte jen oprávněný), integritu (změna zprávy se pozná), autenticitu (víme, kdo zprávu poslal) a nepopiratelnost (odesílatel nemůže zapřít, že zprávu podepsal). Otevřený text se pomocí klíče převádí na šifrový text. Auguste Kerckhoffs v roce 1883 formuloval zásadu, která platí dodnes: systém má zůstat bezpečný, i když nepřítel zná vše kromě klíče. Utajený algoritmus není ochrana, jen odklad.confidentiality, integrity, authenticity, non-repudiation, Kerckhoffs's principle

Pozor

Kapitola vykládá principy a obranu. Vlastní šifrovací algoritmy pro skutečné použití nepište: i drobná chyba v implementaci (časování, generátor náhodných čísel, opakovaný klíč) bývá fatální. Používejte ověřené knihovny a protokoly.

9.2Klasické šifry a jejich pád

Caesarova šifra posune každé písmeno o \(k\) míst: \(c = (m + k) \bmod 26\). Klíčů je jen 25, takže se dá vyzkoušet všechny. Obecná záměna (každé písmeno nahradí jiné podle tabulky) má \(26! \approx 4{,}03\cdot10^{26}\) klíčů, přesto padne frekvenční analýzou, kterou v 9. století popsal arabský učenec al-Kindí: v každém jazyce jsou některá písmena častější (v textu tohoto průvodce E 9,7 %, A 9,1 %, O 8,7 %), a záměna písmen rozložení četností nezmění, jen ho přejmenuje.Caesar cipher, substitution cipher, frequency analysis

Vigenèrova šifra (16. století) střídá několik posunů podle klíčového slova a jednoduchou frekvenční analýzu odolá; v 19. století ji prolomil Kasiski hledáním opakování. Šifrovací stroj Enigma z druhé světové války měl astronomický počet nastavení, přesto ho prolomili polští matematici v čele s Marianem Rejewskim (1932) a pak tým v Bletchley Parku včetně Alana Turinga – díky chybám v provozu a matematice permutací.

Jedinou dokazatelně nerozluštitelnou šifrou je jednorázová tabulka (one-time pad): klíč je stejně dlouhý jako zpráva, zcela náhodný a použije se jen jednou; šifruje se operací XOR. Shannon (1949) dokázal, že šifrový text pak o zprávě neprozradí nic. Nevýhoda je zřejmá: předat tak dlouhý klíč bezpečně je stejně těžké jako předat samotnou zprávu.one-time pad, perfect secrecy

9.3Symetrické šifry: AES

V symetrické kryptografii mají odesílatel i příjemce stejný tajný klíč. Dnešním standardem je AES (norma FIPS 197 z roku 2001, algoritmus Rijndael belgických autorů Daemena a Rijmena). Šifruje bloky po 128 bitech klíčem o délce 128, 192 nebo 256 bitů; v mnoha kolech střídá záměnu bajtů, přeskupení a míchání s klíčem. AES je rychlý (procesory na něj mají instrukce) a šifruje disky, Wi-Fi i obsah spojení TLS.symmetric encryption, AES, block cipher

Příklad Kolik let hrubou silou

Klíč o 128 bitech má \(2^{128} \approx 3{,}4\cdot10^{38}\) možností. Kdyby útočník zkoušel bilion (\(10^{12}\)) klíčů za sekundu, prošel by celý prostor za \(1{,}1\cdot10^{19}\) let, průměrně za polovinu. Pro srovnání: starší šifra DES s 56bitovým klíčem padne stejnou rychlostí za \(2^{56}/10^{12} = 72\,058\) s, tedy za 20 hodin. Délka klíče rozhoduje exponenciálně.

Blokovou šifru je třeba použít ve vhodném režimu. Nejjednodušší režim, šifrovat každý blok zvlášť (ECB), prozradí opakující se vzory. Dnes se používá autentizované šifrování (například AES-GCM), které současně zajistí důvěrnost i integritu.

9.4Hašovací funkce

Kryptografická hašovací funkce převede libovolně dlouhá data na otisk pevné délky (SHA-256: 256 bitů). Musí být jednosměrná (z otisku nejde najít vstup), odolná vůči kolizím (nejde najít dva vstupy se stejným otiskem) a mít lavinový efekt: změna jediného bitu vstupu změní zhruba polovinu bitů otisku.cryptographic hash function, preimage resistance, collision resistance, avalanche effect

Příklad Lavinový efekt SHA-256

SHA-256("abc") = ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad (testovací vektor normy FIPS 180).
SHA-256("abd") = a52d159f262b2c6ddb724a61840befc36eb30c88877a4030b65cbe86298449c9.
Vstupy se liší posledním písmenem, otisky ve 122 bitech z 256, tedy téměř přesně v polovině.

Kvůli narozeninovému paradoxu (oddíl 7.6) stačí na nalezení kolize u \(n\)-bitového haše zhruba \(2^{n/2}\) pokusů; proto se používají haše aspoň 256bitové. Starší funkce MD5 a SHA-1 jsou prolomené: pro SHA-1 byla v roce 2017 veřejně předvedena kolize dvou různých dokumentů PDF. Platnými standardy jsou SHA-2 (FIPS 180-4) a SHA-3 (FIPS 202).

Jak bezpečně ukládat hesla

Služba nemá znát vaše heslo; ukládá jen jeho otisk a při přihlášení porovná otisk zadaného hesla. Ke každému heslu přidá náhodnou sůl, aby stejná hesla měla různé otisky, a použije záměrně pomalou funkci (Argon2 podle RFC 9106, bcrypt, PBKDF2), která i po úniku databáze zpomalí hádání na tisíce pokusů za sekundu místo miliard. To je rozdíl, se kterým počítala laboratoř v kapitole 3.salt, password hashing, key stretching

9.5Asymetrická kryptografie

Symetrická šifra má jeden zásadní problém: jak si klíč předat, když zatím nemáme bezpečný kanál? Řešení publikovali Whitfield Diffie a Martin Hellman v roce 1976: dvě strany se mohou na tajném čísle dohodnout veřejně, protože některé matematické operace jdou snadno jedním směrem a prakticky ne zpět. Umocnit číslo modulo prvočíslo je snadné; z výsledku zjistit exponent (diskrétní logaritmus) pro velká čísla neumíme.public-key cryptography, Diffie–Hellman key exchange, discrete logarithm

Příklad Diffie–Hellman na malých číslech

Veřejně dohodnuto: prvočíslo \(p = 23\), základ \(g = 5\). Alice si tajně zvolí \(a = 6\) a pošle \(A = 5^{6} \bmod 23 = 8\). Bob zvolí \(b = 15\) a pošle \(B = 5^{15} \bmod 23 = 19\). Alice spočítá \(19^{6} \bmod 23 = 2\), Bob \(8^{15} \bmod 23 = 2\). Oba mají společné tajemství 2, přestože po síti šla jen čísla 23, 5, 8 a 19.

Bobzpráva m šifrujveřejný klíč Alice c dešifrujsoukromý klíč Alice Alicem veřejný klíč smí znát celý svět soukromý klíč nikdy neopustí Alici kdo odposlouchává kanál, vidí jen šifrový text c
Obr. 9.1 Šifrování veřejným klíčem. Klíče tvoří pár: co se zašifruje veřejným, rozšifruje jen soukromý. V praxi se takto předá jen náhodný klíč pro rychlou symetrickou šifru (hybridní šifrování).

RSA

Rivest, Shamir a Adleman popsali v roce 1977 (publikováno 1978) systém, ve kterém má každý pár klíčů. Bezpečnost stojí na tom, že vynásobit dvě velká prvočísla je snadné, ale rozložit jejich součin zpět na činitele neumíme.RSA, integer factorization

  1. Zvolíme dvě různá prvočísla \(p, q\) a spočítáme \(n = pq\) a \(\varphi(n) = (p-1)(q-1)\).
  2. Zvolíme \(e\) nesoudělné s \(\varphi(n)\) a najdeme \(d\) tak, aby \(e\cdot d \equiv 1 \pmod{\varphi(n)}\) (rozšířeným Euklidovým algoritmem, kapitola 2).
  3. Veřejný klíč je \((n, e)\), soukromý \(d\). Šifrování \(c = m^{e} \bmod n\), dešifrování \(m = c^{d} \bmod n\).
Proč to funguje\[c^{d} = m^{ed} = m^{1 + k\varphi(n)} = m\cdot\big(m^{\varphi(n)}\big)^{k} \equiv m \pmod n\]

Poslední krok plyne z Eulerovy věty \(m^{\varphi(n)} \equiv 1 \pmod n\) pro \(m\) nesoudělné s \(n\) (platí i pro ostatní \(m \lt n\), jak se ověří přes čínskou větu o zbytcích). Kdo zná \(p\) a \(q\), spočítá \(\varphi(n)\) a z \(e\) snadno \(d\). Kdo zná jen \(n\), musí \(n\) nejdřív rozložit.

Příklad RSA s p = 61, q = 53

\(n = 3\,233\), \(\varphi(n) = 60\cdot52 = 3\,120\). Zvolíme \(e = 17\) (nesoudělné s 3 120). Inverze: \(d = 2\,753\), protože \(17\cdot2\,753 = 46\,801 = 15\cdot3\,120 + 1\). Zpráva \(m = 65\): \(c = 65^{17} \bmod 3\,233 = 2\,790\). Dešifrování: \(2\,790^{2\,753} \bmod 3\,233 = 65\). Mocniny se počítají opakovaným umocňováním na druhou, takže i exponent s 600 číslicemi stojí jen pár tisíc násobení.

9.6Digitální podpis a certifikáty

Digitální podpis obrací role klíčů: podepisuje se soukromým klíčem, ověřuje veřejným. Podepisuje se otisk dokumentu: \(s = h(M)^{d} \bmod n\). Ověřovatel spočítá \(s^{e} \bmod n\) a porovná s otiskem \(h(M)\), který si sám vypočte z dokumentu. Shoda dokazuje, že dokument podepsal držitel soukromého klíče (autenticita, nepopiratelnost) a že se od podpisu nezměnil (integrita).digital signature

dokument haš h(M) podepišsoukromý klíč podpis s příjemce: dokument haš h(M) ověř: sᵉ mod nveřejný klíč shodují se?
Obr. 9.2 Digitální podpis. Podepsat umí jen držitel soukromého klíče, ověřit kdokoli s veřejným klíčem. Změna jediného znaku dokumentu změní haš a ověření selže.

Zbývá otázka, komu veřejný klíč patří. Odpovídá na ni certifikát: dokument „tento veřejný klíč patří doméně skola.example“ podepsaný certifikační autoritou, jejíž veřejný klíč má prohlížeč předinstalovaný. Řetěz podpisů od kořenové autority k serveru tvoří infrastrukturu veřejných klíčů (PKI). Na stejném principu stojí zaručený elektronický podpis, který v EU upravuje nařízení eIDAS (č. 910/2014).certificate, certificate authority, public key infrastructure (PKI)

9.7Kvantové počítače a postkvantová kryptografie

Peter Shor (1994) ukázal, že dostatečně velký kvantový počítač by rozložil čísla na prvočinitele i spočítal diskrétní logaritmus v polynomiálním čase. RSA i Diffie–Hellman (včetně variant na eliptických křivkách) by pak padly. Symetrické šifry ohrožuje Groverův algoritmus jen tak, že efektivně půlí délku klíče; AES-256 zůstává bezpečný. Takový kvantový počítač zatím neexistuje, ale data zachycená dnes by mohla být rozšifrována později. Americký úřad NIST proto v srpnu 2024 vydal první normy postkvantové kryptografie (FIPS 203, 204 a 205), založené na úlohách, pro které kvantový algoritmus neznáme, například na mřížkách.Shor's algorithm, post-quantum cryptography

9.8Procvičení

1
Zašifrujte slovo AHOJ Caesarovou šifrou s posunem 3 a rozšifrujte DKRM s posunem 3.
A→D, H→K, O→R, J→M: DKRM. Zpět posunem o 3 doleva: D→A, K→H, R→O, M→J: AHOJ.
2
RSA s \(p = 5\), \(q = 11\), \(e = 3\). Spočítejte \(n\), \(\varphi(n)\), \(d\) a zašifrujte \(m = 7\).
\(n = 55\), \(\varphi(n) = 4\cdot10 = 40\). \(d = 27\), protože \(3\cdot27 = 81 = 2\cdot40 + 1\). \(c = 7^{3} \bmod 55 = 343 \bmod 55 = 13\). Kontrola: \(13^{27} \bmod 55 = 7\).
3
Diffie–Hellman s \(p = 23\), \(g = 5\), Alice volí \(a = 4\), Bob \(b = 3\). Co si pošlou a jaké mají společné tajemství?
\(A = 5^{4} \bmod 23 = 625 \bmod 23 = 4\). \(B = 5^{3} \bmod 23 = 125 \bmod 23 = 10\). Alice: \(10^{4} \bmod 23 = 10\,000 \bmod 23 = 18\). Bob: \(4^{3} \bmod 23 = 64 \bmod 23 = 18\). Tajemství 18.
4
Hašovací funkce má 64bitový výstup. Zhruba kolik náhodných vstupů je třeba vyzkoušet, než se s pravděpodobností kolem 50 % objeví kolize?
Podle narozeninového paradoxu řádově \(\sqrt{2^{64}} = 2^{32} \approx 4{,}3\cdot10^{9}\) (přesněji \(1{,}18\cdot2^{32} \approx 5{,}1\cdot10^{9}\)). Pro počítač je to otázka minut, proto se 64bitové haše pro bezpečnost nepoužívají.
5
Proč služba ukládá hesla s náhodnou solí? Co by se stalo bez ní?
Bez soli mají stejná hesla stejný otisk: po úniku databáze útočník jedním výpočtem otisku vyzkouší heslo proti všem účtům najednou a pozná uživatele se stejným heslem; předpočítané tabulky otisků běžných hesel by fungovaly okamžitě. Sůl udělá z každého účtu samostatnou úlohu.
6
Alice podepíše dokument a pošle ho Bobovi. Který klíč použije Alice a který Bob? Co Bob zjistí, když po cestě někdo změní jedno slovo?
Alice podepisuje svým soukromým klíčem, Bob ověřuje veřejným klíčem Alice (ideálně z certifikátu). Po změně slova vyjde Bobovi jiný haš dokumentu, než jaký vrátí ověření podpisu; ověření selže a Bob ví, že dokument není ten, který Alice podepsala.
Co si odnést
  • Tajný má být jen klíč (Kerckhoffs). Klasické šifry padly na frekvenční analýze, ne na počtu klíčů.
  • Symetrické šifry (AES) jsou rychlé, ale klíč je třeba předat; asymetrické (RSA, Diffie–Hellman) řeší předání klíče matematikou jednosměrných funkcí.
  • Haš je otisk dat: jednosměrný, odolný vůči kolizím. Hesla se ukládají jen jako solené pomalé otisky.
  • Podpis = haš podepsaný soukromým klíčem; certifikát svazuje veřejný klíč se jménem.
Část IVTeorie a praxe
10

Databáze a datavysoká škola

Za rozvrhem, e-shopem, bankovním účtem i elektronickou žákovskou knížkou stojí databáze. Relační model z roku 1970 do ní přinesl matematiku: data jsou tabulky, dotaz je výraz nad nimi a databázový systém sám vymyslí, jak ho spočítat co nejrychleji.

🗄️

Školní kartotéka: v jedné krabici karty žáků, v druhé předměty, ve třetí známky, kde je jen číslo žáka, číslo předmětu a známka. Žádný údaj není zapsaný dvakrát, a přesto z krabic poskládáte cokoli: „průměr z matematiky ve 3.A“ nebo „kdo nemá žádnou známku z fyziky“. SQL je jazyk, kterým o takovou sestavu požádáte.

Mini SQL nad školní databází
Tři tabulky: studenti(id, jmeno, trida, rok), predmety(id, nazev) a znamky(student_id, predmet_id, znamka). Napište dotaz SELECT nebo vyberte ukázku. Pod laboratoří jsou tři úkoly; za jejich splnění jsou body.
LABORATOŘ
–
Model: vlastní interpret podmnožiny SQL: SELECT [DISTINCT], sloupce a agregace COUNT, SUM, AVG, MIN, MAX s AS; FROM s aliasy; [LEFT] JOIN … ON; WHERE s =, <>, <, >, LIKE, IS NULL, AND, OR, NOT; GROUP BY, HAVING, ORDER BY … DESC, LIMIT. Spojení se počítá vnořenými cykly přes všechny dvojice řádků, bez indexů.
Minihra: tři dotazy
Napište dotaz do laboratoře nahoře, spusťte ho a pak klepněte na „Zkontrolovat“ u úkolu. Na pořadí sloupců záleží, na názvech ne.
MINIHRA
0 / 3
Index, nebo procházet všechno?
Tabulka má \(n\) řádků uložených na stránkách disku po 100 řádcích. Bez indexu je třeba přečíst všechny stránky; B-strom s větvením \(f\) najde řádek po přečtení jedné stránky na každé úrovni.
LABORATOŘ
Model: čtení jedné stránky trvá 0,1 ms (náhodné čtení z SSD), procházení celé tabulky čte stránky po sobě a je proto 10× rychlejší na stránku. Hloubka B-stromu \(\lceil\log_f n\rceil\). Horní úrovně stromu bývají v paměti, takže skutečnost je ještě příznivější.
+Teorie: relační model, relační algebra, SQL, NULL, normalizace, indexy a transakce

10.1Proč databáze

Databázový systém (DBMS) spravuje data trvale, umožní k nim přístup mnoha uživatelům najednou, hlídá pravidla (každá známka patří existujícímu žákovi) a odpovídá na dotazy. Aplikace neřeší, jak jsou data uložena na disku; to je datová nezávislost. Změny se provádějí v transakcích s vlastnostmi ACID (Härder a Reuter, 1983): atomičnost (provede se celá, nebo vůbec), konzistence (zachová pravidla), izolovanost (souběžné transakce se navzájem neruší) a trvanlivost (potvrzená změna přežije i výpadek proudu).database management system, transaction, ACID

Příklad Převod peněz

Převod 1 000 Kč z účtu A na účet B jsou dvě změny: A − 1 000 a B + 1 000. Kdyby systém po první změně spadl, peníze by zmizely. Transakce zaručí, že po obnovení se buď provedou obě, nebo žádná (atomičnost), a že souběžný převod ze stejného účtu neuvidí rozpracovaný stav (izolovanost).

10.2Relační model

Edgar F. Codd (1970) navrhl ukládat data jako relace: tabulky, jejichž řádky (n-tice) jsou množinou a sloupce (atributy) mají doménu přípustných hodnot. Primární klíč jednoznačně určuje řádek (studenti.id). Cizí klíč odkazuje na primární klíč jiné tabulky (znamky.student_id → studenti.id); databáze hlídá, aby odkaz vedl na existující řádek (referenční integrita).relation, tuple, attribute, primary key, foreign key, referential integrity

studenti id 🔑jmenotridarok znamky student_id →predmet_id →znamka predmety id 🔑nazev 8 řádků20 řádků, klíč (student_id, predmet_id)4 řádky
Obr. 10.1 Schéma databáze z laboratoře. Oranžově primární klíče, modře cizí klíče; šipka ukazuje, kam odkaz vede. Tabulka známek je vazební: spojuje žáky s předměty v poměru mnoho k mnoha.

10.3Relační algebra

Dotazy nad relacemi lze skládat z několika operací, jejichž výsledkem je opět relace. Selekce \(\sigma_{p}(R)\) vybere řádky splňující podmínku \(p\); projekce \(\pi_{A}(R)\) ponechá sloupce \(A\); kartézský součin \(R \times S\) spojí každý řádek \(R\) s každým řádkem \(S\); spojení \(R \bowtie_{p} S = \sigma_{p}(R \times S)\); dále sjednocení, rozdíl a přejmenování. SQL je nad touto algebrou uživatelsky přívětivý jazyk a databáze dotaz do algebry přeloží a přestaví do co nejlevnější podoby (optimalizace dotazu).relational algebra, selection, projection, join, query optimization

Příklad\[\pi_{\text{jmeno}}\Big(\sigma_{\text{nazev} = \text{'Fyzika'} \,\wedge\, \text{znamka} = 4}\big(\text{studenti} \bowtie \text{znamky} \bowtie \text{predmety}\big)\Big) = \{\text{Cyril}\}\]

10.4SQL

SQL (norma ISO/IEC 9075, poslední verze SQL:2023) je deklarativní: popisuje, jaký výsledek chceme, ne jak ho spočítat. Má část pro definici dat (CREATE TABLE), pro změny dat (INSERT, UPDATE, DELETE) a dotaz SELECT. Klauzule dotazu se píší v jiném pořadí, než v jakém se logicky vyhodnocují:SQL, declarative language

FROMWHEREGROUP BYHAVINGSELECTORDER BYLIMIT řádky a spojenískupiny a jejich filtrsloupcepořadí a počet
Obr. 10.2 Logické pořadí vyhodnocení dotazu. Proto v WHERE nelze použít agregaci (skupiny ještě neexistují) a podmínka na skupiny patří do HAVING.
SELECT p.nazev, AVG(z.znamka) AS prumer, COUNT(*)
FROM predmety p JOIN znamky z ON p.id = z.predmet_id
GROUP BY p.nazev
ORDER BY prumer;
Tab. 10.1Výsledek dotazu: průměrná známka podle předmětu
nazevprumerCOUNT(*)
Informatika1,676
Dějepis2,003
Matematika2,297
Fyzika2,504

Spojení a NULL

Vnitřní spojení (JOIN) vrátí jen dvojice řádků, které splní podmínku ON. Levé vnější spojení (LEFT JOIN) vrátí navíc každý řádek levé tabulky, který žádný protějšek nemá, a chybějící hodnoty doplní hodnotou NULL („neznámá / chybí“). NULL se chová zvláštně: jakékoli porovnání s ní dá výsledek neznámo, ne pravda ani nepravda (tříhodnotová logika). Proto WHERE x = NULL nevrátí nic a správně se píše WHERE x IS NULL.inner join, left outer join, NULL, three-valued logic

Příklad Kdo nemá známku z fyziky

SELECT s.jmeno FROM studenti s LEFT JOIN znamky z ON s.id = z.student_id AND z.predmet_id = 3 WHERE z.znamka IS NULL vrátí Báru, Danu, Filipa a Gitu. Vnitřní spojení by tyto žáky vůbec neukázalo.

Pozor

COUNT(*) počítá řádky, COUNT(sloupec) jen řádky, kde sloupec není NULL. Po LEFT JOIN je rozdíl zásadní: žák bez známky má jeden řádek s NULL, takže COUNT(*) dá 1, ale COUNT(z.znamka) správně 0.

10.5Normalizace

Tabulka, která ukládá stejný fakt vícekrát, trpí anomáliemi. Představte si jedinou tabulku vysvedceni(jmeno, trida, tridni_ucitel, predmet, znamka): změna třídního učitele 3.A se musí provést v mnoha řádcích (aktualizační anomálie, stačí jeden přehlédnout a data si odporují); smazáním poslední známky žáka zmizí i informace, do které třídy chodí (mazací anomálie); novou třídu nejde zapsat, dokud v ní není žák se známkou (vkládací anomálie).normalization, update/delete/insert anomaly

Příčinou je funkční závislost \(X \to Y\) („hodnota \(X\) určuje hodnotu \(Y\)“), jejíž levá strana není klíčem: trida → tridni_ucitel. Normální formy takové závislosti postupně odstraňují:

  • 1NF: hodnoty jsou atomické (žádné seznamy známek v jedné buňce).
  • 2NF: 1NF a žádný neklíčový atribut nezávisí jen na části složeného klíče.
  • 3NF: 2NF a žádný neklíčový atribut nezávisí na jiném neklíčovém atributu (tranzitivně).
  • BCNF: levá strana každé netriviální funkční závislosti je nadklíč.

Rozklad vysvedceni na studenti(id, jmeno, trida), tridy(trida, tridni_ucitel), predmety(id, nazev) a znamky(student_id, predmet_id, znamka) je v BCNF: každý fakt je uložen jednou a původní tabulku vrátí spojení. V analytických databázích se naopak někdy záměrně denormalizuje, aby čtení nemuselo spojovat tabulky.

10.6Indexy

Bez indexu musí databáze najít řádky s jmeno = 'Dana' průchodem celé tabulky. Index je pomocná struktura, nejčastěji B-strom (Bayer a McCreight, 1972): vyvážený strom, jehož uzel zabírá celou stránku disku a má stovky potomků. Při větvení 200 má strom pro \(10^{8}\) řádků hloubku \(\lceil\log_{200}10^{8}\rceil = 4\), binární strom by měl 27 úrovní. Index zrychlí hledání, spojování a řazení podle indexovaného sloupce, ale zpomalí zápisy (každý INSERT a UPDATE musí upravit i index) a zabere místo.index, B-tree

Dana | Hana Bára | Cyril Emil | Gita Hana | … AdamBáraCyrilDanaEmil, FilipGitaHana …
Obr. 10.3 B-strom nad sloupcem jmeno (zjednodušeně, větvení 3). Klíče v uzlu rozdělují rozsah hodnot; hledání čte jeden uzel na každé úrovni. Skutečné uzly mají stovky klíčů, takže i miliarda řádků vystačí se čtyřmi až pěti úrovněmi.

10.7Bezpečnost a další modely dat

Hodnoty zadané uživatelem se nikdy nesmějí vkládat do textu dotazu skládáním řetězců: kdo by do formuláře napsal kus SQL, mohl by změnit význam dotazu (SQL injection, jedna z nejčastějších zranitelností webů). Obranou jsou parametrizované dotazy, kde se dotaz a data posílají databázi odděleně, a oprávnění, která aplikaci dovolí jen to, co nutně potřebuje.SQL injection, parameterized query

# správně: hodnota jde odděleně jako parametr, nikdy ne vlepená do textu dotazu
cur.execute("SELECT jmeno FROM studenti WHERE trida = ?", (trida,))

Pro data, která se do tabulek nehodí, vznikly databáze NoSQL: dokumentové (záznamy jako stromy JSON), klíč–hodnota (obří hašovací tabulky), grafové (vztahy jako hrany) a sloupcové pro analytiku. Distribuované databáze naráží na větu CAP (Brewer 2000, důkaz Gilbert a Lynch 2002): při výpadku spojení mezi servery musí systém volit mezi konzistencí a dostupností. Statistické zpracování velkých dat rozebírá průvodce Statistika a modely.NoSQL, CAP theorem

10.8Procvičení

1
Napište dotaz, který vypíše jména a ročníky narození žáků narozených před rokem 2009, seřazené podle roku a jména. Co vrátí?
SELECT jmeno, rok FROM studenti WHERE rok < 2009 ORDER BY rok, jmeno. Výsledek: Filip 2007, Bára 2008, Emil 2008, Hana 2008.
2
Kteří žáci mají z nějakého předmětu čtyřku a z jakého?
SELECT s.jmeno, p.nazev FROM studenti s JOIN znamky z ON s.id = z.student_id JOIN predmety p ON p.id = z.predmet_id WHERE z.znamka = 4. Cyril z fyziky a Emil z matematiky.
3
Jaký je průměr všech známek v jednotlivých třídách?
SELECT s.trida, AVG(z.znamka) FROM studenti s JOIN znamky z ON s.id = z.student_id GROUP BY s.trida. 3.A: 13/8 = 1,625; 3.B: 12/5 = 2,4; 4.A: 17/7 = 2,43.
4
Které třídy mají aspoň tři žáky a jaký je jejich průměrný rok narození?
SELECT trida, AVG(rok) FROM studenti GROUP BY trida HAVING COUNT(*) >= 3. 3.A: (2009 + 2008 + 2009)/3 = 2 008,67; 4.A: (2008 + 2007 + 2008)/3 = 2 007,67. Třída 3.B má jen dva žáky a vypadne v HAVING.
5
Tabulka objednavky(cislo, zakaznik, adresa_zakaznika, zbozi, cena_zbozi, mnozstvi) s klíčem (cislo, zbozi). Jaké funkční závislosti porušují normální formy a jak ji rozložit?
\(\text{zakaznik} \to \text{adresa\_zakaznika}\) a \(\text{zbozi} \to \text{cena\_zbozi}\) (závislost na neklíčovém atributu či na části klíče), dále \(\text{cislo} \to \text{zakaznik}\) (závislost na části klíče, porušuje 2NF). Rozklad: zakaznici(zakaznik, adresa), zbozi(zbozi, cena), objednavky(cislo, zakaznik), polozky(cislo, zbozi, mnozstvi). Pozor: kdyby se cena měnila v čase a objednávka měla držet cenu z doby nákupu, patří cena do položek.
6
Tabulka má \(10^{9}\) řádků. Kolik úrovní má B-strom s větvením 500 a kolik stránek se přečte bez indexu, je-li na stránce 100 řádků?
\(\lceil\log_{500}10^{9}\rceil = \lceil 3{,}33\rceil = 4\) úrovně. Bez indexu \(10^{9}/100 = 10^{7}\) stránek. Při 0,1 ms na náhodné čtení stránky stojí index 0,4 ms; i sekvenční průchod při 0,01 ms na stránku trvá 100 s.
Co si odnést
  • Relační model: data jsou tabulky s klíči, dotaz je výraz relační algebry; SQL je deklarativní.
  • Logické pořadí dotazu: FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY. NULL vyžaduje IS NULL.
  • Normalizace ukládá každý fakt jednou a odstraňuje anomálie; spojení tabulky zase složí.
  • Index (B-strom) mění hledání z průchodu milionů stránek na pár čtení, ale zpomaluje zápis.
  • Transakce ACID chrání data při souběhu i výpadku; parametrizované dotazy chrání před SQL injection.
Část IVTeorie a praxe
11

Vyčíslitelnost a složitostvysoká škola

Co vůbec znamená „spočítat“? Alan Turing v roce 1936 odpověděl strojem tak jednoduchým, že se dá nakreslit na papír, a hned dokázal, že některé otázky žádný stroj nikdy nezodpoví. O třicet let později přibyla jemnější otázka: které úlohy jsou sice řešitelné, ale ne v čase, kterého se dožijeme.

🧭

Kdyby existoval program, který o libovolném programu spolehlivě pozná, zda se někdy zastaví, mohli bychom napsat program, který se ho na sebe sama zeptá a udělá opak. Ten by se zastavil, právě když se nezastaví. Takový program tedy existovat nemůže – stejně jako holič, který holí právě ty, kdo se neholí sami.

Simulátor Turingova stroje
Páska s políčky, čtecí a zápisová hlava (oranžově) a tabulka přechodů: ve stavu \(q\) při symbolu \(s\) zapiš, posuň hlavu a přejdi do dalšího stavu. Zvolte stroj, upravte vstup a krokujte. Graf ukazuje, jak počet kroků roste s délkou vstupu.
LABORATOŘ
Model: deterministický jednopáskový stroj, prázdné políčko je _, pohyb L (vlevo), R (vpravo), N (zůstat). Unární sčítání: vstup 111+11 znamená 3 + 2. Palindrom: stroj odmaže krajní písmena a porovnává je; počet kroků roste kvadraticky.
Obchodní cestující: hrubá síla proti heuristice
Najděte nejkratší okružní cestu přes všechna města. Program vyzkouší všechny okruhy (oranžově nejlepší) a porovná je s rychlou heuristikou „jdi vždy do nejbližšího nenavštíveného města“ (modře).
LABORATOŘ
Model: města náhodně v rovině, vzdálenost vzdušnou čarou. Různých okruhů je \((n-1)!/2\). Odhad času pro větší \(n\) předpokládá miliardu vyzkoušených okruhů za sekundu.
Minihra: snadné, těžké, nemožné
Zařaďte úlohy: patří do P (známe polynomiální algoritmus), jsou NP-úplné (rozhodovací verze; polynomiální algoritmus neznáme), nebo jsou algoritmicky nerozhodnutelné?
MINIHRA
0 / 10
+Teorie: Turingův stroj, Church–Turingova teze, problém zastavení, P a NP, redukce, NP-úplnost

11.1Turingův stroj

David Hilbert v roce 1928 položil otázku (Entscheidungsproblem), zda existuje mechanický postup, který o každém matematickém tvrzení rozhodne, zda je dokazatelné. Aby na ni šlo odpovědět, bylo třeba přesně definovat „mechanický postup“. Alan Turing (1936) navrhl abstraktní stroj, který napodobuje počtáře s tužkou: nekonečnou pásku rozdělenou na políčka, hlavu, která čte a píše po jednom políčku, a konečnou množinu stavů „mysli“.Turing machine, Entscheidungsproblem

_111+11____ …… nekonečná páska hlava: čte, píše, posouvá se o 1 řídicí jednotka, stav q1 δ(q1, 1) = (1, R, q1) konečně mnoho stavů,pravidla v tabulce δ
Obr. 11.1 Turingův stroj při unárním sčítání 3 + 2. Celé „chování“ stroje je tabulka přechodů: pro dvojici (stav, čtený symbol) říká, co zapsat, kam posunout hlavu a do jakého stavu přejít.

Formálně (Sipser) je Turingův stroj sedmice \((Q, \Sigma, \Gamma, \delta, q_0, q_{\text{acc}}, q_{\text{rej}})\): konečná množina stavů \(Q\), vstupní abeceda \(\Sigma\), pásková abeceda \(\Gamma \supseteq \Sigma \cup \{\_\}\), přechodová funkce \(\delta: Q \times \Gamma \to Q \times \Gamma \times \{L, R\}\), počáteční stav a přijímající a zamítající stav. Stroj přijme vstup, když dojde do \(q_{\text{acc}}\), zamítne ho v \(q_{\text{rej}}\) – nebo může běžet donekonečna. Jazyk je rozhodnutelný, když ho rozpoznává stroj, který se na každém vstupu zastaví.decidable language, configuration

Přechodová funkce\[\delta(q, a) = (q', b, D):\quad \text{ve stavu } q \text{ při symbolu } a \text{ zapiš } b,\ \text{posuň hlavu směrem } D \in \{L, R\},\ \text{přejdi do } q'\]
Příklad Unární sčítání krok za krokem

Vstup 111+11 (3 + 2). Stav \(q_0\): jdi doprava přes jedničky; na + napiš 1 a přejdi do \(q_1\). Stav \(q_1\): jdi doprava přes jedničky; na prázdném políčku couvni doleva do \(q_2\). Stav \(q_2\): poslední jedničku smaž a zastav. Na pásce zůstane 11111, tedy 5. Stroj udělá 8 kroků; obecně pro \(a + b\) jich udělá \(a + b + 3\).

11.2Church–Turingova teze

Ve stejném roce popsal Alonzo Church jiný model výpočtu, λ-kalkul, a brzy se ukázalo, že oba modely – i všechny později navržené (stroje RAM, rekurzivní funkce, běžné programovací jazyky) – spočítají přesně tytéž funkce. Church–Turingova teze tvrdí, že vše, co lze spočítat jakýmkoli mechanickým postupem, spočítá Turingův stroj. Je to teze, ne věta: „mechanický postup“ je intuitivní pojem. Jazyk nebo systém, který umí simulovat Turingův stroj, se nazývá Turingovsky úplný.Church–Turing thesis, Turing complete

Turing také sestrojil univerzální stroj, který na vstupu dostane popis jiného stroje a jeho vstup a odsimuluje ho. To je teoretický předobraz počítače s uloženým programem z kapitoly 3: jeden stroj, mnoho programů.universal Turing machine

11.3Problém zastavení

Problém zastavení: dostaneme program \(P\) a vstup \(x\); zastaví se \(P\) na \(x\)? Turing dokázal, že žádný algoritmus tuto otázku nerozhoduje pro všechny dvojice \((P, x)\).halting problem, undecidability

  1. Předpokládejme, že existuje program H(P, x), který vždy skončí a vrátí ano, právě když \(P\) se na \(x\) zastaví.
  2. Sestrojíme program D(P): zavolá H(P, P); vyjde-li ano, zacyklí se; vyjde-li ne, skončí.
  3. Co udělá D(D)? Zastaví-li se, pak H(D, D) vrátilo ano a D se zacyklilo – spor. Nezastaví-li se, vrátilo H ne a D skončilo – spor.
  4. Předpoklad byl chybný: program H neexistuje.

Je to diagonální argument, stejný trik, kterým Cantor dokázal, že reálných čísel je víc než přirozených. Z problému zastavení plyne mnoho dalších nerozhodnutelných otázek. Riceova věta (1953) říká, že každá netriviální vlastnost chování programů je nerozhodnutelná: zda program někdy vypíše „ahoj“, zda počítá stejnou funkci jako jiný program, zda obsahuje nekonečný cyklus.diagonal argument, Rice's theorem

Ve skutečnosti

Nástroje, které hledají chyby v kódu nebo škodlivé programy, proto nemohou být dokonalé: buď některé problémy přehlédnou, nebo občas ohlásí falešný poplach, nebo se u některých programů nevysloví. Užitečné jsou přesto, protože skutečné programy bývají mnohem jednodušší než nejhorší případ. Hranici dobře ilustruje funkce „pilný bobr“ (busy beaver): nejdelší možný běh zastavujícího se stroje s \(n\) stavy. Roste rychleji než jakákoli vyčíslitelná funkce; pro \(n = 5\) ji v roce 2024 určila spolupráce bbchallenge na 47 176 870 kroků s formálním počítačově ověřeným důkazem.

11.4Třídy P a NP

Složitost (kapitola 6) třídí rozhodnutelné úlohy podle času. Uvažujeme rozhodovací úlohy s odpovědí ano/ne. Třída P obsahuje úlohy řešitelné deterministickým algoritmem v polynomiálním čase \(O(n^{k})\): řazení, nejkratší cesta, test prvočíselnosti (algoritmus AKS, 2002). Třída NP obsahuje úlohy, u kterých lze kladnou odpověď ověřit v polynomiálním čase, dostaneme-li vhodný certifikát: u sudoku vyplněnou mřížku, u obchodního cestujícího okruh kratší než zadaná mez. Každá úloha z P je v NP (certifikát ani nepotřebujeme), tedy \(\mathrm{P} \subseteq \mathrm{NP}\).decision problem, class P, class NP, certificate, verifier

Třída NP pomocí ověřovatele\[L \in \mathrm{NP} \iff \exists \text{ polynomiální } V:\ x \in L \Leftrightarrow \exists c,\ |c| \le |x|^{k}:\ V(x, c) = \text{ano}\]

Zda \(\mathrm{P} = \mathrm{NP}\), tedy zda je hledání řešení vždy jen polynomiálně těžší než jeho kontrola, je nejslavnější otevřená otázka informatiky. Clayův matematický institut ji v roce 2000 zařadil mezi sedm problémů tisíciletí s odměnou milion dolarů. Většina odborníků se domnívá, že \(\mathrm{P} \ne \mathrm{NP}\).

11.5Redukce a NP-úplnost

Úloha \(A\) se polynomiálně redukuje na úlohu \(B\) (\(A \le_p B\)), když každou instanci \(A\) umíme v polynomiálním čase přeložit na instanci \(B\) se stejnou odpovědí. Pak je \(B\) aspoň tak těžká jako \(A\): kdo umí rychle \(B\), umí rychle i \(A\). Úloha je NP-těžká, když se na ni redukuje každá úloha z NP, a NP-úplná, když je navíc sama v NP.polynomial-time reduction, NP-hard, NP-complete

Stephen Cook (1971) a nezávisle Leonid Levin (1973) dokázali, že NP-úplná je splnitelnost logických formulí (SAT): dá se proměnným přiřadit pravda/nepravda tak, aby formule platila? Richard Karp (1972) pak redukcemi ukázal NP-úplnost 21 dalších úloh, mezi nimi kliky, pokrytí vrcholů, Hamiltonovy kružnice a barvení grafu. Dnes jich známe tisíce. Kdyby jediná z nich měla polynomiální algoritmus, platilo by \(\mathrm{P} = \mathrm{NP}\).Cook–Levin theorem, SAT

graf G: klika {A, B, C}doplněk G̅: nezávislá množina {A, B, C} ABCD ABCD hrana je v G̅, právě když v G chybí; v G chybí jen A–D, proto má G̅ jedinou hranu A–D
Obr. 11.2 Redukce. Graf má kliku velikosti \(k\) (každé dva vrcholy spojené), právě když jeho doplněk má nezávislou množinu velikosti \(k\) (žádné dva spojené). Překlad stojí \(O(n^{2})\), takže obě úlohy jsou stejně těžké.
Pozor

Redukce se dělá ze známé těžké úlohy na novou, ne naopak. Kdo chce ukázat, že jeho úloha \(B\) je NP-těžká, musí na ni převést známou NP-úplnou úlohu \(A\). Převést \(B\) na SAT dokazuje jen to, že \(B\) je v NP, nikoli že je těžká.

11.6Co dělat s těžkými úlohami

  • Malé instance řešit přesně. Prohledávání s ořezáváním (branch and bound) zvládne i stovky prvků, i když v nejhorším případě exponenciálně.
  • Aproximace se zárukou. Pokrytí vrcholů jde v polynomiálním čase najít nejvýš dvakrát větší než optimum; pro obchodního cestujícího s trojúhelníkovou nerovností dává Christofidesův algoritmus (1976) okruh nejvýš o polovinu delší.
  • Heuristiky bez záruky, ale prakticky dobré: hladové volby, lokální vylepšování, simulované žíhání.
  • Speciální případy bývají snadné: barvení dvěma barvami je v P, třemi NP-úplné; SAT s klauzulemi o dvou proměnných je v P.
  • Řešiče SAT zvládají průmyslové formule s miliony proměnných, protože skutečné instance mají strukturu, kterou nejhorší případ nemá.

Těžkost je někdy výhoda: kryptografie (kapitola 9) stojí na úlohách, které považujeme za těžké. Rozklad na prvočinitele ale není známý jako NP-úplný a kvantový počítač by ho zvládl (Shor); proto se pro postkvantové šifry hledají úlohy jiného typu.

Tab. 11.1Obchodní cestující hrubou silou: \((n-1)!/2\) okruhů při \(10^{9}\) okruzích za sekundu
Měst \(n\)okruhůčas
10181 4400,2 ms
1543 589 145 60044 s
20\(6{,}1\cdot10^{16}\)1,9 roku
25\(3{,}1\cdot10^{23}\)9,8 milionu let

11.7Procvičení

1
Kolik kroků udělá stroj pro unární sčítání na vstupu 1111+111? Co bude na pásce?
\(a + b + 3 = 4 + 3 + 3 = 10\) kroků: 4 jedničky, +, 3 jedničky, prázdné políčko, couvnutí a smazání. Na pásce 1111111, tedy 7.
2
Stroj „binární +1“ dostane 1001. Projděte jeho běh.
\(q_0\) jde doprava přes 1, 0, 0, 1 (4 kroky), na prázdném políčku couvne do \(q_1\) (5. krok). \(q_1\) čte 1: zapíše 0 a jde doleva (6.), čte 0: zapíše 1 a zastaví (7.). Výsledek 1010, tedy \(9 + 1 = 10\).
3
Proč problém zastavení neznamená, že nikdy nepoznáme, zda se konkrétní program zastaví?
Nerozhodnutelnost říká, že neexistuje jeden algoritmus správný pro všechny programy. U konkrétního programu to často dokázat umíme (variant cyklu, kapitola 2). Nemožné je jen univerzální automatické rozhodování.
4
Úloha: má graf kliku velikosti \(k\)? Proč je v NP? A proč z toho, že ji umíme převést na SAT, neplyne, že je těžká?
Certifikát je seznam \(k\) vrcholů; ověřit, že jsou každé dva spojené, stojí \(O(k^{2})\) kontrol. Převod na SAT ukazuje jen horní mez (není těžší než SAT). Těžkost se dokazuje redukcí opačným směrem: Karp převedl SAT na kliku, takže klika je NP-úplná.
5
Jak dlouho by trvalo hrubou silou vyřešit obchodního cestujícího pro 18 měst při \(10^{9}\) okruzích za sekundu?
\(17!/2 = 177\,843\,714\,048\,000\) okruhů, tedy \(1{,}78\cdot10^{5}\) s, zhruba 2 dny. Pro 19 měst osmnáctkrát déle, asi 37 dní.
6
Stroj na palindromy udělá pro vstup \(a^{n}\) přesně \((n+1)(n+2)/2\) kroků. Jaká je jeho časová složitost? Zvládl by vícepáskový stroj totéž rychleji?
\(\Theta(n^{2})\). Se dvěma páskami stačí vstup zkopírovat a porovnat pozpátku, \(O(n)\). Jednopáskový stroj na palindromy potřebuje \(\Omega(n^{2})\) kroků, to je klasický výsledek teorie složitosti. Polynomialita (a tedy třída P) na počtu pásek nezávisí.
Co si odnést
  • Turingův stroj je přesná definice algoritmu; podle Church–Turingovy teze spočítá vše, co je vůbec spočitatelné.
  • Problém zastavení je nerozhodnutelný; každá netriviální vlastnost chování programů také (Riceova věta).
  • P: rychle vyřešit; NP: rychle ověřit. Zda P = NP, nikdo neví.
  • NP-úplné úlohy jsou navzájem převoditelné redukcemi; v praxi se řeší přesně pro malá data, aproximací a heuristikami.
Část IVTeorie a praxe
12

Umělá inteligence a softwarevysoká škola

Umělá inteligence není jedna technologie, ale sedmdesát let snahy přimět stroje k úlohám, které vyžadují úsudek: hrát hry, poznávat obrázky, psát text. Za každým takovým systémem stojí algoritmy z předchozích kapitol, data a lidé, kteří software navrhují, testují a nesou za něj odpovědnost.

🤖

Šachový program nepřemýšlí jako velmistr: prochází miliony pozic a počítá. Jazykový model nerozumí světu jako člověk: odhaduje, jaké slovo nejspíš následuje. Obojí může působit inteligentně a obojí může selhat způsobem, který by člověka nenapadl. Kdo ví, jak systém funguje uvnitř, ví také, kdy mu nevěřit.

Minihra: piškvorky proti minimaxu
Hrajete křížky na hracím poli 3 × 3. Počítač hraje kolečky a před každým tahem prohledá strom všech pokračování algoritmem minimax s alfa-beta ořezáváním. Prohrát neumí; zkuste aspoň remízu.
MINIHRA
Jste na tahu.
Perceptron se učí
Dvě skupiny bodů (modrá a oranžová). Perceptron hledá přímku, která je oddělí: při každé chybě posune váhy směrem ke správné odpovědi. Na lineárně oddělitelných datech se to vždy povede; na datech typu XOR nikdy.
LABORATOŘ
Model: 40 bodů, výstup 1, když \(w_1x_1 + w_2x_2 + b \gt 0\), jinak 0. Pravidlo učení \(w \leftarrow w + \eta\,(y - \hat y)\,x\). Pro strojové učení do hloubky (regrese, rozhodovací stromy, neuronové sítě, přeučení) viz průvodce Statistika a modely.
Jazykový model v malém
Model se „naučil“ z několika desítek vět jen to, jak často po sobě slova následují. Ukazuje pravděpodobnosti dalšího slova a skládá větu losováním. Teplota řídí odvahu: nízká volí nejpravděpodobnější slovo, vysoká i nepravděpodobná.
LABORATOŘ
Klepněte na Generovat větu.
Model: bigramový model: pravděpodobnost slova závisí jen na jediném předchozím slově, \(P(w_t \mid w_{t-1}) = \text{počet}(w_{t-1}w_t)/\text{počet}(w_{t-1})\). Velké jazykové modely místo počítání dvojic používají neuronovou síť s miliardami parametrů a kontext tisíců předchozích tokenů, princip „odhadni další kousek textu“ je ale stejný.
+Teorie: prohledávání a hry, perceptron, jazykové modely, vývoj softwaru, testování a etika

12.1Co je umělá inteligence

Alan Turing (1950) navrhl místo otázky „umí stroj myslet?“ zkoušku: pozná tazatel v písemném rozhovoru, zda odpovídá člověk, nebo stroj? Obor dostal jméno na letní dílně v Dartmouthu (1956). Učebnice Russella a Norviga definuje umělou inteligenci jako studium agentů, kteří vnímají prostředí a jednají tak, aby co nejlépe splnili svůj cíl. Obor prošel vlnami: symbolické uvažování a prohledávání, expertní systémy s ručně psanými pravidly, strojové učení z dat a od 2010. let hluboké neuronové sítě. Otázky vědomí a porozumění strojů rozebírá průvodce Filozofie.artificial intelligence, Turing test, rational agent

12.2Prohledávání a hry

Mnoho úloh lze formulovat jako hledání cesty ve stavovém prostoru: stavy jsou vrcholy grafu, tahy hrany (kapitola 8). U her pro dva hráče se prohledává herní strom. Minimax: hráč MAX volí tah s nejvyšší hodnotou, protivník MIN s nejnižší, hodnoty se počítají od listů (výhra +1, remíza 0, prohra −1) nahoru.state space, game tree, minimax

MAX 3 MIN 3 MIN ≤ 2 MIN 2 312821452 46 ořezáno: MIN už má 2 < 3, MAX tuto větev nikdy nezvolí
Obr. 12.1 Minimax s alfa-beta ořezáváním. Kořen (MAX) zvolí tah s hodnotou 3. Ve druhé větvi stačí uvidět list 2: MIN tam dosáhne nejvýš 2, což je horší než jistá trojka, a listy 4 a 6 se vůbec nemusí zkoumat.

Alfa-beta ořezávání přeskakuje větve, které výsledek nemohou ovlivnit; výsledek je stejný jako u úplného minimaxu. Při dobrém pořadí tahů zmenší počet prohledaných pozic zhruba na odmocninu (Knuth a Moore, 1975). Celý strom piškvorek 3 × 3 má 549 946 uzlů a 255 168 různých partií; s alfa-beta ořezáváním (tahy zkoumané v pořadí políček) stačí k vyhodnocení prázdné desky 18 297 uzlů. Výsledek: při bezchybné hře obou stran remíza.alpha-beta pruning

U šachů Shannon (1950) odhadl strom zhruba na \(10^{120}\) partií, takže úplné prohledání nepřichází v úvahu. Programy prohledávají do omezené hloubky a pozice hodnotí hodnoticí funkcí. V roce 1997 porazil šachový počítač mistra světa Garriho Kasparova; v roce 2016 porazil program pro hru go Lee Se-dola, tentokrát díky kombinaci prohledávání s neuronovými sítěmi naučenými na milionech partií.evaluation function

12.3Strojové učení stručně

Strojové učení hledá pravidla z dat místo z ručně psaného kódu. Při učení s učitelem má každý příklad správnou odpověď (obrázek a popisek), při učení bez učitele hledá model strukturu sám (shluky), při zpětnovazebním učení se agent učí z odměn. Úspěšnost se měří na testovacích datech, která model při učení neviděl; model, který si zapamatoval trénovací data a na nových selhává, je přeučený.machine learning, supervised, unsupervised, reinforcement learning, overfitting

x₁x₂ w₁w₂ Σ + b ŷ 1, je-li součet > 0
Obr. 12.2 Perceptron (Rosenblatt, 1958): vážený součet vstupů a prahu, za ním skoková funkce. Hranice rozhodnutí \(w_1x_1 + w_2x_2 + b = 0\) je přímka.

Perceptron se učí jednoduchým pravidlem: když se splete, přičte k vahám \(\eta\,(y - \hat y)\,x\). Novikoff (1962) dokázal, že na lineárně oddělitelných datech pravidlo po konečném počtu chyb najde oddělující přímku. Minsky a Papert (1969) upozornili, že funkci XOR jediný perceptron nespočítá, protože body (0, 1), (1, 0) nejde oddělit od (0, 0), (1, 1) přímkou. Řešením jsou vícevrstvé sítě s nelineárními funkcemi, které se učí zpětným šířením chyby (Rumelhart, Hinton a Williams, 1986).perceptron, perceptron convergence theorem, backpropagation

Příklad Perceptron se naučí AND

Začneme s \(w = (0, 0)\), \(b = 0\), \(\eta = 1\) a procházíme body (0,0)→0, (0,1)→0, (1,0)→0, (1,1)→1. V první epoše se splete jen na (1,1) a váhy se změní na \(w = (1, 1)\), \(b = 1\). Pak chybuje i na nulových bodech a váhy se dolaďují; počty chyb v epochách jsou 1, 3, 3, 2, 1 a šestá epocha proběhne bez chyby s \(w = (2, 1)\), \(b = -2\). Kontrola: \(2\cdot1 + 1\cdot1 - 2 = 1 \gt 0\), ale \(2\cdot1 + 0 - 2 = 0\), takže (1, 0) dá 0.

12.4Velké jazykové modely v principu

Jazykový model přiřazuje pravděpodobnost pokračování textu. Text se rozdělí na tokeny (slova nebo jejich části) a model se učí odhadovat rozdělení pravděpodobnosti dalšího tokenu podle předchozích. Generuje se opakovaně: vybere se token (podle pravděpodobností a teploty), připojí se k textu a postup se opakuje. Dnešní velké jazykové modely používají architekturu transformer (Vaswani a kol., 2017), jejíž mechanismus pozornosti umí při odhadu vážit vztahy mezi vzdálenými částmi textu. Mají miliardy parametrů a učí se nejdřív na obrovském množství textu (předtrénování), pak se dolaďují na příkladech a podle hodnocení lidí.language model, token, transformer, attention, pretraining, fine-tuning

Pozor

Model generuje pravděpodobný text, ne nutně pravdivý. Umí sebejistě uvést neexistující zdroj, číslo nebo citaci (tzv. halucinace), přebírá zkreslení z trénovacích dat a o událostech po ukončení trénování neví, pokud nemá přístup k aktuálním zdrojům. Výstupy u faktů, výpočtů a citací ověřujte v původních zdrojích a do konverzace nevkládejte osobní údaje, hesla ani důvěrné informace.

12.5Jak se dělá software

Software se nevytváří jen psaním kódu. Životní cyklus zahrnuje sběr požadavků (co má systém dělat), návrh (z jakých částí se skládá), implementaci, testování, nasazení a dlouhou údržbu. Starší vodopádový model procházel fázemi postupně jednou; dnes převládají agilní přístupy (manifest agilního vývoje, 2001), které dodávají funkční software v krátkých iteracích a průběžně ho upravují podle zpětné vazby.software engineering, requirements, agile

Správa verzí uchovává celou historii změn: každá uložená změna (commit) má autora, čas a popis, k jakékoli starší verzi se lze vrátit. Nejrozšířenější je svobodný systém Git (2005). Nová funkce se vyvíjí ve větvi, po kontrole kódu kolegou (code review) se sloučí do hlavní větve.version control, commit, branch, merge, code review

hlavní větevvětev „nová funkce“ + testysloučení po kontroleoprava chyby
Obr. 12.3 Verzování ve větvích. Hlavní větev zůstává funkční, nová práce vzniká stranou a do hlavní větve se dostane až po testech a kontrole.

Testování má úrovně: jednotkové testy ověřují jednotlivé funkce (jako assert v kapitole 4), integrační jejich spolupráci, systémové celek a akceptační splnění požadavků zákazníka. Testy se spouštějí automaticky při každé změně (průběžná integrace). Dijkstra připomínal, že testy mohou dokázat přítomnost chyb, nikdy jejich nepřítomnost; kde jde o životy, doplňují se formálními důkazy správnosti.unit, integration, system, acceptance testing; continuous integration

Ve skutečnosti

Ozařovací přístroj Therac-25 v letech 1985–1987 několikrát podal pacientům mnohonásobnou dávku záření; příčinou byla mimo jiné chyba souběhu v řídicím programu a odstranění hardwarových pojistek, na které starší model spoléhal. Sonda Mars Climate Orbiter se v roce 1999 ztratila, protože jedna část softwaru počítala v anglických jednotkách a druhá v metrických. Ani jedna chyba nebyla složitá; obě prošly, protože chyběla kontrola na rozhraní.

12.6Etika a odpovědnost

Software rozhoduje o úvěrech, přijetí na školu, lékařské péči i o tom, co lidé vidí na sociálních sítích. Proto se od něj očekává:

  • Ochrana soukromí: sbírat jen nezbytné údaje a chránit je; v EU to vyžaduje obecné nařízení o ochraně osobních údajů (GDPR, nařízení (EU) 2016/679).
  • Férovost: model naučený na zkreslených datech zkreslení zopakuje (například horší rozpoznávání skupin, které byly v datech málo zastoupené). Je třeba to měřit a opravovat.
  • Průhlednost a dohledatelnost: člověk má vědět, že jedná se strojem, a rozhodnutí má jít vysvětlit a napadnout.
  • Odpovědnost a bezpečnost: za systém odpovídají lidé, kteří ho navrhli a nasadili; profesní zásady shrnuje například etický kodex ACM (2018).

Evropská unie upravuje umělou inteligenci nařízením (EU) 2024/1689 (AI Act), které třídí systémy podle rizika. Zákazy nepřijatelných praktik platí od 2. 2. 2025, pravidla pro modely pro obecné účely od 2. 8. 2025; povinnosti pro vysoce rizikové systémy byly změnou z roku 2026 odloženy na 2. 12. 2027, respektive 2. 8. 2028 (stav k 13. 10. 2026, podrobnosti v příloze C). Ekonomické dopady digitálních platforem rozebírá průvodce Ekonomie, filozofické otázky odpovědnosti průvodce Filozofie.GDPR, AI Act, algorithmic fairness, accountability

12.7Procvičení

1
Strom má kořen MAX se dvěma tahy; po prvním následují listy 5 a 9 (tah MIN), po druhém listy 7 a 1. Jakou hodnotu má kořen a který list alfa-beta ořízne?
První MIN uzel: min(5, 9) = 5. Druhý: po listu 7 je hodnota zatím 7, list 1 ji sníží na 1. Kořen: max(5, 1) = 5. Při pořadí 7, 1 se nic neořízne; kdyby list 1 přišel první, uzel by měl hned hodnotu ≤ 1 < 5 a list 7 by se ořízl.
2
Perceptron má váhy \(w = (1, -1)\), \(b = 0\) a \(\eta = 0{,}5\). Bod \(x = (1, 2)\) má mít výstup 1. Jaký je výstup a jak se váhy změní?
\(1\cdot1 - 1\cdot2 + 0 = -1 \le 0\), výstup 0, chyba \(y - \hat y = 1\). Nové váhy \(w = (1 + 0{,}5\cdot1,\ -1 + 0{,}5\cdot2) = (1{,}5;\ 0)\), \(b = 0 + 0{,}5 = 0{,}5\). Nyní \(1{,}5 + 0 + 0{,}5 = 2 \gt 0\): bod je zařazen správně.
3
V korpusu následuje po slově „počítač“ desetkrát slovo „počítá“, pětkrát „ukládá“ a pětkrát „čte“. Jaké pravděpodobnosti dá bigramový model? Jak se změní při teplotě 0,5?
0,5; 0,25; 0,25. Teplota \(T\) mění pravděpodobnosti na \(p_i^{1/T}/\sum_j p_j^{1/T}\). Při \(T = 0{,}5\) jde o druhé mocniny: 0,25; 0,0625; 0,0625, po normalizaci 0,667; 0,167; 0,167. Nižší teplota zvýrazní nejpravděpodobnější volbu.
4
Proč se model hodnotí na testovacích datech, která neviděl při učení?
Na trénovacích datech by vyšel uměle dobře: model si je mohl zapamatovat včetně šumu. Testovací data odhadují, jak bude fungovat na nových případech. Rozdíl mezi úspěšností na trénovacích a testovacích datech je známkou přeučení.
5
Funkce prumer z kapitoly 4 projde všemi vašimi testy. Znamená to, že je správná?
Ne. Testy ověřují jen zkoušené případy; prázdný seznam, velmi velká čísla nebo nečíselné hodnoty mohou zůstat neotestované. Testy zvyšují důvěru, ale správnost pro všechny vstupy dokazuje jen důkaz (invariant, typy, formální ověření).
Co si odnést
  • Hry a plánování jsou prohledávání stavového prostoru; minimax s alfa-beta ořezáváním hraje bezchybně tam, kde lze strom prohledat.
  • Perceptron se učí oddělit data přímkou; složitější vzory potřebují vícevrstvé sítě.
  • Jazykové modely odhadují další token; jejich text je pravděpodobný, ne zaručeně pravdivý.
  • Software vzniká v týmu: verzování, kontrola kódu a automatické testy jsou základ, odpovědnost za dopady nese člověk.
PřílohaA

Slovníček

PřílohaB

Složitosti a pseudokód

Tab. B.1Algoritmy průvodce a jejich časová složitost (\(n\) prvků nebo vrcholů, \(m\) hran)
AlgoritmusSložitostKapitola
Euklidův algoritmus NSD(a, b)\(O(\log \min(a, b))\) dělení2
lineární hledání / binární vyhledávání\(O(n)\) / \(O(\log n)\)5
bublinkové řazení, řazení vkládáním\(O(n^{2})\); vkládání na téměř seřazených datech \(O(n + \text{inverze})\)5
řazení slučováním\(\Theta(n\log n)\), paměť \(O(n)\)5
rychlé řazeníprůměrně \(O(n\log n)\), nejhůř \(O(n^{2})\)5
dolní mez řazení porovnáváním\(\Omega(n\log n)\)5
BFS, DFS, topologické uspořádání\(O(n + m)\)8
Dijkstra (s haldou) / Bellman–Ford\(O((n + m)\log n)\) / \(O(nm)\)8
Kruskal / Jarník (Prim) / Borůvka\(O(m\log m)\) / \(O(m\log n)\) / \(O(m\log n)\)8
modulární umocňování \(a^{e} \bmod n\)\(O(\log e)\) násobení9
spojení tabulek vnořenými cykly / přes index\(O(|R|\cdot|S|)\) / \(O(|R|\log |S|)\)10
Turingův stroj na palindromy (1 páska)\(\Theta(n^{2})\)11
obchodní cestující hrubou silou / SAT hrubou silou\(O(n!)\) / \(O(2^{n}\cdot\text{délka formule})\)11
minimax / alfa-beta (strom s větvením \(b\), hloubka \(d\))\(O(b^{d})\) / nejlépe \(O(b^{d/2})\)12

Pseudokód: Dijkstrův algoritmus

Dijkstra(G, s):
    pro každý vrchol v: d[v] ← ∞;  d[s] ← 0
    Q ← prioritní fronta všech vrcholů podle d
    dokud Q není prázdná:
        u ← odeber z Q vrchol s nejmenším d
        pro každou hranu (u, v) s délkou w ≥ 0:
            když d[u] + w < d[v]:
                d[v] ← d[u] + w;  před[v] ← u;  sniž klíč v v Q

Pseudokód: Kruskalův algoritmus

Kruskal(G):
    seřaď hrany podle délky vzestupně;  T ← ∅
    pro každý vrchol v: vytvoř množinu {v}            # union-find
    pro každou hranu (u, v):
        když najdi(u) ≠ najdi(v):                     # nevznikne cyklus
            T ← T ∪ {(u, v)};  sjednoť(u, v)
    vrať T

Pseudokód: rychlé modulární umocňování

mocnina(a, e, n):                # spočítá a^e mod n
    r ← 1;  a ← a mod n
    dokud e > 0:
        když e je liché: r ← r · a mod n
        a ← a · a mod n;  e ← ⌊e / 2⌋
    vrať r

Vzorce na jednom místě

Informace (kap. 1)\[n = \lceil\log_2 N\rceil,\qquad H = -\sum_i p_i\log_2 p_i\]
Asymptotika (kap. 6)\[f = O(g) \iff \exists c, n_0\ \forall n \ge n_0: f(n) \le c\,g(n);\qquad T(n) = aT(n/b) + \Theta(n^{d})\]
Narozeninový paradox (kap. 7)\[P(k) = 1 - \prod_{i=0}^{k-1}\frac{m - i}{m},\qquad \text{kolize se čeká kolem } \sqrt{m}\]
RSA (kap. 9)\[n = pq,\quad ed \equiv 1 \pmod{(p-1)(q-1)},\quad c = m^{e} \bmod n,\quad m = c^{d} \bmod n\]
Hašovací tabulka (kap. 7), B-strom (kap. 10)\[\alpha = n/m,\qquad \text{hloubka B-stromu} = \lceil\log_f n\rceil\]
PřílohaC

Zdroje

Normy, protokoly a předpisy

  • The Unicode Standard, Version 18.0.0 (Unicode Consortium, vydáno 16. 9. 2026): 172 808 kódovaných znaků; kódový prostor U+0000 až U+10FFFF (1 114 112 kódových bodů). Ověřeno 13. 10. 2026 na unicode.org.
  • RFC 3629 UTF-8 (2003); RFC 2606 vyhrazená jména domén pro příklady (.example, .test; 1999).
  • RFC 791 IPv4 (1981), RFC 8200 IPv6 (2017), RFC 9293 TCP (2022), RFC 768 UDP (1980), RFC 1034 a 1035 DNS (1987), RFC 9110 sémantika HTTP (2022), RFC 9000 QUIC (2021), RFC 9114 HTTP/3 (2022), RFC 8446 TLS 1.3 (2018), RFC 9106 Argon2 (2021). Čísla a roky uvedeny podle řady RFC; jednotlivě je ověřte na rfc-editor.org.
  • NIST FIPS 197 (AES, 2001, aktualizace 2023), FIPS 180-4 (SHA-2, 2015), FIPS 202 (SHA-3, 2015), FIPS 203, 204 a 205 (postkvantová kryptografie, srpen 2024).
  • NIST SP 800-63B-4 (2025), oddíl 3.1.1.2: heslo jako jediný faktor aspoň 15 znaků, s dalším faktorem aspoň 8; přijímat aspoň 64 znaků; nevynucovat pravidla skladby ani pravidelnou změnu; porovnávat se seznamem zakázaných hesel. Ověřeno 13. 10. 2026 na pages.nist.gov.
  • IEEE 754-2019 (aritmetika v plovoucí řádové čárce), ISO/IEC 9075:2023 (SQL), ISO 5807 (symboly vývojových diagramů), IEC 80000-13 (dvojkové předpony KiB, MiB, GiB).
  • Nařízení (EU) 2016/679 (GDPR) a nařízení (EU) č. 910/2014 (eIDAS, elektronická identifikace a služby vytvářející důvěru).
  • Nařízení (EU) 2024/1689 (akt o umělé inteligenci): zákazy a povinnost gramotnosti v AI od 2. 2. 2025, pravidla pro modely pro obecné účely od 2. 8. 2025. Změnové nařízení (tzv. digitální omnibus k AI) vstoupilo v platnost 27. 7. 2026 a odložilo povinnosti pro vysoce rizikové systémy podle přílohy III na 2. 12. 2027 a podle přílohy I na 2. 8. 2028. Ověřeno 13. 10. 2026 na stránkách Evropské komise (digital-strategy.ec.europa.eu); znění se může dále měnit.
  • Rámcové vzdělávací programy: revize RVP ZV (2021) zavedla vzdělávací oblast Informatika, povinně na 1. stupni od 1. 9. 2023 a na 2. stupni od 1. 9. 2024; revize RVP G (2021) s novou informatikou, na nižším stupni víceletých gymnázií nejpozději od 1. 9. 2025 (MŠMT, NPI ČR; Eurydice). Podrobnosti ověřte v aktuálním znění na edu.cz.
  • Pilný bobr BB(5) = 47 176 870: oznámeno spoluprací bbchallenge 2. 7. 2024, formální důkaz v systému Coq (Rocq); článek arXiv:2509.12337 (2025). Ověřeno 13. 10. 2026.

Literatura

  • Cormen, T. H.; Leiserson, C. E.; Rivest, R. L.; Stein, C. (2022): Introduction to Algorithms, 4. vyd. MIT Press.
  • Sipser, M. (2012): Introduction to the Theory of Computation, 3. vyd. Cengage Learning.
  • Knuth, D. E. (1968–2022): The Art of Computer Programming, sv. 1–4B. Addison-Wesley.
  • Tanenbaum, A. S.; Feamster, N.; Wetherall, D. J. (2021): Computer Networks, 6. vyd. Pearson.
  • Silberschatz, A.; Korth, H. F.; Sudarshan, S. (2019): Database System Concepts, 7. vyd. McGraw-Hill.
  • Russell, S.; Norvig, P. (2020): Artificial Intelligence: A Modern Approach, 4. vyd. Pearson.
  • Mareš, M.; Valla, T. (2017): Průvodce labyrintem algoritmů. Praha: CZ.NIC.
  • Turing, A. M. (1936): On Computable Numbers, with an Application to the Entscheidungsproblem. Proceedings of the London Mathematical Society s2-42, 230–265.
  • Turing, A. M. (1950): Computing Machinery and Intelligence. Mind 59(236), 433–460.
  • Shannon, C. E. (1948): A Mathematical Theory of Communication. Bell System Technical Journal 27, 379–423 a 623–656.
  • Dijkstra, E. W. (1959): A Note on Two Problems in Connexion with Graphs. Numerische Mathematik 1, 269–271.
  • Borůvka, O. (1926): O jistém problému minimálním. Práce moravské přírodovědecké společnosti 3, 37–58. Jarník, V. (1930): O jistém problému minimálním. Tamtéž 6, 57–63.
  • Hoare, C. A. R. (1962): Quicksort. The Computer Journal 5(1), 10–16.
  • Böhm, C.; Jacopini, G. (1966): Flow Diagrams, Turing Machines and Languages with Only Two Formation Rules. Communications of the ACM 9(5), 366–371.
  • Hart, P. E.; Nilsson, N. J.; Raphael, B. (1968): A Formal Basis for the Heuristic Determination of Minimum Cost Paths. IEEE Transactions on Systems Science and Cybernetics 4(2), 100–107.
  • Codd, E. F. (1970): A Relational Model of Data for Large Shared Data Banks. Communications of the ACM 13(6), 377–387.
  • Cook, S. A. (1971): The Complexity of Theorem-Proving Procedures. Proceedings of the 3rd Annual ACM Symposium on Theory of Computing, 151–158.
  • Karp, R. M. (1972): Reducibility Among Combinatorial Problems. In: Miller, R. E.; Thatcher, J. W. (eds.): Complexity of Computer Computations. Plenum, 85–103.
  • Bayer, R.; McCreight, E. (1972): Organization and Maintenance of Large Ordered Indexes. Acta Informatica 1, 173–189.
  • Knuth, D. E.; Moore, R. W. (1975): An Analysis of Alpha-Beta Pruning. Artificial Intelligence 6(4), 293–326.
  • Diffie, W.; Hellman, M. E. (1976): New Directions in Cryptography. IEEE Transactions on Information Theory 22(6), 644–654.
  • Rivest, R. L.; Shamir, A.; Adleman, L. (1978): A Method for Obtaining Digital Signatures and Public-Key Cryptosystems. Communications of the ACM 21(2), 120–126.
  • Kerckhoffs, A. (1883): La cryptographie militaire. Journal des sciences militaires 9, 5–38 a 161–191.
  • Rosenblatt, F. (1958): The Perceptron: A Probabilistic Model for Information Storage and Organization in the Brain. Psychological Review 65(6), 386–408.
  • Härder, T.; Reuter, A. (1983): Principles of Transaction-Oriented Database Recovery. ACM Computing Surveys 15(4), 287–317.
  • Vaswani, A. a kol. (2017): Attention Is All You Need. Advances in Neural Information Processing Systems 30.
  • Lions, J.-L. a kol. (1996): ARIANE 5 Flight 501 Failure. Report by the Inquiry Board. ESA a CNES.
  • Leveson, N. G.; Turner, C. S. (1993): An Investigation of the Therac-25 Accidents. IEEE Computer 26(7), 18–41.

Modelové předpoklady laboratoří

Laboratoře jsou zjednodušené modely, ne měření skutečných systémů. Časy přístupu do paměti a sítě jsou řádové hodnoty; model načtení stránky nezahrnuje pomalý rozjezd TCP, ztráty paketů ani dobu zpracování na serveru; síla hesla platí jen pro náhodně generovaná hesla. Řadicí, grafové a databázové algoritmy počítají přesně, ale na malých datech. Mini SQL a robotí jazyk jsou vlastní zjednodušené interprety; RSA je učebnicové bez doplňování a s malými prvočísly, k ničemu jinému než k pochopení principu se nehodí. Referenční četnosti písmen v kapitole 9 jsou spočítané z textu tohoto průvodce. Všechna čísla v příkladech a procvičení jsou přepočítaná skriptem (Python, JavaScript) nebo databází SQLite.

Interaktivní průvodce Informatika (říjen 2026). Studijní materiál, nenahrazuje učebnici ani výuku. Bezpečnostní kapitoly vykládají principy a obranu, ne postupy útoků. Průvodce nejmenuje komerční produkty; jména domén v příkladech jsou smyšlená.