Časť i algoritmy · khwarizmi (algorizm, 770 - 840), ktorý sa narodil na území dnešného...

42
Marcel Abas 1 Časť I Algoritmy 1 Základné pojmy a definície 1.1 Úvod Názov ”algoritmus” je odvodený z mena arabského matematika Muhammad ibn Musa al- Khwarizmi (Algorizm, 770 - 840), ktorý sa narodil na území dnešného Uzbekistanu. Zaoberal sa matematikou, astronómiou a geografiou. Aj ďaľší dôležitý matematický termín ”algebra”, vznikol vďaka nemu. Slovo algebra je odvodené z názvu jeho knihy Al-Jabr wa-al-Muqabilah, v ktorej sa zaoberal riešením lineárnych a kvadratických rovníc pomocou ”al-jabr” - čiže dopĺňania (pomocou ktorého odstraňoval z rovníc členy zo záporným znamienkom) a ”al-muqabala” - čiže vyvažovanie (pomocou ktorého sa redukujú kladné členy s rovnakou mocninou ak sa vyskytujú na oboch stranách rovnice). 1.2 Neformálna definícia algoritmu Algoritmus na riešenie úlohy je postup, ktorý vedie k jej riešeniu (napríklad recept v kuchárskej knihe, návod na zloženie skrinky ap.) Predtým ako si povieme čo by mal spĺňať algoritmus, uvedieme si, aké požiadavky sú kladené na zadaný problém: 1. Presnosť - problém by mal byť definovaný dostatočne presne 2. Nemennosť - zadanie problému sa počas riešenia nesmie meniť 3. Rozhodnuteľnosť - musíme byť schopní zistiť, či už máme riešenie Keď už máme správne zadefinovaný problém, môžeme na jeho riešenie vyvinúť nejaký postup, ktorý nazývame algoritmom ak spĺňa nasledovné: 1. Determinovanosť - to znamená, že postup je zadaný formou konečného počtu jedno- značných pravidiel 2. Hromadnosť - možnosť riešiť jedným algoritmom viacero úloh toho istého typu 3. Efektívnosť alebo konečnosť - zmanená, že je zaručené vyrešenie úlohy v konečnom počte krokov Príklad 1.2.1 Riešte kvadratickú rovnicu s reálnymi koeficientami ax 2 + bx + c =0,a =0. Riešenie: x 1,2 = -b± b 2 -4ac 2a spĺňa 1), 2), 3). Príklad 1.2.2 Uvarte guláš. Riešenie: Spĺňa 1) a 3) ale nespĺňa 2). Príklad 1.2.3 Namiešajte jeden liter x-percentného roztoku alkoholu ak máte k dispozícii 100% alkohol a destilovanú vodu. Riešenie: Vezmeme x 100 litrov alkoholu, 1 - x 100 litrov čistej vody a dôkladne zmiešame. Spĺňa 1), 2) aj 3). Príklad 1.2.4 Zistite, či sa v desatinnom rozvoji čísla π nachádza za sebou desať núl. Riešenie: Program, ktorý počíta rozvoj čísla π na počítači nie je algoritmus - nevieme totižto či niekedy skončí. Tento program spĺňa 1), možno spĺňa 2) (ak sme ho napísali tak aby počítal rozvoje rôznych čísel) ale nespĺňa 3). 1.3 Formálna definícia algoritmu Predtým ako si uvedieme formálnu definíciu algoritmu, zadefinujeme si najskôr Turingov stroj. Definícia 1.3.1 Turingov stroj (TS) alebo Turingov počítač je nekonečný automat (akceptor), ktorý sa skladá z obojstranne nekonečnej pásky rozdelenej na políčka a z pohyblivej hlavy, ktorá môže čítať aj zapisovať na políčka symboly s 1 ,s 2 ,...,s k z nejakej konečnej (aspoň dvojprvkovej) abecedy. Keď je TS v stave q (v jednom z konečného počtu stavov) a čítacia hlava sníma z políčka pásky symbol s, automat TS urobí jeden z nasledujúcich krokov: Hlava vymaže z aktuálneho políčka symbol s, zapíše symbol s a TS prejde do stavu q Hlava sa posunie o jedno políčko vľavo a TS prejde do stavu q

Upload: others

Post on 19-Jun-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Časť I Algoritmy · Khwarizmi (Algorizm, 770 - 840), ktorý sa narodil na území dnešného Uzbekistanu. Zaoberal sa matematikou, astronómiou a geografiou. Aj ďaľší dôležitý

Marcel Abas 1

Časť I

Algoritmy

1 Základné pojmy a definície

1.1 Úvod

Názov ”algoritmus” je odvodený z mena arabského matematika Muhammad ibn Musa al-Khwarizmi (Algorizm, 770 - 840), ktorý sa narodil na území dnešného Uzbekistanu. Zaoberalsa matematikou, astronómiou a geografiou. Aj ďaľší dôležitý matematický termín ”algebra”,vznikol vďaka nemu. Slovo algebra je odvodené z názvu jeho knihy Al-Jabr wa-al-Muqabilah, vktorej sa zaoberal riešením lineárnych a kvadratických rovníc pomocou ”al-jabr” - čiže dopĺňania(pomocou ktorého odstraňoval z rovníc členy zo záporným znamienkom) a ”al-muqabala” - čiževyvažovanie (pomocou ktorého sa redukujú kladné členy s rovnakou mocninou ak sa vyskytujúna oboch stranách rovnice).

1.2 Neformálna definícia algoritmu

Algoritmus na riešenie úlohy je postup, ktorý vedie k jej riešeniu (napríklad recept v kuchárskejknihe, návod na zloženie skrinky ap.) Predtým ako si povieme čo by mal spĺňať algoritmus,uvedieme si, aké požiadavky sú kladené na zadaný problém:

1. Presnosť - problém by mal byť definovaný dostatočne presne2. Nemennosť - zadanie problému sa počas riešenia nesmie meniť3. Rozhodnuteľnosť - musíme byť schopní zistiť, či už máme riešenie

Keď už máme správne zadefinovaný problém, môžeme na jeho riešenie vyvinúť nejaký postup,ktorý nazývame algoritmom ak spĺňa nasledovné:

1. Determinovanosť - to znamená, že postup je zadaný formou konečného počtu jedno-značných pravidiel

2. Hromadnosť - možnosť riešiť jedným algoritmom viacero úloh toho istého typu3. Efektívnosť alebo konečnosť - zmanená, že je zaručené vyrešenie úlohy v konečnompočte krokov

Príklad 1.2.1 Riešte kvadratickú rovnicu s reálnymi koeficientami ax2 + bx+ c = 0, a 6= 0.Riešenie: x1,2 = −b±

√b2−4ac2a spĺňa 1), 2), 3).

Príklad 1.2.2 Uvarte guláš.Riešenie: Spĺňa 1) a 3) ale nespĺňa 2).

Príklad 1.2.3 Namiešajte jeden liter x-percentného roztoku alkoholu ak máte k dispozícii100% alkohol a destilovanú vodu.Riešenie: Vezmeme x

100 litrov alkoholu, 1−x

100 litrov čistej vody a dôkladne zmiešame. Spĺňa1), 2) aj 3).

Príklad 1.2.4 Zistite, či sa v desatinnom rozvoji čísla π nachádza za sebou desať núl.Riešenie: Program, ktorý počíta rozvoj čísla π na počítači nie je algoritmus - nevieme totižtoči niekedy skončí. Tento program spĺňa 1), možno spĺňa 2) (ak sme ho napísali tak aby počítalrozvoje rôznych čísel) ale nespĺňa 3).

1.3 Formálna definícia algoritmu

Predtým ako si uvedieme formálnu definíciu algoritmu, zadefinujeme si najskôr Turingov stroj.

Definícia 1.3.1 Turingov stroj (TS) alebo Turingov počítač je nekonečný automat (akceptor),ktorý sa skladá z obojstranne nekonečnej pásky rozdelenej na políčka a z pohyblivej hlavy, ktorámôže čítať aj zapisovať na políčka symboly s1, s2, . . . , sk z nejakej konečnej (aspoň dvojprvkovej)abecedy. Keď je TS v stave q (v jednom z konečného počtu stavov) a čítacia hlava sníma zpolíčka pásky symbol s, automat TS urobí jeden z nasledujúcich krokov:

• Hlava vymaže z aktuálneho políčka symbol s, zapíše symbol s′ a TS prejde do stavu q′• Hlava sa posunie o jedno políčko vľavo a TS prejde do stavu q′

Page 2: Časť I Algoritmy · Khwarizmi (Algorizm, 770 - 840), ktorý sa narodil na území dnešného Uzbekistanu. Zaoberal sa matematikou, astronómiou a geografiou. Aj ďaľší dôležitý

Kapitola 2: Zložitosť algoritmov 2

• Hlava sa posunie o jedno políčko vpravo a TS prejde do stavu q′• TS sa zastaví v jednom z konečného počtu koncových stavov (preto akceptor)

Všetky formálne definície algoritmu (napr. Turing [21], Church [7]) sa ukázali byť ekvivalentné(čo je vlastne obsahom našej definície):

Definícia 1.3.2 (Churchova téza) Každý algoritmus možno reprezentovať Turingovým strojoma obrátene, každý Turingov stroj možno realizovať nejakým algoritmom.

2 Zložitosť algoritmov

2.1 Rozhodnuteľnosť

Nie pre každý problém existuje algoritmus. V zmysle definície 1.3.2 to znamená, že neexis-tuje TS, ktorý by sa zastavil pre každý problém daného typu. Takéto problémy sa nazývajúnerozhodnuteľné. Nasleduje niekoľko nerozhodnuteľných problémov:

• Problém určiť, či daná polynomická rovnica viacerých premenných s celočíselnými koefi-cientami má celočíselné riešenie (desiaty Hilbertov problém) (vyriešil Matisajevič v [16]).• Problém určiť, či pre daný graf G0 existuje graf G (konečný alebo nekonečný) tak, že prekaždý vrchol v ∈ V (G) je podgraf Gv indukovaný vrcholovým okolím vrcholu v izomorfnýs G0 (vyriešil Bulitko v [4]).• Problém určiť, či pre daný Turingov stroj s programom a pre daný vstup TS zastaví [21].

Predtým ako sa začneme zaoberať grafovými algoritmami, uvedieme pojem zložitosti algoritmu.Neformálne môžme vysloviť nasledujúcu definíciu:

Definícia 2.1.1 Zložitosť algoritmu A odmeriava množstvo výpočtovej práce spotrebovanejpočítačom, keď riešime nejaký problém pomocou tohoto algoritmu.

Výpočtová zložitosť sa vzťahuje na počet výpočtových krokov, prevádzkový čas alebo na pamäťovémiesto. Keďže medzi prvým a druhým uvedeným nie je v podstate žiadny rozdiel, budemevýpočtovú zložitosť algoritmu uvažovať ako funkciu veľkosti vstupných dát.

Definícia 2.1.2 Dĺžka úlohy je celková dĺžka dát, ktoré túto úlohu opisujú.

Napríklad ak bude algoritmus pracovať (nejakým spôsobom) s n-prvkovou množinou, dĺžkaúlohy bude n. Väčšinou existuje viac ako jeden algoritmus na riešenie daného problému. Tietoalgoritmy sa navzájom líšia niektorými parametrami.

Príklad 2.1.1 Nájdite súradnice lokálneho extrému funkcie y = ax2+bx+c, pričom a, b, c ∈ Ra a 6= 0. Na vyriešenie tohoto jednoduchého príkladu máme k dispozícii prinajmenšom trialgoritmy:

• Nájdeme korene rovnice rovnice pomocou vzorčeka x1,2 = −b±√

b2−4ac2a (tieto korene môžu

byť aj komplexné). X−ovú súradnicu extrému xext nájdeme ako xext = x1+x22 = − b

2a .• Kvadratický trojčlen ax2 + bx+ c doplníme na tvar (úplný štvorec) a[(x+ b

2a )2− b2

4a2 + ca ].

Vidíme, že x−ová súradnicu extrému xext je rovná − b2a .

• Vypočítame deriváciu y′ = 2ax+ b a položíme ju rovnú nule. Opäť, xext = − b2a .

Všetky predchádzajúce algoritmy riešia daný problém, je však na nás, pre ktorý z nich sarozhodneme. Je zrejmé, že pre ten, ktorý bude pre nás v danej chvíli najjednoduchší.

Príklad 2.1.2 Vynásobte dve štvorcové matice stupňa n. Riešenie:

• Klasickým spôsobom. Toto vyžaduje n3 násobení a n3 − n2 sčítaní.• Winograd [23] opísal algoritmus, ktorý (pre veľké čísla) vyžaduje rádovo n3

2 násobení a3n3

2 sčítaní.• Strassen [20] vyvinul algoritmus, ktorým možno dve matice stupňa n násobiť na menejako 4.7nlog2 n aritmetických operácií, čo od istého n je menšie ako 2n3 − n2 operácií priklasickom algoritme.

Page 3: Časť I Algoritmy · Khwarizmi (Algorizm, 770 - 840), ktorý sa narodil na území dnešného Uzbekistanu. Zaoberal sa matematikou, astronómiou a geografiou. Aj ďaľší dôležitý

Kapitola 2: Zložitosť algoritmov 3

Všetky predchádzajúce príklady poukazujú na to, že je vhodné (a väčšinou aj dôležité) za-oberať sa zložitosťou algoritmov. Existuje viacero druhov zložitosti. Jedna z nich je takzvanáworst-case zložitosť, čo znamená že meriame zložitosť algoritmu v najhoršom možnom prí-pade (napríklad keď všetky prvky matíc a aj všetky medzisúčty sú nenulové). Na druhej stranena výpočet väčšiny nebudeme potrebovať až tak veľa krokov (napríklad násobenie diagonál-nych matíc). Ďaľšia zložitosť sa nazýva average-case a je to vlastne priemerný počet krokovpotrebných na výpočet súčinu dvoch matíc ak priemer robíme cez počty krokov nad všetkýmidvojicami matíc stupňa n.

Definícia 2.1.3 Algoritmus sa nazýva efektívny alebo polynomiálny, ak jeho zložitosť jepolynómom v stupnej veľkosti (povedzme n) alebo je ohraničená polynómom v n. Ak algoritmusnie je polynomiálny, nazýva sa neefektívny alebo nepolynomiálny.

Napríklad algoritmy ktorých zložitosti sú 3n+2, n2 +7,√n alebo lnn sú efektívne a algoritmy

so zložitosťami 3n resp. n! sú neefektívne.

Definícia 2.1.4 Problém sa nazýva zvládnuteľný, ak existuje efektívny algoritmus, ktorý horieši. Problém sa nazýva nezvládnuteľný alebo beznádejný ak môže byť dokázané, že najeho riešenie neexistuje žiadny polynomiálny algoritmus.

Príklad 2.1.3 Problém kachličkovania (Wilf [22]). Ak máme daný mnohouholník, treba určiť,či sa ním dá vykachličkovať celá rovina bez medzier. Berger v [3] dokázal, že tento problém jebeznádejný, čiže neexistuje žiadny efektívny algoritmus na určenie či rovina môže byť vykach-ličkovaná daným mnohouholníkom. Samozrejme pre niektoré mnohouholníky existuje riešenie(napr. pre pravideľné mnohouholníky, ako uvidíme v cvičení 2.2.1).

2.2 Asympotická zložitosť

Aby sme mohli zložitosť algoritmov porovnávať, zavádzame pojem takzvaného ”stupňa” funkcie.To zhruba povedané znamená, že porovnávame asymptotickú rýchlosť rastu funkcií - čižerýchlosť rastu pre veľké hodnoty n.

Definícia 2.2.1 Nech f a g sú dve nezáporné funkcie definované na množine N prirodzenýchčísel. Hovoríme, že stupeň funkcie f je menší alebo rovný stupňu funkcie g, ak existuje kladnáreálna konštanta c a prirodzené číslo n0 také, že f(n) ≤ cg(n) pre všetky n > n0.

Ak stupeň funkcie f je menší alebo rovný ako stupeň funkcie g, píšeme f(n) = Og(n). Toznamená, že f nerastie rýchlejšie ako g; môže rásť pomalšie alebo rovnako rýchlo. Funkciemajú rovnaký stupeň ak f(n) = Og(n) a g(n) = Of(n). Toto označenie sa v matematike častovyskytuje pod názvom O-symbolika.

Definícia 2.2.2 Hovoríme že algoritmus má zložitosť Of(n), ak pre každé dostatočne veľkén vyrieši každú úlohu dĺžky n v čase Of(n). Podobne, úloha má zložitosť Of(n) ak pre ňuexistuje Of(n) algoritmus. Ak algoritmy A a B majú funkcie zložitosti f(n) a g(n), hovoríme,že algoritmus A je efektívnejší ako algoritmus B ak f(n) = Og(n) ale g(n) 6= Of(n).

Príklad 2.2.1 Usporiadajte čísla a1, a2, . . . , an do neklesajúcej postupnosti.Riešenie: Na vyhľadanie najmenšieho ai je potrebné O(n) operácií, preto na usporiadanie jepotrebných O(n2) operácií. Pre úlohu usporiadania máme teda O(n2) algoritmus. Najefek-tívnejší algoritmus na vyriešenie tejto úlohy má zložitosť O(n log2 n) a napr. v práci [15] jedokázané, že lepší algoritmus už neexistuje.

Na záver tejto kapitoly uvedieme ešte hierarchiu neklesajúcich stupňov:

O(1), O(log2 n), O(n), O(n log2 n), O(n2), . . . , O(2n), O(n!)

Cvičenia k časti 2

Cvičenie 2.2.1 Zistite pre ktoré n ∈ {3, 4, 5, 6, 7} môžeme vykachličkovať rovinu pravidelnýmin-uholníkmi (v príklade 2.1.3 sme si povedali, že tento problém je beznádejný; čiže neexistujepolynomiálny algoritmus).

Cvičenie 2.2.2 Nech f(n) = 8n+ 3 a g(n) = n2

2 . Ukážte že f(n) = O(g(n)). Poznámka:

Page 4: Časť I Algoritmy · Khwarizmi (Algorizm, 770 - 840), ktorý sa narodil na území dnešného Uzbekistanu. Zaoberal sa matematikou, astronómiou a geografiou. Aj ďaľší dôležitý

Kapitola 2: Zložitosť algoritmov 4

1) Zvolíme n0.2) Zvolíme c.3) Zistíme pre aké n0 platí: n2

2 ≥ 8n+ 3.4) Porovnáme.

Cvičenie 2.2.3 Ukážte že pre f(n) = 3n2 + 5n+ 4 platí f(n) = O(n3).

Cvičenie 2.2.4 Ukážte že f(n) = 3n2 + 7n+ 5 a g(n) = 5n2 + 2) majú rovnaký stupeň.

Cvičenie 2.2.5 Dokážte, že:

a) log2 n = O(n). (Návod: ukážte, že n = O(2n)).a) log2 n a log5 n majú rovnaký stupeň. (Návod: loga b = logc b

logc a ).c) O(an) 6= O(bn) pre a, b ∈ N , a 6= b

Cvičenie 2.2.6 Dokážte, že log2 n = O(n) ale O(log2 n) 6= O(n). (Návod: vychádzajúc zdefinície ukážte, že n 6= O(log2 n)).

Cvičenie 2.2.7 Majme dané algoritmy A a B s funkciami zložitosti f(n) a g(n). Zistite ktorýz týchto algoritmov je efektívnejší resp. či f(n) a g(n) majú rovnaké zložitosti:

a) f(n) = n4 + 5n3√n a g(n) = 3n3 log2 n+ 6n

b) f(n) = 3n + n5 a g(n) = 3n+109+ 1020n5

c) f(n) = 5n + 400n1000 a g(n) = n! + n2

Cvičenie 2.2.8 Napíšte algoritmus, ktorý určí najväčšie číslo zo zoznamu n čísel. Aká je jehozložitosť?

Cvičenie 2.2.9 Napíšte algoritmus na usporiadanie zoznamu n čísel podľa veľkosti. Aká jejeho zložitosť?

2.3 NP a NP-úplné problémy

V teórii algoritmov sa veľmi často vyskytujú redukcie úloh; to znamená, že sa jedna úlohapretransformuje na druhú. Pritom skutočný význam majú len takzvané polynomiálne transfor-mácie. Uveďme si najskôr niektoré definície.

Definícia 2.3.1 Nech problém P má vstupné dátaD a riešenie R a nech problém P má vstupnédáta D a riešenie R. Ak prerobíme vstupné dáta D problému P na vstupné dáta D problémuP tak, že potom dokážeme prerobiť riešenie R na riešenie R, hovoríme, že sme problém Ptransformovali na problém P . Ak prerobenie z D do D a z R do R vyžaduje len polynomiálneveľa elementárnych operácií vzhľadom na dĺžku D, transformácia sa nazýva polynomiálna.Predchádzajúce zapisujeme P ∝ P a hovoríme, že problém P sa dá polynomiálne redukovaťna P . Problémy P a P nazývame polynomiálne ekvivalentné, ak môžeme polynomiálneredukovať P na P a obrátene.

V roku 1971 zadefinoval Cook [8] triedu takzvaných NP-rozhodovacích problémov. NP-rozhodovacie problémy sú problémy, ktorých riešenie je ”áno” alebo ”nie”, pričom ich ”áno” sadá overiť v polynomiálnom čase.

Príklad 2.3.1 Má rovnica x4 + 4x3 + 6x2 + 4x + a celočíselné riešenie? Ak je odpoveď áno,môžeme to overiť v polynomiálnom čase (napr. priamym dosadzovaním uhádnutého riešenia).

Pre formálne účely sa zavádza pojem nedeterministický polynomiálny (NP - nondeter-ministic polynomially) Turingov stroj. Tento NP TS rieši úlohu v dvoch krokoch. V prvomkroku uhádne správne riešenie, čiže prípustné hodnoty (odpoveď je áno) a v druhom kroku totoriešenie v polynomiálnom čase overí. V prípade že riešenie je ”nie” dáva odpoveď nie alebo sanikdy nezastaví. My už sme si spomínali, že algoritmus sa dá definovať ako Turingov stroj.Podobne aj pri NP TS sa zavádza pojem nedeterministický algoritmus (vidíme, že v tomtoprípade už nepoužívame slovíčko ”polynomiálny” ale treba mať na pamäti, že polynomialita jevyžadovaná).

Page 5: Časť I Algoritmy · Khwarizmi (Algorizm, 770 - 840), ktorý sa narodil na území dnešného Uzbekistanu. Zaoberal sa matematikou, astronómiou a geografiou. Aj ďaľší dôležitý

Kapitola 3: Grafové algoritmy 5

Definícia 2.3.2 Trieda NP problémov je trieda všetkých rozhodovacích problémov, ktoré sadajú vyriešiť nejakým nedeterministickým algoritmom.

Na predchádzajúcej prednáške sme si spomínali, že každý problém je buď zvládnuteľný alebobeznádejný, pričom však nie vždy je známe do ktorej triedy daný problém patrí. Medzi týmitodvomi typmi stojí trieda NP-úplných problémov. Všetky problémy z tejto triedy sú rovno-cenné v tom zmysle, že existencia efektívneho algoritmu pre vyriešenie ľubovoľného z problémovzaručuje existenciu efektívneho algoritmu pre vyriešenie ostatných problémov. To čo sme právepovedali nám však nedefinuje NP-úplné problémy, iba hovorí o ich vlastnostiach. Vyslovmeteraz definíciu NP-úplných problémov.

Definícia 2.3.3 Trieda NP-úplných problémov pozostáva zo všetkých NP problémov P stakou vlastnosťou, že každý iný problém z NP sa dá polynomiálne transformovať na niektorýproblém P .

Príklad 2.3.2 SAT - Problém splniteľnosti (satisfiability problem): Je daná konjunk-tívna normálna forma (boolovský výraz) nad premennými x1, x2, . . . , xn. Treba zistiť, či exis-tujú pravdivostné hodnoty premenných x1, x2, . . . , xn, tak aby tento výraz bol pravdivý.

Veta 2.1 Problém SAT je NP-úplný (Cook [8]).

Veta 2.2 Problém 3SAT (t. j. SAT pre tri premenné) je NP-úplný (pozri [5]).

Na záver tejto časti ešte poznámka o P a NP-ťažkých problémoch. Trieda P problémovje trieda všetkých zvládnuteľných problémov (t. j. takých pre ktoré existuje polynomiálnyalgoritmus). Je zrejmé, že každý P problém je aj NP problém. Či platí aj opačné tvrdenie je vsúčasnosti možno najdôležitejším nevyriešeným (rozhodovacím) problémom. Na druhej strane,NP-ťažký problém P je rozhodovací problém, pre ktorý existuje NP-úplný problém P , ktorýsa dá polynomiálne redukovať na P ; t. j. P ∝ P . To čo sme povedali o NP-ťažkých problémochznamená, že ich riešenie je aspoň také tažké, ako riešenie NP-úplných problémov.

3 Grafové algoritmy

3.1 Hamiltonovské grafy a úloha obchodného cestujúceho

V minulom semestri sme si spomínali niektoré grafy so špeciálnymi vlastnosťami. Medzi nepatria napríklad Eulerovské grafy, čiže súvislé grafy obsahujúce kružnicu v ktorej sa vyskytujúvšetky hrany grafu. Ďaľší druh grafov, ktoré sú charakterizované veľmi jednoducho sú takzvanéhamiltonovské grafy. Uvedieme si teraz definíciu hamiltonovských grafov a niektoré výsledkydosiahnuté pri ich skúmaní.

Definícia 3.1.1 Kružnica obsahujúca všetky vrcholy grafuG sa nazýva hamiltonovská kružni-ca. Súvislý graf sa nazýva hamiltonovský, ak obsahuje hamiltonovskú kružnicu. Cesta ob-sahujúca všetky vrcholy grafu sa nazýva hamiltonovská cesta.

Názov ”hamiltonovské” je odvodený z mena írskeho matematika Williama Rowana Hamiltona,ktorý v roku 1857 vymyslel hru ”Okolo sveta”. Hra vyzerala nasledovne. V pravidelnomdvanásťstene (ktorý má 20 vrcholov, 30 hrán a 12 oblastí), boli vrcholom priradené názvy naj-známejších miest v histórii. Úlohou bolo nájsť cestu (čiže prejsť po hranách dvanásťstena) ktoráprechádza každým vrcholom práve raz a vracia sa do východzieho mesta.

Jednoduchá charakterizácia hamiltonovských grafov (ako sme mali v prípade eulerovskýchgrafov) neexistuje. Na jednej strane je zrejmé, že žiadny súvislý graf s artikuláciou nie jehamiltonovský. V skutočnosti je dokázané, že problém určiť, či v danom grafe existuje hamil-tonovská kružnica je NP-úplný ([13]). Na druhej strane však jestvuje niekoľko postačujúcichpodmienok, ktoré nám zaručia existencie hamiltonovskej kružnice v grafe s danými vlastnosťa-mi.

Veta 3.1 Nech G je súvislý graf s n ≥ 3 vrcholmi. Ak pre každý vrchol v grafu G je deg(v) ≥ n2 ,

graf G je hamiltonovský (Dirac, [10]).

Táto veta je užitočná, ak máme do činenie s grafmi s veľkými stupňami vrcholov. Avšaknapríklad pre kružnice dĺžky väčšej ako štyri ju nemôžme použiť i keď tieto cykly sú už samio sebe hamiltonovskými kružnicami. Nasledujúce dve vety si nekladú až také veľké nároky nastupne vrcholov. Prvá z nich je tzv. veta Bondyho - Chvátalova.

Page 6: Časť I Algoritmy · Khwarizmi (Algorizm, 770 - 840), ktorý sa narodil na území dnešného Uzbekistanu. Zaoberal sa matematikou, astronómiou a geografiou. Aj ďaľší dôležitý

Kapitola 3: Grafové algoritmy 6

Veta 3.2 Nech G je súvislý graf s n ≥ 3 vrcholmi. Nech u a v sú nesusedné vrcholy také,že deg(u) + deg(v) ≥ n. Potom G je hamiltonovský graf vtedy a len vtedy, keď G + uv jehamiltonovský graf (Bondy a Chvátal [2]).

Nasledujúca veta je dôsledkom Bondyho - Chvátalovej vety.

Veta 3.3 Nech G je súvislý graf s n ≥ 3 vrcholmi. Ak deg(u) + deg(v) ≥ n pre všetky dvojicenesusedných vrcholov u, v, potom G je hamiltonovský graf (Ore, [18]).

Jedným z najznámejších NP-úplných problémov je problém obchodného cestujúceho, ktorý úzkosúvisí s Hamiltonovskými grafmi. Samozrejme, aj takéto problémy treba riešiť a preto sa nariešenie takýchto úloh vyvíjajú efektívne algoritmy, ktoré približne riešia danú úlohu. Ak úlohaje minimalizačná s kladnou minimálnou hodnotou w′ a vieme zaručiť, že náš algoritmus nájderiešenie s hodnotou w, pričom w

w′ ≤ ρ, takýto algoritmus sa nazýva ρ-aproximačný ([19]).

Problém 3.1 TSP - Úloha obchodného cestujúceho (Traveling salesman problem).Obchodný cestujúci má navštíviť n miest, každé len raz a na záver sa má vrátiť do východziehomesta tak, aby precestoval čo najmenej. Je to vlastne úloha nájsť najlacnejšiu hamiltonovskúkružnicu v ohodnotenom grafe G v ktorom platí trojuholníková nerovnosť, pričom vrcholygrafu G reprezentujú mestá a hodnota hrany uv predstavuje priamu vzdialenosť z mesta oz-načeného u do mesta označeného v. Pritom môžeme bez ujmy na všeobecnosti predpok-ladať, že graf G je kompletný; ak totiž neexistuje priama cesta z u do v, definujeme hodnotuw(uv) = d(u, v). Takúto najlacnešiu hamiltonovskú kružnicu budeme nazývať minimálnahamiltonovská kružnica grafu G.

Ak chceme nájsť riešenie TSP pre n miest, je potrebné vypočítať cenu všetkých (n−1)!2 hamil-

tonovských kružníc v kompletnom grafe Kn. Zložitosť takéhoto algoritmu je O(n!) a zjavnenie je polynomiálna. Doteraz nebol nájdený žiadny polynomiálny algoritmus na riešenie tejtoúlohy. Dokonca nasledujúci jednoduchší problém podobný TSP je NP-úplný.

Veta 3.4 Majme ohodnotený kompletný graf G a kladné číslo c. Problém určiť, či sa v Gnachádza hamiltonovská kružnica K tak, že w(K) ≤ c je NP-úplný ([5]).

K úlohe obchodného cestujúceho vedie aj niekoľko ďaľších problémov. Spomenieme aspoň jedenz nich.

Problém 3.2 Schéma vedenia. Treba navrhnúť počítačový systém. Tento systém pozostá-va z viacerých modulov (fyzické umiestnenie každého modulu je už vopred určené), pričomkaždý modul má niekoľko konektorov. Chceme pospájať drôtmi (káblami) danú podmnožinukonektorov pri splnení nasledujúcich predpokladov:

a) Z každého konektora vedú najviac dva drôty (kvôli veľkosti a možným budúcim zmenám vusporiadaní drôtov)

b) celková dĺžka drôtov by mala byť minimálna (kvôli jednoduchosti a prehľadnosti vedenia)

Táto situácia môže byť opísaná pomocou ohodnoteného kompletného grafu G. Jeho vrcholyzodpovedajú danej množine konektorov označených k1, k2, . . . , kn. Hodnota (cena, váha) wij

hrany spájajúcej konektory ki a kj je rovná skutočnej vzdialenosti medzi konektormi ki a kj .Pritom podmienka a) hovorí, že chceme nájsť hamiltonovskú cestu v G, zatiaľ čo podmienkab) hovorí, že takáto cesta musí mať minimálnu dĺžku. Ak pridáme fiktívny vrchol označený k0

tak, že w0i = 0 pre všetky 1 ≤ i ≤ n, problém vedenia sa transformuje na úlohu obchodnéhocestujúceho pre (n+ 1) miest (pozri [5]).

Teraz uvedieme niekoľko algoritmov na nájdenie minimálnej hamiltonovskej kružnice. Ako smeuž spomínali, v skutočnosti budeme hľadať iba hamiltonovskú kružnicu s nízkou hodnotou -teda nie nutne minimálnu.

Prvý algoritmus používa metódu greedy - tzv. nenásytného algoritmu, čo znamená, že v každommomente sa riadi pravidlom ”ber to najlepšie”. V tomto algoritme budeme používať označenieCp pre p−cykly, pričom C1 bude označovať jednoduchý vrchol a symbol C2 bude označovaťkružnicu s vrcholmi u− v − u.

Algoritmus 3.1.1 Metóda greedy algoritmu(Na nájdenie hamiltonovskej kružnice s nízkou hodnotou v ohodnotenom kompletnom grafe Grádu n ≥ 3 spĺňajúcom trojuholníkovú nerovnosť.)

Page 7: Časť I Algoritmy · Khwarizmi (Algorizm, 770 - 840), ktorý sa narodil na území dnešného Uzbekistanu. Zaoberal sa matematikou, astronómiou a geografiou. Aj ďaľší dôležitý

Kapitola 3: Grafové algoritmy 7

1. p←− 1(V tomto kroku inicializujeme parameter p, ktorý reprezentuje dĺžku cyklu)

2. Vyberieme ľubovoľný vrchol v ∈ G na vytvorenie cyklu Cp

(inicializujeme cyklus Cp)3. Ak p < n, nájdi nejaký vrchol vp ktorý neleží na Cp a taký, že váha nejakej hrany upvp,kde up je na Cp je minimálna a choď na Krok 4. Inak je Cn požadovaná hamiltonovskákružnica.(Ak súčasný cyklus nie je hamiltonovský, tento krok nájde nejaký vrchol, ktorý neleží natomto cykle. Tento vrchol bude použitý v Kroku 4 na zväčšenie cyklu.)

4. Nech Cp+1 je cyklus získaný z Cp vložením vrcholu vp bezprostredne pred vrchol up

(Tento krok zväčší súčasný cyklus Cp)5. p←− p+ 1 a choď na Krok 3(Tento krok zväčší parameter p)

Poznámka 1 Ako sme už spomenuli skôr, ak G je ohodnotený a nie kompletný graf spĺňajúcitrojuholníkovú nerovnosť, môžeme z neho vyrobiť kompletný graf G′ tak, že ak hrana uv neležív grafe G, do grafu G′ pridáme hranu uv s váhou dG(u, v). Je zrejmé, že aj graf G′ spĺňatrojuholníkovú nerovnosť a preto môžeme aplikovať algoritmus 3.1.1. Táto poznámka sa vzťahujeaj na nasledujúce dva algoritmy.

Algoritmus 3.1.2 Metóda zdvojenia kostry (Kim [14])(Na nájdenie hamiltonovskej kružnice s nízkou hodnotou v ohodnotenom kompletnom grafe Grádu n ≥ 3 spĺňajúcom trojuholníkovú nerovnosť.)

1. Nájdeme najlacnejšiu kostru T ohodnoteného grafu G (napríklad Kruskalovým algorit-mom).

2. Urobíme prehľadanie kostry T do hĺbky.3. Ak vi1 , vi2 , . . . , vin

je poradie v akom navštívime vrcholy v Kroku 2, výstupom budehamiltonovská kružnica vi1 , vi2 , . . . , vin

, vi1 .

Veta 3.5 Nech C ′ je minimálna hamiltonovská kružnica v kompletnom ohodnotenom grafeG spĺňajúcom trojuholníkovú nerovnosť. Potom algoritmy 3.1.1 a 3.1.2 dávajú hamiltonovskýcyklus s cenou w(C) tak, že platí: c(Z)

c(Z′) < 2. To znamená, že tieto algoritmy sú 2-aproximačné.

Algoritmus 3.1.3 Metóda kostry a párenia (Christofides [6])(Na nájdenie hamiltonovskej kružnice s nízkou hodnotou v ohodnotenom kompletnom grafe Grádu n ≥ 3 spĺňajúcom trojuholníkovú nerovnosť.)

1. Nájdeme najlacnejšiu kostru T ohodnoteného grafu G.2. Určíme množinu V0 = {v ∈ V (G)|degT (v)je nepárne číslo}(Množina V0 pozostáva zo všetkých vrcholov kostry T , ktoré majú nepárny stupeň. Jezrejmé, že množina V0 je neprázdna a má párny počet prvkov.)

3. V grafe G(V0) nájdeme najlacnejšie úplné párenie X(Graf G(V0) je podgraf grafu G indukovaný množinou vrcholov V0)

4. Pridáme hrany párenia X ku kostre T a v získanom eulerovskom multigrafe T nájdemeeulerovský ťah S.

5. Ak vi1 , vi2 , . . . , vinje poradie v akom navštívime vrcholy v Kroku 4, výstupom bude

hamiltonovská kružnica vi1 , vi2 , . . . , vin , vi1 .

Veta 3.6 Nech C ′ je minimálna hamiltonovská kružnica v kompletnom ohodnotenom grafeG spĺňajúcom trojuholníkovú nerovnosť. Potom algoritmus 3.1.3 dáva hamiltonovský cyklus scenou w(C) tak, že platí: c(Z)

c(Z′) <32 , čiže algoritmus je

32 -aproximačný.

Poznámka 2 Zložitosť predchádzajúcich troch algoritmov je vo všetkých prípadoch O(n3).

Cvičenia k časti 3.1

Cvičenie 3.1.1 Ukážte, že kompletný graf Kn s aspoň tromi vrcholmi obsahuje(n−1)!

2 hamil-tonovských kružníc.

Page 8: Časť I Algoritmy · Khwarizmi (Algorizm, 770 - 840), ktorý sa narodil na území dnešného Uzbekistanu. Zaoberal sa matematikou, astronómiou a geografiou. Aj ďaľší dôležitý

Kapitola 3: Grafové algoritmy 8

Cvičenie 3.1.2 Použitím algoritmu 3.1.1 pre inicializačný vrchol vi, i = 1, 2, 3, 4, 5 a tiež po-mocou algoritmu 3.1.2 nájdite aproximáciu minimálnej hamiltonovskej kružnice v ohodnotenomkompletnom grafe danom maticou A, pričom platí: aij = w(vi, vj).

A =

0 3 5 2 43 0 5 4 65 5 0 6 32 4 6 0 54 6 3 5 0

Cvičenie 3.1.3 Použitím algoritmov 3.1.1 a 3.1.2 nájdite aproximáciu minimálnej hamiltonovskejkružnice v ohodnotenom kompletnom grafe danom maticou A, pričom platí: aij = w(vi, vj).

A =

0 3 3 2 7 33 0 3 4 5 53 3 0 1 4 42 4 1 0 5 57 5 4 5 0 43 5 4 5 4 0

3.2 Vzdialenosti v grafoch

Príklad 3.2.1 Predpokladajme, že v cestnej sieti máme nájsť najkratšie spojenie medzi mes-tami u a v. V grafovej terminológii to zodpovedá úlohe nájsť najkratšiu u − v cestu v kladneohodnotenom grafe (prípadne multigrafe) G, pričom vrcholy u, v sú spojené hranou s hodnotouw(u, v), ak mestá u, v sú priamo spojené cestou dĺžky w(u, v).

Príklad 3.2.2 Vo viacprocesorovom počítači má byť zaslaná správa (dáta) z procesora pi doprocesora pj v čo najkratšom čase. V grafovej terminológii procesorom zodpovedajú vrcholya dva vrcholy sú spojené hranou, ak dva procesory sú spojené priamo. Úloha potom je nájsťnajkratšiu u− v cestu v grafe G.

Príklad 3.2.3 V mestskej cestnej sieti máme nájsť najkratšie spojenie medzi objektom u aobjektom v. V grafovej terminológii križovatkám zodpovedajú vrcholy grafu a vrcholy u a v súspojené ohodnotenou orientovanou hranou s hodnotou w(u, v), ak križovatky u, v sú spojenécestou dĺžky w(u, v) (pričom treba brať do úvahy aj možné obmedzenia - jednosmernosť).Grafovou úlohou je potom nájsť najkratšiu orientovanú u − v cestu v ohodnotenom digrafe(prípadne multidigrafe) G.

V malých grafoch nie je problém určiť dané vzdialenosti metódou pokus-omyl. Avšak vo väčšíchgrafoch (či už máme na mysli počet vrcholov alebo hrán) už takýto prístup nie je príliš vhodný.Vidíme, že v podstate potrebujeme tri algoritmy: na určenie najkratšej cesty v grafe, najkratšejcesty v ohodnotenom grafe a najkratšej orientovanej cesty v ohodnotenom digrafe. Pred uve-dením algoritmov na hľadanie najkratších ciest v grafoch si uvedieme niektoré definície.

Definícia 3.2.1 Nech G je neohodnotený, neorientovaný graf. Vzdialenosť dG(u, v) vrcholovu a v grafu G je dĺžka najkratšej u− v cesty v grafe G.

Definícia 3.2.2 Nech G je neohodnotený, orientovaný graf. Vzdialenosť dG(u, v) z vrcholuu grafu G do vrcholu v grafu G je dĺžka najkratšej orientovanej u− v cesty v grafe G.

Definícia 3.2.3 Nech G je nezáporne ohodnotený, neorientovaný graf. Vzdialenosť dG(u, v)vrcholov u a v grafu G je dĺžka u − v cesty v grafe G, ktorej súčet hodnôt hrán jeminimálny.

Definícia 3.2.4 Nech G je nezáporne ohodnotený, orientovaný graf. Vzdialenosť dG(u, v) zvrcholou u grafu G do vrcholu v grafu G je dĺžka orientovanej u−v cesty v grafe G, ktorejsúčet hodnôt šípov je minimálny.

Vo všetkých predchádzajúcich definíciách definujeme dG(u, v) = ∞, ak v grafe G neexistujeu − v cesta, resp. orientovaná u − v cesta. Ak nemôže prísť k nedorozumenie o ktorý graf sajedná, píšeme jednoducho d(u, v) namiesto dG(u, v).

Page 9: Časť I Algoritmy · Khwarizmi (Algorizm, 770 - 840), ktorý sa narodil na území dnešného Uzbekistanu. Zaoberal sa matematikou, astronómiou a geografiou. Aj ďaľší dôležitý

Kapitola 3: Grafové algoritmy 9

Prvý z algoritmov, ktorý si uvedieme je Moorov algoritmus [17], ktorý na určenie najkratšeju − v cesty v neohodnotenom grafe používa postup do šírky (čiže je to breadth-first searchalgoritmus). V tomto algoritme vrcholom grafu postupne priraďujeme značky, ktoré predstavujúaktuálne vzdialenosti vrcholov od vrchola u. Na začiatku priradíme vrcholu u značku 0; t. j.l(u) = 0 (lebo vzdialenosť vrcholu u od u je 0) a ostatným vrcholom priradíme značku ∞; t.j. l(w) = ∞ ∀w 6= u. V ďaľšom kroku priradíme všetkým vrcholom susedným s vrcholom uznačku 1 a tak ďalej. Budeme používať zásobník FIFO a symbolom ”X ←↩ x” budeme značiťpridanie prvku x do zásobníka X.

Algoritmus 3.2.1 Moorov elgoritmus(Na nájdenie vzdialenosti d(u, v) a najkratšej u − v cesty v neohodnotenom neorientovanomgrafe G.)

1. l(u)←− 0, l(w)←−∞ ∀w 6= u, Z ←↩ u(V tomto kroku dostane vrchol u značku l(u) = 0 a vrcholy w 6= u dostanú značkul(w) = ∞. Zásobník Z obsahuje označkované vrcholy w, l(w) 6= ∞, ktorých susednévrcholy musia byť ešte prehliadané. Na začiatku obsahuje zásobník Z iba vrchol u.)

2. Ak Z 6= ∅, vymaž zo zásobníka prvý vrchol z; inak koniec, pretože v G neexistuje u − vcesta

3. Pre každý vrchol y susedný so z a taký, že l(y) =∞ :RODIC(y)←− z, l(y)←− l(z) + 1, Z ←↩ y(Označme symbolomRODIC(y) rodiča vrchola y v koreňovom breadth-first search strome.Každému vrcholu y susednému so z a ešte stále označenému ∞ priradíme vrchol z akorodiča a vymeníme značku l(y) za značku l(z)+1, ktorej hodnota je konečná. Táto značkamá hodnotu vzdialenosti y od u. Následne pridáme y do Z.)

4. Ak l(v) =∞, choď na Krok 2, inak choď na Krok 55. (V tomto kroku nájdeme najkratšiu u− v cestu v grafe G)5.1 k ←− l(v), uk ←− v5.2 Ak k 6= 0, priraď uk−1 ←− RODIC(uk); inak choď na Krok 5.45.3 k ←− k − 1, choď na Krok 5.25.4 Výstup u0, u1, . . . , uk je najkratšia u− v cesta (ktorá nemusí byť jediná).

Malou zmenou predchádzajúceho algoritmu môžeme získať algoritmus, ktorý nám určí vzdiale-nosti z daného pevného vrcholu u grafu G do všetkých ostatných vrcholov grafu.

Algoritmus 3.2.2 (Nájde vzdialenosti d(u, v) pevného vrcholu u v grafe G k ostatným vr-cholom grafu G.)

1. l(u)←− 0, l(w)←−∞ ∀w 6= u, Z ←↩ u2. Ak Z 6= ∅, vymaž zo zásobníka prvý vrchol z a choď na Krok 43. Ak Z = ∅, výstup sú dvojice (v, l(v)) pre všetky vrcholy grafu G, STOP.4. Pre každý vrchol y susedný so z a taký, že l(y) =∞ :l(y)←− l(z) + 1, Z ←− y. Choď na Krok 2.

Algoritmus 3.2.1 sa dá po malej modifikácii použiť aj na nájdenie najkratšej u − v cesty vneohodnotenom orientovanom grafe - jednoducho v Kroku 3 algoritmu 3.2.1 napíšeme ”Prekaždý vrchol y do ktorého vchádza šíp z vrchola z” namiesto ”Pre každý vrchol y susedný soz”. Podobná úvaha platí aj pre algoritmus 3.2.2.

Poznámka 3 Zložitosť algoritmu 3.2.1 je O(m), pričom m je počet hrán grafu G.

Ako sme už videli v príklade 3.2.3, niekedy je potrebné uvažovať aj ohodnotené grafy. V príklade3.2.3 sa môže jednať napríklad o hasičov, políciu alebo rýchlu zdravotnú pomoc, ktorá potre-buje nájsť najkratšiu cestu k miestu zásahu. Moorov algoritmus je navrhnutý na vyhľadanienajkratšej cesty v neohodnotenom grafe, nedá sa však použiť v ohodnotenom grafe. V ohod-notenom prípade použijeme Dijkstrov algoritmus [9]. Najskôr niečo k označovaniu v algoritme3.2.3. Nech u0 je vrchol ohodnoteného grafu G a nech P je vlastná podmnožina V (G) taká, žeu0 ∈ P . Nech P = V (G) \ P a definujme vzdialenosť vrcholu u0 od P ako

d(u0, P ) = min{d(u0, x)|x ∈ P}.

Ľahko vidno, že d(u0, P ) = ∞ vtedy a len vtedy ak neexistuje žiadna cesta z u0 do nejakéhovrcholu P . V tomto algoritme, tak ako v predošlom, budeme vrcholom priraďovať značky;ak vrchol bude ležať v množine P , značka sa už nebude meniť - bude to trvalá značka a akvrchol bude z množiny P , značka bude dočasná - čiže sa ešte môže meniť. Ešte podotýkame,že Dijkstrov algoritmus sa dá aplikovať aj na neohodnotený graf - stačí ak všetkým hranámpriradíme rovnakú kladnú hodnotu, napríklad 1. V tomto prípade sa značka každej hrany zmenínanajvýš raz.

Page 10: Časť I Algoritmy · Khwarizmi (Algorizm, 770 - 840), ktorý sa narodil na území dnešného Uzbekistanu. Zaoberal sa matematikou, astronómiou a geografiou. Aj ďaľší dôležitý

Kapitola 3: Grafové algoritmy 10

Algoritmus 3.2.3 Dijkstrov algoritmus(Nájde vzdialenosti pevného vrcholu u0 v nezáporne ohodnotenom grafe G s n vrcholmi kostatným vrcholom grafu G.)

1. i ←− 0, P ←− u0, P ←− V (G) \ {u0}, l(u0) ←− 0, l(v) ←− ∞ ∀v ∈ V (G) \ {u0}. Akn = 1 STOP, inak pokračuj.(V tomto kroku priradíme vrcholu u0 značku 0 a všetkým ostatným vrcholom značku ∞.Množina P , pozostávajúca zo všetkých vrcholov ktorých vzdialenosť od u0 už bola určená,na začiatku obsahuje iba vrchol u0.)

2. Pre každý vrchol v ∈ P taký, že uiv ∈ E(G) urob nasledovné: Ak l(v) ≤ l(ui) + w(uiv)pokračuj; inak l(v)←− l(ui) + w(uiv) a RODIC(v)←− ui.(V tomto kroku, ak je to potrebné, aktualizujeme značky vrcholov v z P , ktoré sú susednés ui. Ak značka l(v) vrcholu v susedného s ui je zmenená, rodičom vrcholu v sa stanevrchol ui .)

3. Určíme číslo m = min{l(v)|v ∈ P}. Ak vrchol vj ∈ P je vybraný ako vrchol pre ktorýplatí l(vj) = m potom výstupom bude m ako vzdialenosť u0 a vj a priradíme ui+1 ←− vj .(V tomto kroku určíme ďaľší vrchol ui+1 z P , pre ktorý vzdialenosť d(u0, ui+1) bolanájdená.)

4. P ←− P ∪ {ui+1} a P ←− P \ {ui+1}.(V tomto kroku zväčšíme množinu P vrcholov v, ktorých vzdialenosť d(u0, v) už bolaurčená a patrične zmeníme množinu P .)

5. i←− i+ 1. Ak i = n− 1, STOP, inak choď na Krok 2.(Aktualizujeme hodnotu indexu i a zisťujeme, či sme už skončili.)

Poznámka 4 Zložitosť algoritmu 3.2.3 je O(n2), pričom n je počet vrcholov grafu G.

Cvičenia k časti 3.2

Cvičenie 3.2.1 Pomocou algoritmu 3.2.1 nájdite najkratšiu cestu z vrcholu a do vrcholu x vgrafe na obrázku č. 3.2.1.

�a x

Obrázok 3.2.1: K cvičeniu č. 3.2.1

Cvičenie 3.2.2 Pomocou algoritmu 3.2.2 nájdite vzdialenosti vrcholu a od všetkých ostatnýchvrcholov grafu na obrázku č. 3.2.2.

�a b c d

efg

h i j

Obrázok 3.2.2: K cvičeniu č. 3.2.2

Cvičenie 3.2.3 Pomocou algoritmu 3.2.3 nájdite vzdialenosti vrcholu a od všetkých ostatnýchvrcholov grafu na obrázku č. 3.2.3.

Page 11: Časť I Algoritmy · Khwarizmi (Algorizm, 770 - 840), ktorý sa narodil na území dnešného Uzbekistanu. Zaoberal sa matematikou, astronómiou a geografiou. Aj ďaľší dôležitý

Kapitola 3: Grafové algoritmy 11

�ab c

d

ef

g

h

137

1012

4

127

5

1315

61

8

Obrázok 3.2.3: K cvičeniu č. 3.2.3

Cvičenie 3.2.4 V grafe na obrázku 3.2.4 nájdite:

1. Najkratšiu b− e cestu pomocou algoritmu 3.2.12. Vzdialenosti z vrcholu g do ostatných vrcholov grafu pomocou algoritmu 3.2.23. Vzdialenosti z vrcholu h do ostatných vrcholov grafu pomocou algoritmu 3.2.3

�ab c

d

efg

h

Obrázok 3.2.4: K cvičeniu č. 3.2.4

Cvičenie 3.2.5 Pomocou algoritmu 3.2.3 nájdite vzdialenosti vrcholu a od všetkých ostatnýchvrcholov grafu na obrázku č. 3.2.5.

�a b cd

e f g

h i j

4

2

1

3

2 1

2 1

4

1 2

2 1

2

2

Obrázok 3.2.5: K cvičeniu č. 3.2.5

3.3 Toky v sieťach, veta o maximálnom toku a minimálnom reze aFord-Fulkersonov algoritmus

Príklad 3.3.1 Predpokladajme, že v meste A sa koná futbalový zápas klubov z miest A a B.Na tento zápas sa chcú dostať aj fanúšikovia klubu z mesta B. Z mesta B do mesta A vedieniekoľko prestupných dopravných liniek, pričom kapacita (počet sedadiel) na každej linke jeznámy. Treba zorganizovať prepravu fanúšikov z mesta B tak, aby sa ich na zápas do mesta Adostalo čo najviac. V grafovej terminológii vrcholy reprezentujú mestá a z vrcholu u do vrcholuv bude viesť orientovaná ohodnotená hrana s hodnotou (cenou) hrany c(u, v), ak z mesta u domesta v vedie dopravná linka s kapacitou c(u, v) prepravných miest. Pritom vrcholy A a B súakési význačné vrcholy - východzí a koncový vrchol.

Príklad 3.3.2 Ropovodom treba prepraviť čo najviac ropy z miesta A do miesta B. V rečigrafov, vrcholy reprezentujú prečerpávacie stanice a z vrcholu u do vrcholu v vedie orientovanáohodnotená hrana s hodnotou c(u, v), ak z prečerpávacej stanice u do prečerpávacej stanicev vedie potrubie s kapacitou c(u, v) (slovom kapacita sa rozumie množstvo ropy, ktorá môžebyť prepravená cez potrubie za jednotku času). Opäť, ako v predchádzajúcom príklad, vrcholyreprezentujúce miesta A a B sú istým spôsobom význačné.

Page 12: Časť I Algoritmy · Khwarizmi (Algorizm, 770 - 840), ktorý sa narodil na území dnešného Uzbekistanu. Zaoberal sa matematikou, astronómiou a geografiou. Aj ďaľší dôležitý

Kapitola 3: Grafové algoritmy 12

Skúsme teraz idey načrtnuté v predchádzajúcich dvoch príkladoch sformalizovať a previesť ichdo podoby v ktorej by sa s nimi pomocou nejakého matematického aparátu dalo ľahko narábať.Na toto nám poslúži nasledujúca definícia.

Definícia 3.3.1 Sieť (net) N , je digraf G s dvoma špeciálnymi vrcholmi z a u nazvanýmipo poradí zdroj (source) a ústie (sink) a s nezápornou funkciou c : E(G) → N0 nazvanoukapacitná funkcia, ktorá priradí každej orientovanej hrane (šípu) a digrafu G nezáporné celéčíslo c(a). Funkcia c teda môže nadobúdať nezáporné celočíselné hodnoty a hodnotu∞. DigrafG nazývame podkladovým digrafom sieťe N . Ak a = (x, y) je nejaký šíp digrafu G, potomčíslo c(a) = c(x, y) sa nazýva kapacitou šípu a.

Prečo sme definičný obor kapacitnej funkcie obmedzili iba na nezáporné celé čísla? Ak napríkladšíp a = (x, y) má zápornú kapacitu c(a), môžeme ho vymeniť za opačne orientovaný šíp a =(y, x), ktorého kapacitu c(a) zvolíme c(a) = −c(a). Ako ilustrácia môže slúžiť obrázok 3.3.6 - akz miesta x vedie do miesta y ”potrubie” a s prepravnou kapacitou ”−5 litrov ropy za sekundu”,je to to isté, ako keď z miesta y vedie do miesta x ”potrubie” a s prepravnou kapacitou ”5 litrovropy za sekundu”. �

x y x y

a a

Obrázok 3.3.6: Potrubia s kapacitou c(a) = −5 a c(a) = 5

Celočíselnosť súvisí s praktickým riešením úlohy. Keďže všetky (alebo aspoň prevažná časť)takýchto úloh sa rieši s využitím výpočtovej techniky, kapacity musia byť racionálne čísla (ak jekapacita číslo iracionálne tak ho vieme s ľubovoľnou vopred danou presnosťou aproximovať čís-lom racionálnym). Celočíselnosť potom získame jednoducho tak, že všetky kapacity vynásobímečo najmenším celým číslom tak, aby aj kapacity boli celé čísla. Slová zdroj a ústie napovedajú,že sa bude jednať o vrcholy so vstupným resp. výstupným stupňom 0. Toto nemusí byť takcelkom pravda; do zdroja môžu vchádzať šípy a z ústia môžu vychádzať, tieto šípy však nijakoneovplyvňujú riešenie úlohy a preto o nich neuvažujeme. Aby sme mohli riešiť našu úlohu - t.j. dopraviť čo najviac pasažierov (resp. ropy) z A do B, zadefinujeme si niektoré pojmy.

Definícia 3.3.2 Nech x je vrchol digrafu G. Množinu všetkých vrcholov, do ktorých vchádzašíp z vrcholu x nazveme výstupným okolím vrcholu x a označíme symbolom N+(x) a podob-ne, množinu všetkých vrcholov, z ktorých vychádza šíp do vrcholu x nazveme vstupnýmokolím vrcholu x a označíme symbolom N−(x). Čiže platí:

N+(x) = {y ∈ V (G)|(x, y) ∈ E(G)} (3.3.1)

N−(x) = {y ∈ V (G)|(y, x) ∈ E(G)}. (3.3.2)

Majme teraz sieť N s podkladovým digrafom G, zdrojom z a ústím u. Tok v sieti N jeceločíselná funkcia f na šípovej množine E(G) digrafu G taká, že:

0 ≤ f(a) ≤ c(a) pre každý šíp a ∈ E(G) (3.3.3)

a ∑y∈N+(x)

f(x, y) =∑

y∈N−(x)

f(y, x) pre každý vrchol x ∈ V (G) \ {z, u}. (3.3.4)

Sieťový tok z vrcholu x je definovaný ako∑y∈N+(x)

f(x, y) −∑

y∈N−(x)

f(y, x) (3.3.5)

a sieťový tok do vrcholu x je ∑y∈N−(x)

f(y, x) −∑

y∈N+(x)

f(x, y). (3.3.6)

Hodnota f(a) = f(x, y) sa nazýva tok cez šíp a a je to vlastne aktuálne množstvo materiálupretekajúceho cez šíp (potrubie) a. Rovnica 3.3.3 sa nazýva kapacitné obmedzenie a hovorí,že tok cez šíp nesmie prekročiť jeho kapacitu. Rovnica 3.3.4 sa nazýva rovnicou kontinuity a

Page 13: Časť I Algoritmy · Khwarizmi (Algorizm, 770 - 840), ktorý sa narodil na území dnešného Uzbekistanu. Zaoberal sa matematikou, astronómiou a geografiou. Aj ďaľší dôležitý

Kapitola 3: Grafové algoritmy 13

hovorí, že ak vrchol x nie je zdroj ani ústie, potom to čo do neho vteká, musí z neho aj vytekať.Hodnota f(N) toku f v sieti N je sieťový tok zo zdroja z, čiže

f(N) =∑

x∈N+(z)

f(z, x) −∑

x∈N−(z)

f(x, z). (3.3.7)

Tok F nazývame maximálnym tokom, ak F (N) = max{f(N)}, kde maximum je brané cezvšetky toky f siete N . Maximálny tok teda predstavuje maximálne množstvo prepravovanéhomateriálu, ktoré sa dá prepraviť zo zdroja z do ústia u v sieti N za jednotku času. Na obrázkuč. 3.3.7 môžeme vidieť príklad siete so zdrojom z a ústím u. Hodnoty pri šípoch predstavujúkapacity jednotlivých šípov, čiže kapacitnú funkciu.

�z u

9

6

7

4

12

5

8

2

5 10

7

Obrázok 3.3.7: Príklad siete

Podotýkame, že bez ujmy na všeobecnosti môžeme digraf G považovať za asymetrický (čižeak v G existuje šíp (u, v), potom v ňom neexistuje šíp (v, u)). Ak totiž v G existujú šípy(u, v) aj (v, u), môžeme medzi vrcholy v a u vložiť nový vrchol w a šíp (v, u) nahradiť šípmi(v, w), a (w, u), pričom kapacitná funkcia bude c(v, w) = c(w, u) = c(v, u). Ľahko vidno, žeak predchádzajúcu úvahu aplikujeme na všetky dvojice takých šípov, získame sieť N takú, žemedzi tokmi v N a N existuje jednoznačná korešpodencia a podkladový digraf siete N budeasymetrický. Predtým, ako uvedieme vetu o maximálnom toku a minimálnom reze a algoritmusna vyhľadanie maximálneho toku v sieti, uvedieme ešte nasledujúcu definíciu.

Definícia 3.3.3 Nech N je sieť so zdrojom z, ústím u a s podkladovým digrafom G. Ďalej,nech Z je množina vrcholov G obsahujúca vrchol z a neobsahujúca vrchol u a nech U = V (G)\Z- čiže množina U obsahuje vrchol u a neobsahuje vrchol z. Hranový rez oddeľujúci vrcholyz a u (alebo skrátene hranový z−u rez) je množina šípov (Z,U) = {(x, y)|x ∈ Z, y ∈ U}. Akc je kapacitná funkcia na sieti N , potom číslo c(Z,U), ktoré je súčtom kapacít všetkých šípovrezu (Z,U), nazývame kapacitou (Z,U) rezu. Rez (Z, U) nazývame minimálnym rezom, akc(Z, U) = min{c(Z,U)}, kde minimum je brané cez všetky (Z,U) rezy siete N .

Veta 3.7 Veta o maximálnom toku a minimálnom reze. V každej sieti N je hodnotamaximálneho toku rovná kapacite minimálneho rezu.

Dôkaz presahuje rámec našej učebnice; čitateľ ho môže nájsť napríklad v [5, 19]. Vo Fordovom- Fulkersonovom algoritme na vyhľadanie maximálneho toku sa používa metóda takzvanýchzväčšujúcich polociest. Pritom x0 − xn polocesta v digrafe G je alternujúca postupnosť

P = x0, a1, x1, a2, x2, . . . , xn−1, an, xn (3.3.8)

vrcholov a šípov digrafu G taká, že buď ai = (xi−1, xi) alebo ai = (xi, xi−1) a platí, že xi 6=xj ∀i 6= j. To znamená, že P je polocesta ak xi je vrchol digrafu pre každé i, 0 ≤ i ≤ n, vrcholysa neopakujú a buď (xi−1, xi) alebo (xi, xi−1) je šíp digrafu G pre každé i, 1 ≤ i ≤ n. Nech f jenejaký tok v sieti N s podkladovým digrafom G a nech c je kapacitná funkcia na N . Hovoríme,že polocesta x0, a1, x1, a2, x2, . . . , xn−1, an, xn v G je nenasýtená, ak pre všetky 1 ≤ i ≤ nplatí:

ai = (xi−1, xi) a zároveň f(ai) < c(ai), aleboai = (xi, xi−1) a zároveň f(ai) > 0. (3.3.9)

Rovnice 3.3.9 vlastne hovoria, že polocesta P je nenasýtená ak všetky šípy ktorých ”smer súhlasíso smerom polocesty” sú nenasýtené (čiže tok cez tieto šípy je menší ako kapacita týchto šípov)a tok na šípoch ktorých ”smer nesúhlasí so smerom polocesty” je nenulový. Nech f je nejakýtok v sieti N so zdrojom z, ústím u a podkladovým digrafom G a nech c je kapacitná funkcia na

Page 14: Časť I Algoritmy · Khwarizmi (Algorizm, 770 - 840), ktorý sa narodil na území dnešného Uzbekistanu. Zaoberal sa matematikou, astronómiou a geografiou. Aj ďaľší dôležitý

Kapitola 3: Grafové algoritmy 14

N . Ak P je nejaká nenasýtená z − u polocesta v G, hovoríme, že P je zväčšujúca polocesta.Pod pojmom rezerva zväčšujúcej polocesty P rozumieme číslo δ definované nasledovne:

δ+ = min{c(ai)− f(ai)} ak ai = (xi−1, xi),δ− = min{f(ai)} ak ai = (xi, xi−1) aδ = min{δ+, δ−}.

(3.3.10)

Aký je význam zväčšujúcej polocesty? Predstavme si že v sieti N už máme skonštruovanýnejaký tok f , ktorý však nie je maximálny. Ak v sieti N s tokom f existuje zväčšujúca polocesta(a taká existuje, pretože tok f nie je maximálny), potom môžeme tok f zväčšiť, čím získamenejaký nový tok f . Tok f získame nasledovne:

f(ai) = f(ai) + δ ak ai = (xi−1, xi) af(ai) = f(ai) − δ ak ai = (xi, xi−1).

(3.3.11)

Ľahko vidno, že ak tok f modifikujeme spôsobom popísaným rovnicami 3.3.11, funkcia f budeopäť tokom (pretože sme neporušili zákony kontinuity ani kapacitné obmedzenia) s hodnotou oδ vyššou ako je hodnota toku f . Na obrázku 3.3.8 hore vidíme zväčšujúcu z−u polocestu; nadšípmi je napísaný tok v sieti a pod nimi je kapacita (ak je potrebné ju písať). Na dolnom obrázkuje tok f zväčšený o rezervu polocesty δ. Pretože kapacity jednotlivých šípov sú prirodzené čísla(alebo nula), hodnota toku sa zvýši vždy aspoň o jednotku. To znamená, že po konečnom počtekrokov získame maximálny tok v sieti N .

�f: 5 2 3 4 3

c : 6 7 8z = x0

x1 x2 x3 x4u = x5

f: 6 1 2 5 4z = x0

x1 x2 x3 x4

u = x5

Obrázok 3.3.8: Zväčšujúca cesta s rezervou δ = 1 a nový tok f

Algoritmus 3.3.1 Fordov - Fulkersonov algoritmus [12](V sieti N s podkladovým digrafom G, zdrojom z, ústím u a s kapacitnou funkciou c nájde tokF s maximálnou hodnotou.)

1. Nájdeme nejaký z − u tok f0 v sieti N a inicializujeme i←− 0.(Môžeme začať napríklad s nulovým tokom; najlepšie však je náhodne vybrať systém hra-novo disjunktných orientovaných z−u ciest. Na každej ceste zvolíme tok rovný minimálnejkapacite na tejto ceste.)

2. Zostrojíme graf G = G(fi), pre ktorý platí:

(a) V (G) = V (G)(b) E(G) = {(x, y)|(x, y) ∈ E(G) ∧ fi(x, y) < c(x, y) alebo

(y, x) ∈ E(G) ∧ fi(y, x) > 0}.

(Graf G obsahuje iba tie šípy, ktoré sú nenasýtené v toku fi a opačne orientované šípy kšípom po ktorých v fi tečie nenulový tok.)

3. V grafe G = G(fi) hľadáme orientovanú z − u cestu. Ak existuje, ideme na Krok 4. Aknie, ideme na Krok 5.

4. Orientovaná z − u cesta v G je vlastne zväčšujúcou cestou P . Nájdeme teda jej rezervuδ a vypočítame tok fi+1 nasledovne:

(a) fi+1(x, y) = fi(x, y) + δ ak (x, y) ∈ P a (x, y) ∈ E(G)(b) fi+1(x, y) = fi(x, y)− δ ak (x, y) ∈ P a (y, x) ∈ E(G)(c) fi+1(x, y) = fi(x, y) ak (x, y) 6∈ P,

položíme i←− i+ 1 a ideme na Krok 2.5. Tok F = fi je maximálny tok v sieti N s hodnotou

F (N) =∑

x∈N+(z)

f(z, x) −∑

x∈N−(z)

f(x, z).

Page 15: Časť I Algoritmy · Khwarizmi (Algorizm, 770 - 840), ktorý sa narodil na území dnešného Uzbekistanu. Zaoberal sa matematikou, astronómiou a geografiou. Aj ďaľší dôležitý

Kapitola 3: Grafové algoritmy 15

Poznámka 5 I keď Fordov - Fulkersonov algoritmus je v praxi veľmi rýchly, nie je polynomiál-ny, ako ukázali na konkrétnom príklade (pozri obrázok 3.3.9) Edmonds a Karp v [11]. Ak v sietiN na obrázku 3.3.9 zvolíme ako počiatočný tok f0 nulový tok a následne volíme striedavo akozväčšujúcu cestu z, x, y, u a z, y, x, u, bude potrebné na nájdenie maximálneho toku 2M iterácií.Ak by Fordov - Fulkersonov algoritmus bol polynomiálny, musel by existovať nejaký polynómv premenných p, q (kde p je počet vrcholov a q počet hrán podkladového digrafu), ktorým bybol ohraničený počet krokov potrebných na nájdenie maximálneho toku v tejto sieti. Ak všakzvolíme stupeň ohraničujúceho polynómu ľubovoľne veľký, napríklad prqs, vždy môžeme zvoliťčíslo M tak aby 2M > prqs; preto algoritmus 3.3.1 nie je polynomiálny. V už citovanej práci[11] navrhli Edmonds a Karp modifikáciu Fordovho - Fulkersonovho algoritmu. Ak v Kroku3 budeme hľadať najkratšiu orientovanú z − u cestu, algoritmus už bude polynomiálny a jehozložitosť bude O(pq2).

�z u

x

y

M M

M M

1

Obrázok 3.3.9: Príklad k zložitosti Fordovho - Fulkersonovho algoritmu

Cvičenia k časti 3.3

Cvičenie 3.3.1 Pomocou Fordovho - Fulkersonovho algoritmu nájdite maximálny tok a hod-notu tohoto toku v sieťach na obrázkoch č. 3.3.10 a 3.3.11. Aplikáciou vety o maximálnomtoku a minimálnom reze nájdite kapacity minimálnych rezov a vyznačte ich na obrázkoch.

�z u

7

2

9

4

8

7

4

3 10

�z u

12

4

8

4

6

4

3

2 3

7

11

Obrázok 3.3.10: Nájdite maximálny tok a minimálny rez v sieťach na obrázkoch

�z u

7

4

8

10

6

9 68

5 6 4

6

5 �z u

8

5

7

4

5

2

53

3

8

4

5

7

34

10

5

Obrázok 3.3.11: Nájdite maximálny tok a minimálny rez v sieťach na obrázkoch

3.4 Stromy a ich aplikácie

V predchádzajúcom semestri sme si vysvetlili čo sú to stromy a aké majú vlastnosti. Ďalej sme siukázali niektoré aplikácie stromov (napr. kostra stromu) a tiež sme zaviedli pojem pestovanéhostromu, pomocou ktorého sme zisťovali izomorfizmus stromov. V tejto časti sa budeme zaoberaťpredovšetkým binárnymi stromami, čo je špeciálny prípad orientovaných stromov.

Page 16: Časť I Algoritmy · Khwarizmi (Algorizm, 770 - 840), ktorý sa narodil na území dnešného Uzbekistanu. Zaoberal sa matematikou, astronómiou a geografiou. Aj ďaľší dôležitý

Kapitola 3: Grafové algoritmy 16

Binárne stromy

Definícia 3.4.1 Orientovaný koreňový strom je súvislý acyklický digraf, v ktorom mápráve jeden vrchol, nazývaný koreň (a väčšinou označovaný ako r - root), vstupný stupeňnulový a každý ďaľší vrchol má vstupný stupeň rovnajúci sa jednej. Vrcholy, ktorých výstupnýstupeň je nulový sa nazývajú koncové vrcholy alebo listy. Vrcholy ktoré nie sú koncové sanazývajú vnútorné. Ak z vrcholu u vychádza šíp do vrcholu v, vrchol u sa nazýva rodič alebopredchodca vrcholu v a vrchol v sa nazýva potomok alebo následník vrcholu u. Vrcholy stým istým rodičom sa nazývajú súrodenci. Vzdialenosť vrcholu u od koreňa r (alebo inýmislovami dĺžka najkratšej, a keďže sa jedná o strom aj jedinej, orientovanej r−u cesty) sa nazývaúroveň vrcholu u a vzdialenosť z koreňa r do najvzdialenejšieho vrcholu sa nazýva výškoualebo hĺbkou stromu. Ak T je orientovaný koreňový strom a v je nejaký vrchol stromu T ,potom podgraf Tv, ktorý vznikne tak, že zo stromu T vynecháme všetky vrcholy do ktorýchnevedie orientovaná cesta z vrcholu v sa nazýva podstrom stromu T s koreňom v. Orientovanýkoreňový strom sa nazýva n-árny strom, ak každý vnútorný vrchol tohoto stromu má práven potomkov; inými slovami, každý vrchol n-árneho stromu má výstupný stupeň 0 alebo n.Špeciálne, n-árny strom s n = 2, sa nazýva binárny strom.

Orientované koreňové stromy väčšinou znázorňujeme tak, že koreň nakreslíme hore a postupnekreslíme vrcholy na úrovniach 1, 2, . . . , a listy nakreslíme úplne dole. Na obrázku ?? vidíte ilus-tráciu niektorých pojmov z predchádzajúcej definície. V praxi sa často stáva, že pri vkladanínejakej štruktúry do n−árneho stromu by sme tento strom vôbec nemohli zostrojiť; napríkladak máme k dispozícii 7 vrcholov a chceme z nich zostrojiť 5-árny strom, nepôjde to. Pretoniekedy používame pridané špeciálne vrcholy - takzvané zarážky. Graficky ich znázorňujemenapríklad štvorčekom namiesto krúžku.

Vidíme, že ak z orientovaného koreňového stromu odstránime orientáciu, pričom však nechámeoznačenie koreňa zachované, informačná hodnota sa nestratí - dostaneme vlastne zakorenenýstrom, o ktorých sme si hovorili v minulom semestri. Ak však chceme použiť orientovanékoreňové stromy (a špeciálne binárne stromy) na ďaľšie aplikácie, musíme na nich zadefinovaťakési usporiadanie. V binárnom strome sú ku každému vrcholu pripojené dva podstromy -pravý a ľavý podstrom (podotýkame, že jeden z nich alebo aj oba podstromy môžu byťprázdne). Pri grafickom znázorňovaní budeme tieto podstromy naozaj zakresľovať vpravo resp.vľavo. Môžeme si všimnúť, že takto definované stromy zodpovedajú pestovaným koreňovýmstromom, ktoré sme preberali v minulom semestri. Aby sme vedeli toto znázornenie preniesťaj do reči počítačov, definujeme si nasledujúce tri funkcie. Nech T je binárny strom a nech vje vrchol stromu T . Potom:

1. r(v) je predchodca (rodič) vrcholu v2. l(v) je ľavý následník vrcholu v a3. p(v) je pravý následník vrcholu v.

Ekvivalentne môžeme binárny strom zadefinovať pomocou vektora s dvomi stĺpcami: v riadku,ktorý zodpovedá vrcholu v stromu T napíšeme do prvého stĺpca ľavého následníka a do druhéhostĺpca pravého následníka vrcholu v. Ak vrchol nemá ľavého resp. pravého následníka, napríslušné miesto vložíme špeciálnu premennú, napr. nil a koreň bude uložený napríklad vpremennej root. Binárne stromy sa často využívajú na triedenie a následné vyhľadávanienejakých dát.

Definícia 3.4.2 Binárny strom T sa nazýva vyhľadávací (BVS - binárny vyhľadávací strom),ak pre každý jeho podstrom Tv s koreňom vo vrchole v platí, že hodnota vo vrchole v je väčšiaako každá hodnota v ľavom podstrome Tv,L vrcholu v a zároveň je menšia ako každá hodnotav pravom podstrome Tv,P vrcholu v.

I keď BVS sú veľmi vhodné na vytvárenie usporiadaných zoznamov a na overovanie, či danýprvok do zoznamu patrí alebo nie, predsa len majú akúsi nevýhodu. Tou nevýhodou je množstvočasu, za aký sa overí, či sa daný prvok nachádza v strome. Overenie sa totiž robí tak, že saporovnávaný prvok porovná s koreňom stromu; ak je mu rovný, prvok je v zozname, ak je väčší,prejde sa na pravý podstrom a ak je menší, začne sa prehľadávať ľavý podstrom (samozrejme,toto porovnávanie sa robí rekurzívne). V najhoršom prípade je čas potrebný na overenie, či sadaný prvok nachádza v zozname rovný O(n), kde n je počet vrcholov stromu. Preto je lepšiepoužívať stromy do istej miery ”vyvážené”; to znamená že v každom vrchole má ľavý a pravýpodstrom zhruba rovnakú hĺbku.

Page 17: Časť I Algoritmy · Khwarizmi (Algorizm, 770 - 840), ktorý sa narodil na území dnešného Uzbekistanu. Zaoberal sa matematikou, astronómiou a geografiou. Aj ďaľší dôležitý

Kapitola 3: Grafové algoritmy 17

Definícia 3.4.3 Binárny vyhľadávací strom sa nazýva AVL-strom, ak sa hĺbky ľavého apravého podstromu každého vrcholu líšia najviac o jednotku.

Túto definíciu ako prví navrhli Adelson-Velskij a Landis v [1] - odtiaľ pochádza aj názov týchtostromov. Výhodou AVL-stromov je, že na zistenie či sa daný prvok v zozname nachádza, jepotrebný iba čas O(log2n). Na obrázkoch ?? a ?? vidíme príklad BVS a AVL stromu; v obochsa nachádza utriedený zoznam prirodzených čísel 1 až 9. Vidíme že v prípade BVS stromuje potrebné na určenie, či sa číslo 9 nachádza v zozname potrebných 9 porovnaní, zatiaľ čo vprípade AVL stromu sú potrebné iba 4 porovnania.

Prehľadávanie stromov

Pri aplikovaní rôznych algoritmov sa používajú rôzne druhy prehľadávania stromov. Vo všetkýchprípadoch však ide o to, aby sme systematicky prehľadali všetky vrcholy stromu. Dva hlavnédruhy prehľadávania stromov sme si spomínali už v minulom semestri; bolo to prehľadávaniedo hĺbky a prehľadávanie do šírky. Niektoré druhy prehľadávania do hĺbky sa vyskytujú takčasto, že majú svoje vlastné názvy. Tieto prehľadávania sa líšia poradím vykonávania operáciíspracovania vrcholu, prechodu na pravý podstrom a prechodu na ľavý podstrom.

A: Preorder prehľadávanie (regulárne prehľadávanie)

– Spracuj vrchol– Prejdi na ľavý podstrom– Prejdi na pravý podstrom

C: Postorder prehľadávanie (dodatočné prehľadávanie)

– Prejdi na ľavý podstrom– Prejdi na pravý podstrom– Spracuj vrchol

B: Inorder prehľadávanie (neregulárne prehľadávanie)

– Prejdi na ľavý podstrom– Spracuj vrchol– Prejdi na pravý podstrom

Každý strom (a preto aj binárny strom) sa dá zadať rekurzívne; napríklad T = {root, T1, T2, . . . , Tn},kde root je význačný vrchol stromu - koreň a T1 až Tn sú podstromy v koreni root. Pri pre-order prehľadávaní sa vrcholy nachádzajú presne v poradí ako boli vypísané pri zadaní stromurekurziou.

Príklad 3.4.1 Majme strom zadaný T = {a, {b, {c}, {d}}, {e, {f, {g}}, {h, {i}, {j}}}} (viď obrá-zok ??). Pri preorder prehľadávaní sa vrcholy objavia v poradí a, b, c, d, e, f, g, h, i, j. Preorderprehľadávanie sa často robí, keď je potrebné vypísať textovú reprezentáciu stromu. Ešte pozna-menávame, že pri preorder prehľadávaní bude root navštívený ako prvý vrchol. Pri postorderprehľadávaní budeme mať na výstupe postupnosť c, d, b, g, f, i, j, h, e, a. Pri tomto type pre-hľadávania sa koreň každého podstromu spracováva ako posledný. Inorder prehľadávanie mázmysel iba pre binárne stromy. Pri tomto prehľadávaní sa najskor spracuje pravý podstrom,potom vrchol a nakoniec pravý podstrom. Výstup v našom príklade bude c, b, d, a, g, f, e, i, h, j.

Stromy výrazov - prefixové, postfixové a infixové výrazy

Algebraické výrazy ako napríklad a + b ∗ c− (d− e)/f majú prirodzenú stromovú štruktúru.Na obrázku ?? môžeme vidieť strom zodpovedajúci predchádzajúcemu výrazu. Takéto stromysa nazývajú stromy výrazov. Koncové vrcholy týchto stromov obsahujú ako návestia pre-menné a konštanty výrazu a vnútorné vrcholy sú označené operátormi. V takomto strome sasamozrejme nevyskytujú zátvorky, pri spracovaní stromu však operácia uzavretá v zátvorkáchprebehne skôr, ako sa vykoná ďaľšia operácia aplikovaná na celú zátvorku. Keďže bežné alge-braické operácie sú binárne (násobenie, delenie, sčitovanie, odčitovanie) alebo unárne (negá-cia), v stromoch výrazov má každý vnútorný vrchol jeden alebo dva neprázdne podstromy.Keď prehľadáme napríklad strom na obrázku ?? inorder prehľadávaním, ako výstup dostanemepostupnosť a,+, b, ∗, c,−, d,−, e, /, f - čiže s výnimkou zátvoriek rovnaký výraz z ktorého smestrom vytvárali. Ak navyše pri prehľadávaní pridáme podmienku aby sa podstromy na výstupeuzatvárali do zátvoriek, dostaneme výraz ((a + (b ∗ c)) − ((d − e)/f)), ktorý síce obsahuje aj

Page 18: Časť I Algoritmy · Khwarizmi (Algorizm, 770 - 840), ktorý sa narodil na území dnešného Uzbekistanu. Zaoberal sa matematikou, astronómiou a geografiou. Aj ďaľší dôležitý

Kapitola 3: Grafové algoritmy 18

nejaké zátvorky navyše, ale výpočet výrazu bude daný jednoznačne.

Je zrejmé, že keď na daný strom aplikujeme postupne preorder, postorder a inorder prehľadá-vania získame tri zápisy daného výrazu. Zatiaľ čo inorder prehľadávanie sa dá využiť iba akdaný strom je binárny (čo znamená, že operácie sú unárne alebo binárne), preorder a postor-der prehľadávanie sa dá využiť aj ak používame n-árne operácie, n > 2. Formuly vzniknutéprehľadávaním sa nazývajú nasledovne:

Prefixové výrazy - pri preorder prehľadávaní. V týchto výrazoch n-árny operátor stojípred svojimi n operandmi.Postfixové výrazy - pri postorder prehľadávaní. V postfixových výrazoch n-árny op-erátor stojí za svojimi n operandmi.Infixové výrazy - pri inorder prehľadávaní. Binárny operátor tu stojí medzi svojimidvoma operandmi a unárny operátor stojí pred alebo za svojim operandom (podľa toho,či operand leží v pravom alebo ľavom podstrome operátora) - viď obrázok ??.

Príklad 3.4.2 Napríklad prefixový, postfixový a infixový výraz pre preorder, postorder a in-order prehľadanie stromu výrazov na obrázku ??, ktorý predstavuje výraz a ∗ (b − c) + (d −e)/(f + g) je:

Prefixový výraz: + ∗ a− bc/− de+ fgPostfixový výraz: abc− ∗de− fg + /+Infixový výraz: a ∗ b− c+ d− e/f + g

Všimnime, že ak nestanovíme prioritu vykonávania operácií a pri prehľadávaní nepridávamezátvorky, prípade prefixovom a postfixovom je vzniknutý výraz jednoznačný, v infixovom prí-pade to však nemusí byť pravda.

Triediace stromy

Predpokladajme, že máme vytvoriť zoznam všetkých slov nejakého textu. Spôsobov ako tovykonať je viacero. Azda najneefektívnejšou metódou je celý text naukladať do pamäte avytvoriť zoznam nejakým bežným triediacim algoritmom. Oveľa lepšie je vytvárať si počasvstupu textu tabuľku typov. Takýchto tabuliek je viacero.

1. Neusporiadaný zoznam. Načíta slovo a porovná ho s prvým slovom v zozname. Akje také isté, načíta ďaľšie slovo. Ak nie, porovnáva ho s ďaľším slovom a tak ďalej ažpo koniec zoznamu. Ak sa slovo v slovníku nevyskytuje, zapíše ho na koniec zoznamu.Nevýhodou je, že pri každom novom slove musíme prehľadať celý zoznam.

2. Usporiadaný zoznam. Tu už nemusíme prehľadávať celý zoznam; na zistenie, či už jeslovo v zozname nám stačí oveľa menej operácií. Ak však slovo v zozname nie je, musímeposunúť všetky slová, ktoré sa nachádzajú v zozname za ním.

3. Triediaci strom. Je to štruktúra, ktorá spája výhody usporiadaného a neusporiadanéhozoznamu. Dá sa prehľadať tak rýchlo ako usporiadaný zoznam a nové slová sa v ňompridávajú tak jednoducho ako v neusporiadanom zozname.

Ako sa vytvára triediaci strom? Prvé slovo textu a1 bude koreňom (návestím koreňa) triediacehostromu. Predpokladajme, že už máme v triediacom strome zaradených prvých i− 1 slov textu.Nech i-te slovo je slovo ai. Pri zaraďovaní tohoto slova urobíme nasledovné.Zistíme, či ai = a1. Ak áno, načítame ďaľšie slovo textu. Ak nie, zistíme, či ai < a1 aleboai > a1. Ak ai < a1 ideme na ľavého následníka koreňa a opakujeme celý proces. Ak posled-ný spracovaný vrchol nemá ľavého následníka, vložíme ai do triediaceho stromu ako ľavéhonásledníka tohoto vrcholu. V prípade, že ai > a1 je postup zrejmý.

Príklad 3.4.3 Vytvorte triediaci strom z textu: Prosím Vás, a na čo nám to bude? Veďto určite nikde nevyužijem. Tak načo sa s tým zdržiavame! Triediaci strom vidíme naobrázku ??. Po aplikácii inorder prehľadávania na triediaci strom získame utriedený zoznamslov v texte. V našom prípade: a, bude, čo, na, načo, nám, nikde, nevyužijem, prosím,s, sa, tak, to, tým, určite, vás, veď, vlastne, zdržiavanie.

Z veľkou pravdepodobnosťou takýto strom nebude AVL stromom. Na to aby sa stal AVLstromom, sa používajú rôzne operácie vyvažovania stromu; toto však presahuje rámec našejprednášky.

Page 19: Časť I Algoritmy · Khwarizmi (Algorizm, 770 - 840), ktorý sa narodil na území dnešného Uzbekistanu. Zaoberal sa matematikou, astronómiou a geografiou. Aj ďaľší dôležitý

19

Časť II

Kódy

4 Kódovanie

4.1 Úvod

Iste sa už každý z Vás stretol s nasledujúcou situáciou. Prezeráte si internetové stránky vslovenčine a zrazu vidíte niečo viac-menej nečitateľné. Ako príklad toho, čo sa čitateľovi môžeobjaviť uvádzam príklad jednoduchej slovenskej vety v rôznych kódovaniach.

Príklad 4.1.1

1.) Win1250: Ťažší a väčší ako kôň.2.) ASCII: Tazsi a vacsi ako kon.3.) ISO-8859-2: Ťaľší a väčší ako kôň.4.) Kamenických: a a v ako k.5.) KOI 8 CS: ôaÚÓÉ a vÓÉ ako kľ.6.) Latin 2: a a v» ako kĺ.7.) Macintosh: čaě a v ako k.

Zatiaľ čo v prvom riadku je text zobrazený presne ako autor stránky zamýšľal a v druhom atreťom riadku vie každý ľahko identifikovať aký text mal autor na mysli, v riadkoch štyri ažsedem by musel byť čitateľ niečo medzi Sibylou a Sherlockom Holmesom aby si text domyslel.Samozrejme, predchádzajúci príklad je dosť extrémny; väčšinou je k dispozícii dlhší text, priktorom sa dajú nečitateľné časti čiastočne uhádnuť z kontextu. Napriek tomu je zrejmé, že vistých situáciách hádanie jednoducho nepomáha. Predchádzajúci text nás privádza priamo kpojmu kódovania. Aký je zmysel kódovania?

1. Prispôsobiť abecedu prenášanej správy abecede prenosového kanálu2. Zvýšiť odolnosť prenášanej správy voči rušeniu (kódy opravujúce chyby)3. Zvýšiť efektivitu využitia média (minimálne kódy, kompresné kódovanie)4. Utajenie informácie (šifrovanie)

V praxi sa často stretávame s pojmami kódovanie a šifrovanie, pričom sa veľakrát stáva, žetieto pojmy sú zamieňané. Aký je teda hlavný rozdiel medzi kódovaním a šifrovaním si ukážemena nasledujúcej schéme.

Kódovanie: Zdrojový textZakódovanie−−−−−−−−−−−→ Zakódovaný text , pričom kódovací algoritmus aj

parameter kódovania sú verejne známe.

Šifrovanie: Zdrojový textŠifrovanie−−−−−−−−−−−→ Šifrový text , pričom šifrovací algoritmus je väčši-

nou známy a parameter kódovania je utajený (ako uvidíme neskôr môže byť časť parametra,ale v žiadnom prípade nie celý, verejne známa).

4.2 Základné pojmy a definície

Ak zasielame správu z jedného miesta na druhé, často je potrebné túto správu zakódovať; t. j.zameniť znaky pôvodnej správy za znaky správy zasielanej. Táto zámena súvisí so spôsobomprenosu správy.

Príklad 4.2.1 Odošlime text AHOJ PETER pomocou Morseovej abecedy. Zakódovaním doMorseovej abecedy dostaneme: ·−t · · · · t−−−t ·−−−tt ·−− ·t ·t−t ·t ·− ·t · · ·− ·−.Bodky predstavujú krátke impulzy (napríklad svetelné alebo elektrické), čiarky dlhé impulzya znak t, ktorý sa nevysiela, predstavuje medzipísmenovú medzeru. V tabuľke 4.2.1 môžetevidieť kódovanie do morseovej abecedy. Odkódovanie prijatej správy je zrejmé. Ak napríkladpríjmeme správu −−t · − t · −−−t t · · · t · − t · · · − · −, pohľadom do tabuľky zistíme, žeprijatá správa je MAJ SA. Posledný znak správy je znak konca správy.

Page 20: Časť I Algoritmy · Khwarizmi (Algorizm, 770 - 840), ktorý sa narodil na území dnešného Uzbekistanu. Zaoberal sa matematikou, astronómiou a geografiou. Aj ďaľší dôležitý

Kapitola 4: Kódovanie 20

A ·− B − · ·· C − · −· D − · · E · F · · ·G −− · H · · ·· I ·· J · − −− K − · − L · − ··M −− N −· O −−− P · − −· Q −− ·− R · − ·S · · · T − U · · − V · · ·− W · − − X − · ·−Y − · −− Z −− ··0 −−−−− 1 · − − −− 2 · · − − − 3 · · · − − 4 · · · · − 5 · · · · ·6 − · · · · 7 −− · · · 8 −−− · · 9 −−−− ·

Tabuľka 1: Kódová tabuľka Morseovej abecedy

Všeobecná schéma pre prenos správy je na nasledujúcom obrázku:

Zdrojovýtext

Zakódovanie−−−−−−−−−−−→ Kódovaný

textPrenosový kanál−−−−−−−−−−−→ Kódovaný

textOdkódovanie−−−−−−−−−−−→ Zdrojový

text

Všimnime si, že v príklade 4.2.1 sme napísali akúsi správu, každé písmeno sme zakódovalinejakým iným ”písmenom” a po prijatí zakódovanej správy sme pôvodnú správu získali odkó-dovaním kódovej správy.

Definícia 4.2.1 Konečná neprázdna r−prvková množinaA = {a1, a2, . . . , ar} sa nazýva abece-da a jej prvky a1, a2, . . . , ar sa nazývajú znakmi abecedy A.

Príklad 4.2.2 Slovenská abeceda bez diakritiky má 26 znakov:AS = {a, b, c, d, e, f, g, h, i, j, k, l,m, n, o, p, q, r, s, t, u, v, w, x, y, z}.

Príklad 4.2.3 Morseova abeceda má tri znaky: AM = {·,−,t}.

Príklad 4.2.4 Najjednoduchšia netriviálna abeceda má dva znaky: A2 = {a1, a2} = {0, 1}.Táto abeceda je jedna z najrozšírenejších; budeme ju nazývať aj binárna abeceda.

Vo všeobecnosti, ak nejaká abeceda má r prvkov, nazývame ju n−árna abeceda. Špeciálne,Morseova abeceda má tri znaky, čiže je ternárna a abeceda A2 je binárna abeceda. Na príklade4.2.1 sme si zhruba ukázali čo máme na mysli pod pojmom kódovanie správy. Aby sme tentopojem sformalizovali, uvedieme si nasledujúce pojmy.

Definícia 4.2.2 Nech A = {a1, a2, . . . , ar} je r−prvková abeceda. Slovom dĺžky k > 0 rozu-mieme konečnú k−prvkovú postupnosť ai1 , ai2 , . . . , aik

prvkov abecedy A. Množinu všetkýchslov nad abecedou A budeme označovať symbolom A∗. Na množine A∗ definujeme binárnuoperáciu ”|” reťazenia slov definovanú nasledovne: Ak b = b1b2 . . . bs a c1c2 . . . ct sú dve slováz A∗, ich zreťazením dostaneme slovo b|c = b1b2 . . . bsc1c2 . . . ct resp. c|b = c1c2 . . . ctb1b2 . . . bs.

Je zrejmé, že každé slovo dĺžky dva vznikne zreťazením dvoch slov dĺžky jedna (a teda znakovabecedy A), zatiaľ čo slová dĺžky väčšej ako dva môžu vzniknúť viacerými spôsobmi. Napríkladslovo ”kódy” môže vzniknúť zreťazením siedmymi spôsobmi: ”k|ó|d|y, k|ó|dy, k|ód|y, k|ódy,kó|d|y, kó|dy a kód|y”. Pri kódovaní budeme používať vo všeobecnosti dve abecedy. Prvá znich bude obsahovať znaky z ktorých sa skladá pôvodná správa a druhá znaky kódového textu.

Definícia 4.2.3 Nech A = {a1, a2, . . . , ak} a B = {b1, b2, . . . , bl} sú dve abecedy (nie nevyh-nutne rôzne). Zobrazenie K : A 7→ B∗ (t. j. zobrazenie, ktoré každému znaku abecedy A pri-radí nejaké slovo abecedy B budeme nazývať kódom. Pritom množinu A nazývane zdrojováabeceda a jej prvky zdrojové znaky a množinu B nazývame kódová abeceda a jej prvkysú kódové znaky. Ak A∗ je množina zdrojových slov (zdrojových textov) potom kódom zdro-jového slova ai1ai2 . . . aik

∈ A∗ je kódové slovo K∗(ai1ai2 . . . aik) =K(ai1)|K(ai2)| . . . |K(aik

),pričom K∗ : A∗ 7→ B∗ je zobrazenie z množiny zdrojových slov do množiny kódových slov.

Príklad 4.2.5 Nech A = AS ∪ {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} je zdrojová abeceda a nech B = AM ={·,−,t} je kódová abeceda. Zobrazenie K : A 7→ B∗ dané tabuľkou 1 je kódom a napríkladkódové slovo −− t · − t −− t · − zodpovedá zdrojovému slovu MAMA.

Vidíme, že na zakódovanie všetkých slovenských písmen bez diakritiky a číslic 0 až 9 námv tomto prípade stačia tri znaky. Takéto kódovanie sa nazýva ternárne, resp. hovoríme oternárnom kóde. Podobne, ak kódová abeceda je n−prvková, kódovanie sa nazýva n−árne.

Page 21: Časť I Algoritmy · Khwarizmi (Algorizm, 770 - 840), ktorý sa narodil na území dnešného Uzbekistanu. Zaoberal sa matematikou, astronómiou a geografiou. Aj ďaľší dôležitý

Kapitola 4: Kódovanie 21

Príklad 4.2.6 Príkladom binárneho kódovania môže byť nasledujúci predpis pre zakódovaniečíslic 0 až 9.

0 7→ 0 1 7→ 12 7→ 00 3 7→ 014 7→ 10 5 7→ 116 7→ 000 7 7→ 0018 7→ 010 9 7→ 011

Je zrejmé, že pri kódovaní je výhodné používať kódovanie s čo najmenšou priemernou dĺžkoukódového slova - čím je kratšie kódové slovo, tým menej informácie musíme preniesť. Ďaľšou, atentokrát nevyhnutnou, podmienkou korektného kódovania je jeho jednoznačnosť; kódovanie sanazýva jednoznačné alebo prosté, ak rôznym znakom zdrojovej abecedy zodpovedajú rôznekódové slová. V predchádzajúcom príklade sme videli prosté binárne kódovanie s priemernoudĺžkou slova 2.2. Ak týmto kódovaním zakódujeme číslo 123, dostaneme kódové slovo 10001.Toto kódovanie je síce prosté a má veľmi malú priemernú dĺžku kódového slova, má však jedenzávažný nedostatok. V čom spočíva? Skúsme dekódovať zakódovanú správu 10001, aby smedostali pôvodné (zdrojové) slovo. Vidíme, že kódovému slovu zodpovedá každé s nasledovnýchzdrojových slov: 10001, 1003, 162, ap. Vidíme, že požiadavka jednoznačnosti kódovania nestačína to, aby sme vedeli zakódovanú správu správne odkódovať. Poznamenávame, že kódovaniektoré nie je prosté, nemá absolútne žiadny praktický (ani teoretický) význam; preto odteraz akbudeme hovoriť o kódovaní, budeme mať vždy na mysli prosté kódovanie.

Definícia 4.2.4 Hovoríme, že kódovanie K : A 7→ B∗ je jednoznačne dekódovateľné, akkódovanie K∗ : A∗ 7→ B∗ je prosté. To znamená, že ku každému kódovému slovu b ∈ B∗ viemejednoznačne priradiť zdrojové slovo a ∈ A∗.

4.3 Blokové kódovanie, prefixové kódovanie a Kraftova nerovnosť

Blokové kódovanie

Na rôznych príkladoch sme videli, že pri kódovaní sa rôznym znakom môžu priradiť kódovéslová rôznych dĺžok. Kódovanie sa nazýva blokové dĺžky n, ak každému zdrojovému znakuzodpovedá kódové slovo dĺžky n.

Príklad 4.3.1 Uvažujme blokové binárne kódovanie číslic 0 až 9 s dĺžkou bloku 4. (Prečo smeneuvažovali dĺžku bloku iba 3?)

0 7→ 0000 1 7→ 00012 7→ 0010 3 7→ 00114 7→ 0100 5 7→ 01016 7→ 0110 7 7→ 01118 7→ 1000 9 7→ 1001

Ak dostaneme kódovú správu napr. 0100000100110010, vieme okamžite určiť, že pôvodnáspráva bola 8132. Dôvod je jednoduchý. Keďže kódovanie je blokové s dĺžkou 4, kódová správasa skladá z kódových slov dĺžky 4: 0100000100110010 = 0100|0001|0011|0010. Vidíme teda, žekaždé blokové kódovanie (zdôrazňujeme, že máme na mysli prosté kódovanie) je jednoznačnedekódovateľné.

Prefixové kódovanie

Definícia 4.3.1 Nech A je abeceda a nech a = a1a2 . . . ak je slovo z A∗. Potom každé zo slova1, a1a2, . . . , a1a2 . . . ak−1, a1a2 . . . ak−1ak nazývane prefixom slova a. Kódovanie K sa nazývaprefixové, ak žiadne kódové slovo nie je prefixom iného kódového slova.

Príklad 4.3.2 Ľahko vidno, že každé blokové kódovanie je aj prefixové; opak nemusí byť prav-dou. Ak napríklad zdrojová abeceda je {A,B,C,D}, kódová abeceda je {0, 1} a kód K je daný:A7→0, B 7→100, C 7→101 a D7→110, toto kódovanie je prefixové ale nie je blokové.

Napríklad telefónne čísla ľubovoľného telefónneho operátora tvoria prefixové kódovanie účast-níckych staníc. Dôvod, prečo toto kódovanie je prefixové je jednoduchý. Ak by napríklad čísla5445325 aj 544532 boli telefónnymi číslami (kódovými slovami) rôznych účastníckych staníc, na

Page 22: Časť I Algoritmy · Khwarizmi (Algorizm, 770 - 840), ktorý sa narodil na území dnešného Uzbekistanu. Zaoberal sa matematikou, astronómiou a geografiou. Aj ďaľší dôležitý

Kapitola 4: Kódovanie 22

prvé z čísel by sme sa nikdy nedovolali - vždy by sa začalo vytáčať druhé z čísel. Napriek tomutoto kódovanie nie je blokové; existujú totiž skrátené čísla napr. 158, 155 ap., ktoré nemajúrovnakú dĺžku ako ostatné čísla.

Tak ako blokové kódovanie, aj prefixové kódovanie je jednoznačne dekódovateľné (dá sa dekó-dovať napríklad konečným Mealyho automatom). Navyše má ďaľšiu výbornú vlastnosť - kódováspráva sa dá odkódovávať už v priebehu prijímania správy, čiže nemusíme čakať na prijatie celejsprávy. Toto je cenná vlastnosť, ktorú nemá žiadne iné kódovanie.

Pozorný čitateľ si teraz môže položiť otázku: Keďže blokové kódovanie je prefixové (čiže má túúžasnú vlastnosť ktorú sme spomínali vyššie), načo sa ešte zaoberať všelijakými kódovaniami- nevystačíme s blokovými? Odpoveď je: Ano, vystačíme s blokovými, ale . . . Všimnite sinasledujúci príklad a skúste ho porovnať s príkladom 4.3.1.

Príklad 4.3.3 Uvažujme prefixové binárne kódovanie číslic 0 až 9 s rôznymi dĺžkami kódovýchslov.

0 7→ 00 1 7→ 012 7→ 1000 3 7→ 10014 7→ 1010 5 7→ 10116 7→ 1100 7 7→ 11018 7→ 1110 9 7→ 1111

Vidíme, že zatiaľ čo priemerná dĺžka kódového slova v príklade 4.3.1 je 4, v príklade 4.3.3 jepriemerná dĺžka kódového slova 3.6. I keď tento rozdiel vyzerá byť malý, treba si uvedomiť,že pri dnešnom objeme prenášaných dát je každé zlepšenie (inými slovami zrýchlenie preno-su) nanajvýš žiadúce. Preto väčšinou hľadáme kódy, ktoré sú nielen prosté a jednoznačnedekódovateľné, ale majú aj najkratšiu priemernú dĺžku kódového slova. Prečo sme v pred-chádzajúcom príklade teda nezvolili napríklad priradenie 0 7→ 0, čím by sme získali ešte menšiupriemernú dĺžku kódového slova? Odpoveď nám dáva nasledujúca veta - takzvaná Kraftovanerovnosť.

Veta 4.1 Kraftova nerovnosť: Nech A je zdrojová abeceda s r prvkami a nech B je s−prvkovákódová abeceda. Potom existuje prefixové kódovanie K : A 7→ B∗ s dĺžkami kódových slovl1, l2, . . . , lr práve vtedy, ak:

s−l1 + s−l2 + . . .+ s−lr ≤ 1. (4.3.1)

Vidíme, že ak by sme použili priradenie 0 7→ 0, žiadne ďaľšie kódové slovo by sa už nesmelozačínať nulou (aby sme získali prefixové kódovanie). Ľahko vidno, že aby sme dodržali Kraftovunerovnosť, museli by sme niektoré kódové slová voliť aj dĺžky 5, čím by sme zvýšili priemernúdĺžku slova. V príklade ?? platí: 2 · 2−2 + 8 · 2−4 = 1. Ďaľšie možné riešenie je v príklade 4.3.4.

Príklad 4.3.4 Uvažujme prefixové binárne kódovanie číslic 0 až 9 spĺňajúce Kraftovu nerovnosť:.

0 7→ 00 1 7→ 012 7→ 100 3 7→ 10104 7→ 1011 5 7→ 11006 7→ 1101 7 7→ 11108 7→ 11110 9 7→ 11111

V predchádzajúcom príklade platí: 2 · 2−2 + 1 · 2−3 + 5 · 2−4 + 2 · 2−5 = 1. Priemerná dĺžkakódového slova je v tomto prípade 3.7. Ako však skonštruovať prefixový kód s dĺžkami kódovýchslov l1, l2, . . . , lr, ak vieme, že platí Kraftova nerovnosť? Návod na riešenie je v poznamkeza cvičením 4.3.3. Nasledujúca veta dáva do súvisu jednoznačne dekódovateľné a prefixovékódovania.

Veta 4.2 Mac Milanova veta: Pre každé jednoznačne dekódovateľné kódovanie platí Krafto-va nerovnosť 4.1.

Mac Milanova veta vlastne hovorí, že ku každému takémuto jednoznačne dekódovateľnému kó-dovaniu môžeme zostrojiť prefixové kódovanie s rovnakými dĺžkami slov.

Na záver ešte poznamenávame, že kódovanie ktoré nie je prefixové, ešte stále môže byť jedno-značne dekódovateľné. Ak napríklad zdrojová abeceda je {0, 1, 2} a kódová abeceda je {a, b},kódovanie 0 7→ a, 0 7→ ab, 0 7→ abb nie je prefixové ale je jednoznačne dekódovateľné.

Page 23: Časť I Algoritmy · Khwarizmi (Algorizm, 770 - 840), ktorý sa narodil na území dnešného Uzbekistanu. Zaoberal sa matematikou, astronómiou a geografiou. Aj ďaľší dôležitý

Kapitola 4: Kódovanie 23

Cvičenia k časti 4.3

Cvičenie 4.3.1 Zistite, či kód A 7→10, B 7→0100, C 7→110, D 7→01, E7→001 je jednoznačne dekó-dovateľný.

Cvičenie 4.3.2 Zistite, či existuje binárny prefixový kód pre číslice 0 až 9, pre ktorý platí:0 7→0, 1 7→10, a ostatné kódové slová majú dĺžku nanajvýš 5. Ak existuje, nájdite ho.

Cvičenie 4.3.3 Zistite, či existuje 4-árny prefixový kód číslic 0 až 9 s dĺžkami kódových slov1,1,2,2,2,2,2,2,2,3. Ak áno, nájdite ho. (Kódová abeceda nech je {A,B,C,D}.) (Poznámka: nazostrojenie kódovania môžete použiť 4-árny strom prefixového kódovania).

Cvičenie 4.3.4 Zistite, či existuje ternárny prefixový kód znakov A, B, C, D, E, F, G, H, I, J sdĺžkami kódových slov nanajvýš 3. Ak existuje, nájdite ho. (Kódová abeceda nech je {0,1,2}.)Urobte to isté pre kódovanie a) A 7→ 0, B 7→ 2 a b) A 7→ 1, B 7→ 01, C 7→ 21, D 7→ 20, E 7→ 02.

Cvičenie 4.3.5 Zistite, koľko znakov musí mať kódová abeceda, ak chceme zakódovať zdrojovúabecedu AS tak, aby kódové slová pre samohlásky mali dĺžku 1 a ostatné kódové slová majúmať dĺžku nanjvýš 2. (|AS | = 23, samohlásky sú a, e, i, o, u, y)

Cvičenie 4.3.6 Zistite, ktoré z nasledujúcich kódovaní sú jednoznačne dekódovateľné a ktorésú prefixové.

K1 K2 K3 K4

0 0 xxx 0 01 01 xxy 001 12 011 xyx 111 203 0111 yxx 110 214 01111 xyy 101 2205 011111 yxx 011 221

Cvičenie 4.3.7 Zistite, či nasledujúce kódovania sú jednoznačne dekódovateľné. Ak áno,nájdite k nim prefixové kódovanie s rovnakými dĺžkami kódových slov.

K1 K2 K3 K4

0 111 bc 210 x1 10 ca 211 y2 001 ac 212 xz3 00 cb 1010 xyz4 011 a 0 xzz5 101 b 1 zzz

4.4 Najkratší kód, Huffmanova konštrukcia najkratšieho kódu

V úvodnej prednáške do kódovanie sme si spomínali niektoré kódovania znakov, napríkladASCII kód, kódovanie Win1250 a podobne. Všetky tieto kódovania sú blokové, čiže každémuznaku zdrojovej abecedy je priradené kódové slovo rovnakej dĺžky (v tomto prípade 8 bitov).Tieto kódovania priraďujú znakom zdrojovej abecedy rovnaké kódové slová pre kódové slováležiace v intervale 〈0, 127〉 (čiže kódové slová 00000000(2) až 01111111(2)), líšia sa však v pri-raďovaní kódových slov v intervale 〈128, 255〉 (čiže 10000000(2) až 11111111(2)). Veľká prednosťtýchto kódovaní spočíva v ich jednoduchosti, napriek tomu však majú aj svoju nevýhodu -neberie sa ohľad na frekvenciu výskytu jednotlivých znakov v zdrojovom texte.

Page 24: Časť I Algoritmy · Khwarizmi (Algorizm, 770 - 840), ktorý sa narodil na území dnešného Uzbekistanu. Zaoberal sa matematikou, astronómiou a geografiou. Aj ďaľší dôležitý

Kapitola 4: Kódovanie 24

Ako sme videli už pri Morseovej abecede, písmenám ktoré sa v angličtine vyskytujú najčastejšie(čiže ”e” a ”t”) sú priradené najkratšie kódové slová (”·” a ”−”). Aj v súčasnosti je častokrátžiadúce používať kód, ktorý akýmsi spôsobom minimalizuje dĺžku kódového slova. Napríklad pripoužívaní modemu, ktorý je relatívne pomalý, môžeme zvýšiť rýchlosť prenosu použitím kóduvyužívajúceho krátky kód. Takéto kódy sa tiež používajú pri rôznych metódach archivácie akomprimácie.

Definícia 4.4.1 Nech A = {a1, a2, . . . , ar} je zdrojová abeceda, nech T je nejaký text z A∗ anech n je počet znakov textu T . Ďalej, nech ni je počet výskytov znaku ai v texte T ; potompravdepodobnosť výskytu znaku ai v texte T je pi = ni

n . Ak K : A 7→ B∗ je prefixovékódovanie s dĺžkami kódových slov d1, d2, . . . , dr, potom stredná dĺžka kódového slova prikódovaní K je:

d =r∑

i=1

pidi = p1d1 + p2d2 + . . .+ prdr (4.4.2)

Ako sme už povedali, v niektorých prípadoch požadujem, aby stredná dĺžka kódového slovabola čo najkratšia. Tým sa dostávame priamo k definícii najkratšieho kódu.

Definícia 4.4.2 Nech A = {a1, a2, . . . , as} je zdrojová abeceda s pravdepodobnosťami výskytuzdrojových znakov p1, p2, . . . , pr a nech B = {b1, b2, . . . , bs} je kódová abeceda. Kód K : A 7→B∗ sa nazýva najkratší s-árny kód abecedy A, ak stredná dĺžka kódového slova dK tohotokódu je najkratšia zo všetkých kódov.

Jeden z prvých kódov minimalizujúcich strednú dĺžku kódového slova bol Shannon-Fanov kód,ktorý však nie je najkratší. Vylepšením metódy Shannon-Fana vyvinul v roku 1952 D. A.Huffman prefixový kód, o ktorom sa dá dokázať že je skutočne najkratší a ktorý sa po svojomtvorcovi nazýva Huffmanov kód.

Definícia 4.4.3 Nech A = {a1, a2, . . . , ar} je zdrojová abeceda s pravdepodobnosťami výsky-tu znakov p1 ≥ p2 ≥ . . . ≥ pr (to znamená, že znaky sú usporiadané podľa lpravdepodobnostivýskytu od znaku s najvyššou pravdepodobnosťou po znak s najnižšou pravdepodobnosťou).Abecedu A = {a1, a2, . . . , ar−1} s pravdepodobnosťami výskytu znakov p1, p2, . . . , pr−1 nazvemeredukovanou abecedou abecedy A, ak pre abecedu A platí:

1. Pre každé i ∈ {1, 2, . . . , r − 2} platí ai = ai a pi = pi a2. ar−1 6∈ A∗ a pr−1 = pr−1 + pr.

Aby sme mohli skonštruovať najkratší prefixový kód (Huffmanov) napíšeme si ešte bez dôkazunasledujúcu vetu.

Veta 4.3 Nech A = {a1, a2, . . . , ar} je zdrojová abeceda, nech A = {a1, a2, . . . , ar−1} je re-dukovaná abeceda abecedy A a nech K je najkratší binárny prefixový kód abecedy A. Ďalej,nech kód K : A 7→ {0, 1}∗ je definovaný nasledovne.

K(ai) = K(ai), pre i ∈ {1, 2, . . . , r − 2}, K(ar−1) = K(ar−1)|0 a K(ar) = K(ar−1)|1 (4.4.3)

Potom kód K je najkratší binárny prefixový kód abecedy A.

Veta 4.3 dáva priamy návod na konštrukciu najkratšieho binárneho prefixového kódu abecedyA. Aký bude postup? Zoradíme prvky abecedy A do postupnosti a1, a2, . . . , ar tak aby platilop1 ≥ p2 ≥ . . . ≥ pr. Zostrojíme redukovanú abecedu A a opäť usporiadame jej prvky dopostupnosti tak, aby platilo p1 ≥ p2 ≥ . . . ≥ pr−1. Tento postup opakujeme dovtedy, kýmnedostaneme abecedu A s dvoma prvkami a1 a a2 tak, že p1 ≥ p2. Zostrojíme kód K prektorý platí K(a1) = 0 a K(a2) = 1. Spätným postupom (ako vo vete 4.3) sa dostaneme ažk najkratšiemu prefixovému binárnemu kódu K abecedy A. Tento postup sa dá veľmi ľahkozrealizovať pomocou binárneho koreňového stromu.

Algoritmus 4.4.1 Huffmanovo binárne kódovanie(V tomto algoritme vybudujeme binárny koreňový strom, ktorého vrcholom budú priradenépravdepodobnosti a znak kódovej abecedy (0 alebo 1) a ktorého listy budú zdrojové znaky).

1. Zostrojíme graf G = (V,E, p), kde V (G) = A, E(G) = ∅ a p(vi) = p(ai). To znamená, žena začiatku budeme mať graf bez hrán s r vrcholmi a vrcholu vi bude priradený znak ai apravdepodobnosť p(ai). O vrchole budeme hovoriť že je označený, ak už mu je priradenýznak kódovej abecedy. Na začiatku teda budú všetky vrcholy neoznačené.

Page 25: Časť I Algoritmy · Khwarizmi (Algorizm, 770 - 840), ktorý sa narodil na území dnešného Uzbekistanu. Zaoberal sa matematikou, astronómiou a geografiou. Aj ďaľší dôležitý

Kapitola 4: Kódovanie 25

2. Nájdeme dva neoznačené vrcholy s najnižšími pravdepodobnosťami. Nech tieto vrcholysú x a y. Vrchol x označíme značkou 0 a vrchol y značkou 1. Následne vytvoríme nový(neoznačený) vrchol z s pravdepodobnosťou p(z) = p(x) + p(y) a vedieme z neho šípydo vrcholov x, y tak, aby vrcholy x a y boli súrodenci. To znamená že V ←− V ∪ {z} aE ←− E ∪ {(z, x), (z, y)}.

3. Ak G je súvislý graf, ideme na Krok 4, inak ideme na Krok 2.4. Graf G je koreňovým binárnym stromom. Jeho koreňu je priradená pravdepodobnosť 1 avšetky jeho vrcholy okrem koreňa sú označené znakmi 0 alebo 1 kódovej abecedy. Keďžedo každého listu vedie z koreňa práve jedna cesta, značky vrcholov na ceste určujú binárnyprefixový kód listu a teda zdrojového znaku.

Príklad 4.4.1 Nájdite Huffmanov binárny kód zdrojovej abecedy X = {A,B,C,D,E}, akpravdepodobnosti výskytu znakov sú 0.5, 0.3, 0.1, 0.05 a 0.05. Vypočítajte strednú dĺžkukódového slova tohoto kódovania.Riešenie: Binárny strom Huffmanovho kódovania je na obrázku ??. Vidíme, že Huffmanov kódabecedy X je A 7→ 0, B 7→ 10, C 7→ 110, D 7→ 1110, E 7→ 1111 a stredná dĺžka kódového slovaje d = 1 · 0.5 + 2 · 0.3 + 3 · 0.1 + 4 · 0.05 + 4 · 0.05 = 1.8.

Podobným spôsobom môžeme zostrojiť aj najkratší s-árny kód abecedy A. Rozdiel bude vkonštrukcii redukovanej abecedy A.

Definícia 4.4.4 Nech A = {a1, a2, . . . , ar} je zdrojová abeceda s pravdepodobnosťami výskytuznakov p1 ≥ p2 ≥ . . . ≥ pr a nech B = {b1, b2, . . . , bs} je kódová abeceda, pričom pre čísla r a splatí: r−s = t(s−1) pre nejaké prirodzené číslo t > 1. Podotýkame, že ak neexistuje prirodzenéčíslo t tak aby r− s = t(s− 1), doplníme abecedu A o (čo najmenší počet) q fiktívnych znakovs pravdepodobnosťou 0 tak, aby platilo r− s+ q = t(s− 1). Abecedu A = {a1, a2, . . . , ar−s+1}s pravdepodobnosťami výskytu znakov p1, p2, . . . , pr−s+1 nazveme redukovanou abecedouabecedy A, ak pre abecedu A platí:

1. Pre každé i ∈ {1, 2, . . . , r − s} platí ai = ai a pi = pi a2. ar−s+1 6∈ A∗ a pr−s+1 = pr−s+1 + pr−s+2 + . . .+ pr.

Samotnú konštrukciu najkratšieho prefixového s-árneho kódu uskutočníme pomocou s-árnehokoreňového stromu. Rozdiel oproti algoritmu 4.4.1 bude v Kroku 2 - budeme hľadať s neoz-načených vrcholov s najnižšími pravdepodobnosťami x1, x2, . . . , xs a označíme ich značkamib1, b2, . . . , bs (čiže znakmi kódovej abecedy).

Príklad 4.4.2 Nájdite Huffmanov ternárny kód zdrojovej abecedy X = {A,B,C,D,E, F}, akpravdepodobnosti výskytu znakov sú 0.3, 0.2, 0.2, 0.1, 0.09 a 0.11. Vypočítajte strednú dĺžkukódového slova tohoto kódovania.Riešenie: Ternárny strom Huffmanovho kódovania je na obrázku ??. Huffmanov kód abecedyX je A 7→ 0, B 7→ 1, C 7→ 20, D 7→ 21, E 7→ 220, F 7→ 221, G 7→ 222 a stredná dĺžka kódovéhoslova je d = 1 · 0.3 + 1 · 0.2 + 2 · 0.2 + 2 · 0.1 + 3 · 0.09 + 3 · 0.08 + 3 · 0.03 = 1.7.

Cvičenia k časti 4.4

Cvičenie 4.4.1 Nájdite Huffmanov binárny kód zdrojovej abecedy X = {A,B,C,D,E}, akpravdepodobnosti výskytu znakov sú 1

3 ,124 ,

16 ,

14 ,

524 . Vypočítajte strednú dĺžku kódového slova

tohoto kódovania.

Cvičenie 4.4.2 Nájdite Huffmanov binárny kód zdrojovej abecedy X = {A,B,C,D,E, F,G},ak pravdepodobnosti výskytu znakov sú 0.2, 0.15, 0.15, 0.1, 0.25, 0.1 a 0.05. Vypočítajtestrednú dĺžku kódového slova tohoto kódovania.

Cvičenie 4.4.3 Nájdite Huffmanov binárny kód zdrojovej abecedyX = {A,B,C,D,E, F,G,H, I, J}, ak pravdepodobnosti výskytu znakov sú rovnaké. Vypočí-tajte strednú dĺžku kódového slova tohoto kódovania.

Cvičenie 4.4.4 Nájdite Huffmanov ternárny kód zdrojovej abecedyX = {A,B,C,D,E, F,G,H},ak pravdepodobnosti výskytu znakov sú 0.3, 0.2, 0.2, 0.1, 0.09, 0.05, 0.03 a 0.03:a) s kódovými slovami aj dĺžky 4b) s kódovými slovami dĺžky nanajvýš triV oboch prípadoch vypočítajte strednú dĺžku kódového slova a výsledky porovnajte.

Page 26: Časť I Algoritmy · Khwarizmi (Algorizm, 770 - 840), ktorý sa narodil na území dnešného Uzbekistanu. Zaoberal sa matematikou, astronómiou a geografiou. Aj ďaľší dôležitý

Kapitola 4: Kódovanie 26

Cvičenie 4.4.5 Nájdite Huffmanov ternárny kód zdrojovej abecedyX = {A,B,C,D,E, F,G,H, I, J}, ak pravdepodobnosti výskytu znakov sú rovnaké. Vypočí-tajte strednú dĺžku kódového slova tohoto kódovania.

Cvičenie 4.4.6 Nájdite Huffmanov 4-árny kód zdrojovej abecedyX = {A,B,C,D,E, F,G,H},ak pravdepodobnosti výskytu znakov sú 0.25, 0.2, 0.2, 0.1, 0.09, 0.08, 0.05 a 0.03. Vypočítajtestrednú dĺžku kódového slova tohoto kódovania.

Cvičenie 4.4.7 Nájdite Huffmanov 4-árny kód zdrojovej abecedyX = {A,B,C,D,E, F,G,H, I, J}, ak pravdepodobnosti výskytu znakov sú rovnaké. Vypočí-tajte strednú dĺžku kódového slova tohoto kódovania.

Cvičenie 4.4.8 Nájdite Huffmanov binárny kód pre text”KONECNEtNIECOtCOtSAtMItZIDE”, vypočítajte strednú dĺžku kódového slova to-hoto kódovania a určte dĺžku kódového textu. (Za znak počítajte aj medzeru.)

Cvičenie 4.4.9 V tabuľke 2 je frekvencia výskytu písmenových znakov v anglickom texte.Vypočítajte strednú dĺžku kódového slova zakódovaného do Morseovej abecedy. Navrhnite”novú” Morseovku tak, aby stredná dĺžka kódového slova bola čo najkratšia. V tabulke 3 súznaky usporiadané podľa frekvencie výskytu. Poznámka: toto nové kódovanie bude mať väčšiustrednú dĺžku kódového slova. Ako je to možné, keď Huffmanovo kódovanie je najkratšie?

A 8.54% B 1.39% C 2.79% D 3.78% E 13.04% F 2.89%G 1.99% H 5.28% I 6.07% J 0.13% K 0.43% L 3.39%M 2.49% N 7.07% O 7.97% P 1.99% Q 0.12% R 6.77%S 6.27% T 10.45% U 2.49% V 0.92% W 1.49% X 0.18%Y 1.99% Z 0.08%

Tabuľka 2: Frekvenčná tabuľka výskytu písmenových znakov v anglickom texte

E 13.04% T 10.45% A 8.54% O 7.97% N 7.07% R 6.77%S 6.27% I 6.07% H 5.28% D 3.78% L 3.39% F 2.89%C 2.79% M 2.49% U 2.49% Y 1.99% G 1.99% P 1.99%W 1.49% B 1.39% V 0.92% K 0.43% X 0.18% J 0.13%Q 0.12% Z 0.08%

Tabuľka 3: Frekvenčná tabuľka výskytu písmenových znakov v anglickom texte usporiadanýchpodľa frekvencie výskytu

Na záver ešte poznamenávame, že Huffmanovo kódovanie ktoré sme si práve popísali sa niekedynazýva aj statické Huffmanovo kódovanie. Jeho nevýhodou je, že pri vytváraní kódovejsprávy musíme zdrojový text spracovávať dvakrát; prvý krát keď zisťujeme frekvenciu výsky-tu znakov a druhý krát keď zostrojujeme kódový text. Túto nevýhodu odstraňuje takzvanédynamické alebo adaptívne Huffmanovo kódovanie, pri ktorom sa frekvencia výskytuznakov počas kódovania mení. Nevýhodou tohoto kódovania je pomalší algoritmus.

4.5 Kompresia dát

Kompresia je spôsob kódovania dát takým spôsobom, aby výsledný (komprimovaný) text bolčo najkratší. Kompresiu dát robíme z dvoch hlavných dôvodov:

1) Zvýšenie prenosovej rýchlosti komunikačného kanála.2) Zvýšenie kapacity pamäťového média.

Podľa toho či po kompresii a následnej dekompresii získame dáta v pôvodnom stave alebo

Page 27: Časť I Algoritmy · Khwarizmi (Algorizm, 770 - 840), ktorý sa narodil na území dnešného Uzbekistanu. Zaoberal sa matematikou, astronómiou a geografiou. Aj ďaľší dôležitý

Kapitola 4: Kódovanie 27

dostaneme iba ich časť, hovoríme o bezstratovej resp. stratovej kompresii. Stratová kom-presia sa väčšinou používa pri prenose a kompresii dát so zvukovou alebo obrazovou informácioua nie je veľmi dôležité aby sme vedeli pôvodné dáta zrekonštruovať na 100%. Na druhej strane,bezstratová kompresia je absolútne nevyhnutná pri kompresii dátových súborov na disk počí-tača. Iba v krátkosti spomenieme hlavné metódy kompresie dát.

1. Shannon-Fanovo kódovanie2. Huffmanovo kódovanie, použitie napríklad v ”ARJ” (spolu s LZSS), posledný krok vkompresii do ”MJPEG”

3. Aritmetické kódovanie, použitie napríklad v ”LZARI” (spolu s LZSS)4. RLE kódovanie (Run Length Encoding), použitie napríklad v ”PCX” a ”BMP”5. Slovníkové metódy kompresie:a) LZ77 (Lempel - Ziv, 1977)b) LZSS (LZ77 + Storer - Szymanski, 1982), použitie v napríklad v ”PKZip” a ”ARJ”c) LZW (LZ78 + Welch, 1984), použitie napríklad v ”GIF” a ”COMPRESS”

BWT

Prvý z algoritmov, ktorý si spomenieme je BWT (Burrows-Wheeler Transformation, 1994).BWT vlastne nekomprimuje text ale pripravuje ho do podoby vhodnejšej na spracovanie ďaľší-mi algoritmami. Pri samotnej práci algoritmu sa využíva skutočnosť, že rovnaké podreťazcevstupu často začínajú rovnakými znakmi. Ak napríklad ”vá” sú podreťazce vstupu, bude veľkápravdepodobnosť, že veľa z nich sa bude začínať na ”o”.

BWT Kódovanie: Pri BWT kódovaní sa zdrojový text spracováva po blokoch kon-štantnej veľkosti. V našom príklade si síce ukážeme spracovanie bloku textu dĺžky 13, ale vskutočnosti (aby sme dosiahli primerané výsledky) sa používajú veľkosti blokov rádovo desťtisí-cov. Majme teda zdrojový text T = T0 dĺžky n, ktorý vznikne zreťazením n znakov zdrojovejabecedy. Postupným rotovaním tohoto reťazca doľava získame n reťazcov Ti, i ∈ {0, 1, 2, . . . , n−1} dĺžky n. Tieto reťazce usporiadame do tabuľky o rozmeroch n × n, pričom v i tom riad-ku tabuľky bude uložený reťazec Ti. Kvôli zrozumiteľnosti výkladu si zvolíme nejaký zdro-jový text, na ktorom budeme dokumentovať to čo práve robíme. Nech náš zvolený text je”POSLALItPOSLA”. Po n− 1 zrotovaniach tohoto textu doľava dostaneme tabuľku 4.

0 P O S L A L I t P O S L A1 O S L A L I t P O S L A P2 S L A L I t P O S L A P O3 L A L I t P O S L A P O S4 A L I t P O S L A P O S L5 L I t P O S L A P O S L A6 I t P O S L A P O S L A L7 t P O S L A P O S L A L I8 P O S L A P O S L A L I t9 O S L A P O S L A L I t P10 S L A P O S L A L I t P O11 L A P O S L A L I t P O S12 A P O S L A L I t P O S L

Tabuľka 4: Prvý krok pri kódovaní BWT algoritmom

Tieto reťazce následne utriedime (usporiadame lexikograficky). Keďže medzere je v ASCII kódepriradené najmenšie číslo (20), budeme ju klásť ešte pred písmeno ”A”. Výsledok po triedenívidíme v tabuľke 5. Výstupom BWT algoritmu bude posledný stĺpec tabuľky a číslo riadku, vktorom sa nachádza pôvodný reťazec. V našom prípade bude výstupom”ILLLSSAPPAtOO|9”. Vidíme, že už na takom malom príklade (ktorý bol samozrejmevolený cielene) sa prejavila ”snaha” utriediť rovnaké znaky zdrojovej abecedy k sebe.

BWT Dekódovanie: Zatiaľ čo BWT kódovanie je dosť priamočiare, dekódovanie jetrochu komplikovanejšie. Aké informácie máme o pôvodnom reťazci pri BWT dekódovaní?Máme k dispozícii posledný stĺpec znakov utriedených reťazcov a číslo riadku, v ktorom sanachádza pôvodný reťazec. Tiež máme k dispozícii prvý stĺpec utriedenej tabuľky - je to vlastnelexikograficky utriedený posledný stĺpec. Pozrime sa, ako to vyzerá v našom prípade.

Page 28: Časť I Algoritmy · Khwarizmi (Algorizm, 770 - 840), ktorý sa narodil na území dnešného Uzbekistanu. Zaoberal sa matematikou, astronómiou a geografiou. Aj ďaľší dôležitý

Kapitola 4: Kódovanie 28

0 t P O S L A P O S L A L I1 A L I t P O S L A P O S L2 A P O S L A L I t P O S L3 I t P O S L A P O S L A L4 L A L I t P O S L A P O S5 L A P O S L A L I t P O S6 L I t P O S L A P O S L A7 O S L A L I t P O S L A P8 O S L A P O S L A L I t P9 P O S L A L I t P O S L A10 P O S L A P O S L A L I t11 S L A L I t P O S L A P O12 S L A P O S L A L I t P O

Tabuľka 5: Druhý krok pri kódovaní BWT algoritmom

t IA LA LI LL SL SL AO PO P

9 P AP tS OS O

Tabuľka 6: Prvý krok pri dekódovaní BWT algoritmom

Ako postupovať ďalej? Všimnime si prvý znak v poslednom stĺpci (je to vlastne prvý znakvýstupu BWT). Otázka znie, ktorému znaku v prvom stĺpci tento znak zodpovedá. Ukážemesi to na našom príklade. Keďže prvý znak v poslednom stĺpci je ”I”, zodpovedá (jedinému)znaku ”I” v prvom stĺpci. Ďaľší znak v poslednom stĺpci (druhý z výstupu BWT) je znak ”L”.Ktorému z troch ”L” v prvom stĺpci zodpovedá? Keďže všetky reťazce (pri BWT kódovaní)vznikli rotáciou a následným usporiadaním jediného reťazca, podreťazec, ktorým sa začína ria-dok s týmto ”L” na konci, je lexikograficky najmenší zo všetkých podreťazcov, ktoré nasledujúza ”L”. Ale to znamená, že prvý výskyt ”L” v poslednom stĺpci zodpovedá prvému výskytu”L” v prvom stĺpci (pretože za prvým ”L” v prvom stĺpci nasleduje lexikograficky najmenšípodreťazec). Podobne, druhý výskyt ”L” v poslednom stĺpci zodpovedá druhému výskytu ”L”v prvom stĺpci. Samozrejme, toto platí všeobecne. Čiže už vieme, že i-ty výskyt znaku ”X” vposlednom stĺpci zodpovedá i-temu výskytu znaku ”X” v prvom stĺpci.

Poďme teraz zrekonštruovať pôvodný reťazec. Rekonštrukciu budeme robiť odzadu. Z reťazca”ILLLSSAPPAtLOO|9” sme sa dozvedeli, že posledný znak pôvodného reťazca je 9-ty znak(ak pčítame od nuly) v tomto reťazci, čiže znak ”A”. Aký bude znak, ktorý stojí bezprostrednepred týmto ”A” v pôvodnom reťazci (čiže predposledný znak pôvodného reťazca)? Naše ”A”je druhým výskytom znaku ”A” v poslednom stĺpci, preto zodpovedá druhému výskytu ”A”v prvom stĺpci. Keďže všetky reťazce boli rotované doľava, znak na konci riadku v ktorom sana začiatku nachádza znak ”A” v druhom výskyte, stojí pred týmto ”A” v pôvodnom reťazci.Toto písmeno je znak ”L”. Preto na výstupe dostávame ”LA”. A opäť, toto ”L” je druhé ”L” vposlednom stĺpci a zodpovedá preto druhému ”L” v prvom stĺpci. Na konci tohoto riadku stojí”S” - dostávame ”SLA”. Nakoniec získame reťazec ”POSLALItPOSLA”. I keď dekódovanievyzerá veľmi komplikovane, v praxi sa dá vykonať na jeden prechod transformovaným textomv čase O(n).

Page 29: Časť I Algoritmy · Khwarizmi (Algorizm, 770 - 840), ktorý sa narodil na území dnešného Uzbekistanu. Zaoberal sa matematikou, astronómiou a geografiou. Aj ďaľší dôležitý

Kapitola 4: Kódovanie 29

MTF

Ďaľší algoritmus ktorý si uvedieme je MTF (Move To Front). Podobne ako BWT, ani MTFalgoritmus text nekomprimuje, ale transformuje. Tentoraz nepermutuje znaky zdrojového tex-tu, ale transformuje rvnaké znaky (i keď nie všetky) na nuly a nízke čísle, čím zabezpečí navýstupe častý výskyt čísla 0 a nízkych čísel. Ako už názov algoritmu napovedá, budeme čosipresúvať dopredu.

MTF Kódovanie: Na začiatku budeme mať utriedený zásobník naplnený znakmi zdro-jovej abecedy vstupného textu. Ak napríklad vstupný text bude anglický, zásobník môže obsa-hovať znaky s ASCII kódom po 127. V našom prípade môže zásobník vyzerať napríklad takto:0 1 2 3 4 5 6P O S L A I t , pričom pozície znakov ráteme od 0. Postup je nasledovný. Načí-

tame prvý znak vstupného textu, dáme jeho pozíciu na výstup a presunieme tento znak nazačiatok zásobníka (čiže na pozíciu 0). Tento postup opakujeme až kým nespracujeme celývstupný text. Všimnime si, že keď za sebou nasleduje n rovnakých znakov, povedzme ”X”, vovýstupe budeme mať pozíciu znaku ”X” v zásobníku a za ňou bude nasledovať n− 1 núl. Tedaak sa MTF aplikuje na nejaký vstupný text typu výstupu z BWT, vo výstupe budeme mať veľanúl a nízkych čísel, čo sa dá potom dobre použiť ako vstup napríklad pri Huffmanovom aleboaritmetickom kódovaní.

Ukážme si predchádzajúci postup na príklade a nech vstupný text je výstup z BWT z pred-chádzajúceho príkladu - ”ILLLSSAPPAtLOO|9”. Zásobník nech je0 1 2 3 4 5 6P O S L A I t . Načítame ”I”, na výstup dáme ”5” a ”I” presunieme na pozíciu

”0”, čiže dostávame0 1 2 3 4 5 6I P O S L A t . Druhý načítaný znak je ”L, na výstup dáme

”4” a ”L” presunieme na pozíciu ”0”; dostávame0 1 2 3 4 5 6L I P O S A t . Tretí a štvrtý

znak vstupného textu je ”L”, preto na výstup dáme dve nuly. Po prečítaní vstupného slovamáme na výstupe ”5400405401660”.

MTF dekódovanie: Na začiatku máme opäť zásobník naplnený znakmi presne v tomistom poradí ako sme mali pri MTF kódovaní. Načítame prvý index, povedzme i, na výstupdáme znak na pozícii i v zásobníku a tento znak presunieme na pozíciu 0. Celý postup opakujemaž kým neprečítame celý vstupný text.

Poznámka 6 Ako sme už spomínali, BWT ani MTF vstupný text nekoprimujú, iba ho trans-formujú tak, aby sa dali úspešne aplikovať kódovania ako sú Huffmanovo alebo aritmetické,ktoré využívajú na minimalizáciu kódu pravdepodobnosti výskytu znakov.

Príklad 4.5.1 Nájdite Huffmanov binárny kód textov ”POSLALItPOSLA” a ”5400405401660”.Riešenie. V prvom prípade dostaneme (napríklad) kódovaniet A I L O P S1111 01 1110 00 100 101 110

so strednou dĺžkou kódového slova 3613 a s celkovou

dĺžkou zakódovaného textu 36. V druhom prípade dostaneme (napríklad) kódovanie0 1 4 5 60 1111 10 110 1110

so strednou dĺžkou kódového slova 2913 a s celkovou dĺžkou zakó-

dovaného textu 29.

Poznámka 7 Postupnosť algoritmov BWT - MTF - Huffman sa používa napríklad v kompres-nej utilite bzip2.

Cvičenia k časti 4.5

Cvičenie 4.5.1 Aplikujte BWT na reťazec ”aabacabcaba”.

Cvičenie 4.5.2 Aplikujte BWT na reťazec ”kikirikiki”.

Cvičenie 4.5.3 Nájdite vstup do BWT, ak výstup je ”AADtLLDAAMAIt|10”.

Page 30: Časť I Algoritmy · Khwarizmi (Algorizm, 770 - 840), ktorý sa narodil na území dnešného Uzbekistanu. Zaoberal sa matematikou, astronómiou a geografiou. Aj ďaľší dôležitý

Kapitola 4: Kódovanie 30

Cvičenie 4.5.4 Aplikujte MTF na reťazec ”aaabccabbbabb”, ak zásobník je0 1 2a b c

.

Cvičenie 4.5.5 Aplikujte MTF na reťazec ”aabbbacccabca”, ak zásobník je0 1 2c b a

.

Cvičenie 4.5.6 Nájdite vstup do MTF, ak výstup je ”30041200103002” a zásobník je0 1 2 3 4A B C D E

.

Cvičenie 4.5.7 Majme zdrojový text ”BLAtBLAtBLA”.a) Nájdite Huffmanov binárny kód tohoto textu.b) Na zdrojový text aplikujte BWT algoritmus.

c) Na výstup z BWT (bez indexu riadku) aplikujte MTF algoritmus so zásobníkom0 1 2 3t A B L

.

d) Nájdite Huffmanov binárny kód výstupu z MTF.e) Vypočítajte strednú dĺžku kódového slova v prípade a) a d) a výsledky porovnajte.

Cvičenie 4.5.8 Nech výstup z MTF je ”223030023100”.a) Nájdite Huffmanov binárny kód tohoto reťazca.

b) Nájdite vstup do MTF, ak zásobník je0 1 2 3N A S t .

c) Nech reťazec nájdený v b) je výstup z BWT. Nájdite vstup do BWT, ak pôvodný reťazec sanachádza na 8 riadku.d) Nájdite Huffmanov binárny kód reťazca nájdeného v c).e) Vypočítajte strednú dĺžku kódového slova v prípade a) a d) a výsledky porovnajte.

4.6 Bezpečnostné kódy

V predchádzajúcich kapitolách sme sa dozvedeli čo je to kódovanie a na čo sa používa. Ukázalisme si konštrukcie kódov so špeciálnymi vlastnosťami vzhľadom na tvar kódového slova (pre-fixové a blokové kódy) a tiež vzhľadom na priemernú dĺžku kódového slova (najkratšie kódy).Teraz si povieme niečo o kódoch, ktoré síce nie sú minimálne (dokonca sú dlhšie ako treba),ale plnia inú funkciu - zabezpečenie dát pred možnou stratou informácie. Najčastejšia je stra-ta informácie pri prenose prenosovým kanálom. Pretože prenosový kanál je vždy fyzikálneprostredie, napríklad kábel, pri prenose informácie môže dôjsť k jej poškodeniu. Vo všeobec-nosti, fyzikálnym poruchám ktoré spôsobujú zmenu informácie hovoríme šum. V tejto časti sipovieme o tom, ako sa odhaľujú a opravujú chyby spôsobené šumom. Kód a prenosový kanál naprenos informácie sa konštruujú tak, aby boli dosiahnuté čo najlepšie výsledky v nasledujúcichpiatich bodoch.

1. Rýchle kódovanie2. Ľahký prenos3. Rýchle dekódovanie4. Detekcia a oprava chýb spôsobených šumom5. Minimalizácia kódu

Minimalizáciou kódu sme sa zaoberali v predchádzajúcej kapitole. V štvrtom bode budememusieť naopak kód akýmsi spôsobom predĺžiť. Toto umelé predĺženie kódu, ktorého dôvodomje schopnosť prenášať informácie bez chýb, sa nazýva redundancia. Väčšina kódov, ktoré sapoužívajú na detekciu a opravu chýb sú blokové kódy. Predtým, ako si spomenieme niektoré ztakýchto kódov, uvedieme si nasledujúcu definíciu.

Definícia 4.6.1 Nech A = {a1a2 . . . ar} je abeceda a nech x = x1x2 . . . xn a y = y1y2 . . . yn

sú slová z A∗. Hammingovou vzdialenosťou d(x,y) slov x a y nazývame počet znakov vktorých sa tieto dve slová líšia. To znamená, že d(x,y) = |{i|xi 6= yi pre i = 1, 2, . . . n}|. AkK je blokový kód, najmenšiu Hammingovu vzdialenosť dvoch kódových slov kódu K nazývameminimálnou vzdialenosťou kódu K.

Page 31: Časť I Algoritmy · Khwarizmi (Algorizm, 770 - 840), ktorý sa narodil na území dnešného Uzbekistanu. Zaoberal sa matematikou, astronómiou a geografiou. Aj ďaľší dôležitý

Kapitola 4: Kódovanie 31

Príklad 4.6.1 Kód dva z piatich je binárny blokový kód dĺžky 5. Pozostáva zo všetkýchbinárnych slov dĺžky 5, ktoré obsahujú práve dve jednotky. Pretože takýchto slov je

(52

)= 10,

môže tento kód slúžiť napríklad na zakódovanie cifier 0 až 9. Jedno z týchto kódovaní môževyzerať nasledovne:

0 00011 5 010101 00101 6 100102 01001 7 011003 10001 8 101004 00110 9 11000

Minimálna vzdialenosť kódu ”dva z piatich” je dva.

Príklad 4.6.2 Opakovací kód je blokový kód dĺžky n, ktorého množina kódových slov po-zostáva zo všetkých slov tvaru xx . . . x︸ ︷︷ ︸

n

, kde x sú kódové znaky. Vidíme, že ak kódová abeceda

má s znakov, kód sa bude skladať z s kódových slov. Minimálna vzdialenosť opakovacieho kóduje n.

Príklad 4.6.3 Koktavý kód je kód, v ktorom sa každý vysielaný znak opakuje dvakrát. Čižekaždé kódové slovo je tvaru x1x1x2x2 . . . xnxn. Minimálna vzdialenosť koktavého kódu je dva.

Príklad 4.6.4 Kód celkovej parity patrí medzi najrozšírenejšie kódy. Konštruuje sa tak, žek binárnemu slovu pridáme jeden kontrolný znak tak, aby výsledné kódové slovo malo párnuparitu; t. j., aby počet jednotiek v slove bol párny. Napríklad pre n = 5 vyzerajú kódové slovánasledovne:

00000 00011 00101 0011001001 01011 01100 0111110001 10010 10100 1011111000 11011 11101 11110

Objavovanie chýb

Prvým predpokladom na to, aby sme mohli získať informáciu v tom tvare, v akom bola odoslaná,je vedieť zistiť, či pri prenose nedošlo k chybe. Napríklad, ak niekomu posielame správu,ktorá obsahuje slovo ”kôvodné”, je zrejmé, že došlo k chybe a dokonca aj vieme na ktorommieste. Čo nevieme, je či odosielané slovo bolo ”pôvodné” alebo ”dôvodné”. Ak však napríkladprijmeme slovo ”mala” nemáme dôvod predpokladať že prijaté slovo sa líši od vyslaného (ibaak z kontextu), i keď vyslané slovo mohlo byť napríklad ”malo, mali, dala, mula, mapa” apodobne.

Definícia 4.6.2 Nech B je kódová abeceda a nech K je blokový kód dĺžky n. Slová dĺžky n zBn rozdeľujeme na kódové slová a nekódové slová, podľa toho, či patria alebo nepatria dokódovania K. Ak vyšleme kódové slovo a prijmeme slovo z Bn, ktoré nie je kódové, hovorímeže sme objavili chybu. Chybu nazveme t-násobnou, ak počet chybných miest v prijatomslove je nanajvýš t. O kóde K hovoríme že objavuje t-násobné chyby, ak pri vyslaní kódovéhoslova a vzniku t-násobnej chyby je prijaté slovo vždy nekódové.

Poznámka 8 Blokový kód s minimálnou vzdialenosťou d objavuje všetky t-násobné chyby pret < d, ale neobjaví všetky d-násobné chyby.

Príklad 4.6.5 Kód dva z piatich objavuje všetky jednoduché chyby a niektoré dvojnásobné.

Príklad 4.6.6 Opakovací kód objavuje všetky (n − 1)-násobné chyby a neobjaví žiadnu n-násobnú chybu.

Príklad 4.6.7 Koktavý kód objavuje všetky jednoduché chyby a niektoré dvojnásobné.

Príklad 4.6.8 Kód celkovej parity objavuje všetky jednoduché chyby a neobjaví žiadnu dvo-jnásobnú chybu.

Opravovanie chýb

Doteraz sme hovorili iba o objavovaní chýb. Ak nejaký kód objaví chybu, vieme síce že nastala,ale zatiaľ nevieme kde nastala a preto ju ani nevieme opraviť. Vo všetkých predchádzajúcichpríkladoch sme videli príklady kódov, ktoré objavujú chyby. Toto je možné iba vďaka tomu,že kódové slová obsahujú nadbytočné, takzvané redundantné znaky. Napríklad v slovenskom

Page 32: Časť I Algoritmy · Khwarizmi (Algorizm, 770 - 840), ktorý sa narodil na území dnešného Uzbekistanu. Zaoberal sa matematikou, astronómiou a geografiou. Aj ďaľší dôležitý

Kapitola 4: Kódovanie 32

jazyku ak vyšleme slovo ”najmenšia” a prijmeme ľubovoľné zo slov ”nejmenšia, nojmenšia,nadmenšia” ap., vieme vždy identifikovať pôvodné slovo. V umelom jazyku však takéto opravynemusia byť vždy možné. Ak napríklad pri použití opakovacieho kódu dĺžky 5 prijmeme slovo”00001”, vieme že vyslané slovo bolo ”00000” (za predpokladu jednoduchej chyby); ak všakprijmeme to isté slovo pri použití kódu celkovej parity vieme síce o chybe ale nevieme kdenastala. Množina možných vyslaných slov (za predpokladu jednoduchej chyby) je totiž ”00000,00011, 00101, 01001, 10001”.

Definícia 4.6.3 Nech K je kód, nech x je vyslané slovo a nech pri t-násobnej chybe prijmemeslovo y. Hovoríme, že kód K objavuje t-násobné chyby, ak Hammingova vzdialenosť d(x,y)je menšia ako ako vzdialenosť slova y od ľubovoľného iného kódového slova.

Poznámka 9 Blokový kód minimálnej vzdialenosti d opravuje t-násobné chyby pre všetky číslat < d

2 .

Príklad 4.6.9 Kód dva z piatich neopravuje žiadne chyby.

Príklad 4.6.10 Opakovací kód opravuje všetky bn2 c-násobné chyby.

Príklad 4.6.11 Koktavý kód neopravuje žiadne chyby.

Príklad 4.6.12 Kód celkovej parity neopravuje žiadne chyby.

Príklad 4.6.13 Kód dvojrozmernej kontroly parity vzniká nasledovne. Informačné znakyzapíšeme do matice typu m × n a ku každému riadku a stĺpcu pridáme jeden znak kontrolyparity. Nakoniec do (m + 1)-hého riadku a (n + 1)-hého stĺpca pridáme kontrolný znak tak,aby celá matica obsahoval párny počet jednotiek. Tento kód opravuje jednoduché chyby. Vnasledujúcej schéme vidíme príklad kódu dvojrozmernej kontroly parity pre m = 6 a n = 4.

0000 0 ← kontrola parity riadku0001 10010 11111 01110 11011 1

kontrola parity stĺpca → 1001 0 ← kontrola parity matice

Ako sme videli na predchádzajúcich príkladoch, niekedy sa dajú znaky kódových slov rozdeliť nainformačné a kontrolné znaky. Napríklad opakovací kód dĺžky n obsahuje jeden informačnýa n−1 kontrolných znakov. Podobne, kód celkovej parity obsahuje n−1 informačných znakov ajeden kontrolný znak a kód dvojrozmernej kontroly parity obsahujemn informačných am+n+1kontrolných znakov. Nie vždy je možné znaky kódu takto rozdeliť; kód ”dva z piatich” jepríkladom takéhoto kódu. Blokové kódy dĺžky n, ktorých každé kódové slovo pozostáva z n− kinformačných a k kontrolných znakov často konštruujeme tak, aby prvých n − k znakov boloinformačných a ostatné boli kontrolné. Takéto kódy sa nazývajú systematické.

Poznámka 10 Pri konštrukcii bezpečnostného kódu sa snažíme, aby informačný pomer R =n−k

n počtu informačných znakov k celkovému počtu znakov kódového slova bol čo najväčší.

Existuje veľa bezpečnostných kódov, ktoré sa líšia rôznymi parametrami:

1. Informačný pomer2. Počet objavených chýb3. Počet opravených chýb4. Rýchlosť kódovania5. Rýchlosť dekódovania

Medzi najvýznamnejšie bezpečnostné kódy patria linárne kódy z ktorých môžeme spomenúťnapríklad Hammingove kódy, Golayov kód, Reed-Mullerove kódy a cyklické kódy.

Page 33: Časť I Algoritmy · Khwarizmi (Algorizm, 770 - 840), ktorý sa narodil na území dnešného Uzbekistanu. Zaoberal sa matematikou, astronómiou a geografiou. Aj ďaľší dôležitý

Kapitola 5: Šifrovanie 33

5 Šifrovanie

5.1 Úvod

Iste už každý z vás videl nasledujúcu filmovú scénku. Istý objekt má za päť minút vybuchnúťa jediný človek, ktorý pozná supertajný kľúč na zastavenie výbuchu je človek, ktorý výbuchuzabrániť nechce. Zrazu príde chlapík (mimochodom ovládajúci aj všetky druhy bojových umení)a v čase 4 minúty 55 sekúnd stihne odhaliť tento kľúč, nad ktorým si vylámali zuby všetcipoprední hackeri a kryptológovia. Je zrejmé, že predchádzajúca scénka patrí do žánru SCI-FI abežný človek sa nad takým niečim väčšinou ani nepozastaví. Jednak preto, že už je na podobnéscénky zvyknutý a jednak preto, že sa mu zdá že šifry a tajné kľúče sú niečo s čím sa bežnev živote nestretáva. Napriek tomu, opak je pravdou. Už malé deti si vymýšľajú svoju tajnúreč, ”kumpáni z mokrej štvrte” majú dohovorené znaky, priatelia majú dohodnuté slová resp.frázy, o ktorých iba zasvätení vedia čo znamenajú.

Príklady z prechádzajúceho odseku sú príkladmi kódov s utajenými kódovými tabuľkami.Šifrovanie spočíva v niečom inom. V každom prípade však ide o to, aby sme nejakú informáciumodifikovali tak, aby sa k jej pravému obsahu mohol dostať iba človek na to oprávnený. Vednýodbor zaoberajúci sa bezpečnosťou komunikácie sa nazýva kryptológia. Samotná kryptológiasa rozdeľuje na dva pododbory - na kryptografiu a kryptoanalýzu. Kryptografia sa zaoberákonštrukciou algoritmov slúžiacich na utajenie informácie a naopak, kryptoanalýza sa zaoberámožnosťami útokov na kryptografické algoritmy. Názov kryptológia je odvodený z gréckychslov ”kryptós” - skrytý, tajný a ”lógos” - slovo; doslova preložené teda kryptológia znamenátajné písmo.

Informácie sa dajú utajiť dvomi spôsobmi - kódovaním a šifrovaním. Kódovanie spočíva vzostrojení kódu, ktorý musí zostať utajený. Napríklad vojaci (ale nielen oni) používajú kódovéslová na utajenie miesta resp. identity osoby. Preto napríklad odpočutý hovor ”Tu Havran.Volám Jastraba. Stretneme sa pri Hniezde.” nezasvätenej osobe nič nepovie. Tí, čo poznajúkód však vedia, že major Vlk volá plukovníka Hada a oznamuje mu, že sa stretnú u Mamutana pive. Šifrovanie je niečo iné. Pri šifrovaní sa používa nejaký algoritmus na zmenu znakovvstupného textu pomocou nejakého kľúča. Pritom samotný algoritmus môže alebo nemusí byťutajený a kľúč (alebo aspoň jeho časť) byť utajený musí.

Ako v prípade kódov, aj pri šifrách budeme používať pojmy ako abeceda, znak a podobne.Rozdiel bude v tom, že pri šifrovaní bude (väčšinou) zdrojová a ”šifrová” abeceda rovnaká. Narozdiel od kódovania, nebudeme používať pojmy zdrojový a kódový text, ale otvorený text(plaintext) a šifrový text (ciphertext). Cieľom šifrovania (encryption) je zameniť znakyvstupného textu tak, aby výstupný text bol pre potenciálneho útočníka nezrozumiteľný. Akosme už spomínali, šifrovanie sa deje za pomoci šifrovacieho algoritmu a šifrovacieho kľúča(encryption key). Základná schéma pre šifrovanie je teda nasledovná:

Otvorený text −→ Šifrovacíalgoritmus

−→ Šifrový text

↑Šifrovací kľúč

Inverzný proces k šifrovaniu sa nazýva dešifrovanie (decryption). Pritom získavame zošifrového textu pomocou dešifrovacieho algoritmu a dešifrovacieho kľúča pôvodný, t. j.otvorený text. Schéma pre dešifrovanie vyzerá preto nasledovne.

Šifrový text −→ Dešifrovacíalgoritmus

−→ Otvorený text

↑Dešifrovací kľúč

5.2 Symetrické šifrovanie

Jedna z prvých známych šifier je takzvaná Caesarova šifra. Šifrovanie spočívalo v tom, že savšetky znaky otvoreného textu v abecede posunuli o rovnaký počet znakov. V tomto prípadespočíva šifrovací algoritmus v nahradení každého jednotlivého znaku otvoreného textu znakom,ktorý je posunutý v abecede doprava o hodnotu k. Číslo k je vlastne šifrovacím kľúčom.

Page 34: Časť I Algoritmy · Khwarizmi (Algorizm, 770 - 840), ktorý sa narodil na území dnešného Uzbekistanu. Zaoberal sa matematikou, astronómiou a geografiou. Aj ďaľší dôležitý

Kapitola 5: Šifrovanie 34

Príklad 5.2.1 Majme abecedu t, A, B, . . ., Z, pričom t je nultý znak abecedy, A je prvý znakabecedy, . . ., Z je 26-ty znak abecedy (viď tabuľku).

t A B C D E F G H I J K L M0 1 2 3 4 5 6 7 8 9 10 11 12 13

N 0 P Q R S T U V W X Y Z14 15 16 17 18 19 20 21 22 23 24 25 26

Nech otvorený text nad touto abecedou je P =”SOMtCAESAROVAtSIFRA”. Ak ako šifrovacíkľúč použijeme číslo k1 = 1, dostaneme šifrový text C1 =”TPNADBFTBSPWBATJGSB”, a pripoužití kľúča k2 = 12 získavame šifrový text C2 =”DtYLOMQDMCtGMLDURCM”. Vznikšifrových textov vidíme v nasledujúcich dvoch tabuľkách.

S O M t C A E S A R O V A t S I F R A↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓19 15 13 0 3 1 5 19 1 18 15 22 1 0 19 9 6 18 1+ + + + + + + + + + + + + + + + + + +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1= = = = = = = = = = = = = = = = = = =20 16 14 1 4 2 6 20 2 19 16 23 2 1 20 10 7 19 2↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓T P N A D B F T B S P W B A T J G S B

S O M t C A E S A R O V A t S I F R A↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓19 15 13 0 3 1 5 19 1 18 15 22 1 0 19 9 6 18 1+ + + + + + + + + + + + + + + + + + +12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12= = = = = = = = = = = = = = = = = = =4 0 25 12 15 13 17 4 13 3 0 7 13 12 4 21 18 3 13↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓D t Y L O M Q D M C t G M L D U R C M

Ak chceme zo šifrového textu získať späť otvorený text, musíme použiť dešifrovací algoritmus,ktorý v tomto prípade spočíva v posunutí všetkých znakov šifrového textu v abecede doľava ohodnotu šifrového kľúča. Vidíme, že v tomto prípade sú šifrovací aj dešifrovací kľúč rovnaké.Toto šifrovanie však nie je príliš bezpečné; ak sa niekto dovtípi aký je šifrovací algoritmus (posunznakov v abecede o určitý počet miest), jednoduchým preskúšaním možných 27 posunov šifruodhalí. Ďaľšie zlepšenie sa preto črtá vo zväčšení kľúča.

Príklad 5.2.2 Skúsme opäť zašifrovať text z príkladu 5.2.1 napríklad s použitím kľúča k3 =|1|12|26|. V tomto prípade šifrovací algoritmus funguje tak, že otvorený text rozdelíme nabloky dĺžky tri a každý prvý (druhý, resp. tretí) znak v bloku posunieme v abecede o 1 (12,resp. 26) znakov doprava. Pri použití tohoto kľúča a šifrovacieho algoritmu dostávame šifrovýtext C3 =”TtLAOtFDtStUBLRJRQB” a samotné šifrovanie môžeme vidieť v nasledujúcejtabuľke.

S O M t C A E S A R O V A t S I F R A↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓19 15 13 0 3 1 5 19 1 18 15 22 1 0 19 9 6 18 1+ + + + + + + + + + + + + + + + + + +1 12 26 1 12 26 1 12 26 1 12 26 1 12 26 1 12 26 1= = = = = = = = = = = = = = = = = = =20 0 12 1 15 0 6 4 0 19 0 21 2 12 18 10 18 17 2↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓T t L A O t F D t S t U B L R J R Q B

Opäť však vidíme, že ak niekto pozná algoritmus, môže preskúšaním všetkých 273 možnýchkľúčov získať otvorený text. Ak však predĺžime veľkosť bloku až na počet znakov otvorenéhotextu, text sa bez kľúča nebude dať dešifrovať.

Page 35: Časť I Algoritmy · Khwarizmi (Algorizm, 770 - 840), ktorý sa narodil na území dnešného Uzbekistanu. Zaoberal sa matematikou, astronómiou a geografiou. Aj ďaľší dôležitý

Kapitola 5: Šifrovanie 35

Príklad 5.2.3 Predstavme si, že veľkosť bloku je 19 a majme kľúčk4 = |7|11|13|26|23|25|21|7|25|8|11|4|25|26|7|17|20|8|25|. Šifrový text, ktorý získame použitímbloku dĺžky 19 a kľúča k4 je C4 =”ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ”, ako môžeme vidieťv nasledujúcej tabuľke.

S O M t C A E S A R O V A t S I F R A↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓19 15 13 0 3 1 5 19 1 18 15 22 1 0 19 9 6 18 1+ + + + + + + + + + + + + + + + + + +7 11 13 26 23 25 21 7 25 8 11 4 25 26 7 17 20 8 25= = = = = = = = = = = = = = = = = = =26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z

V tomto prípade by bolo na dešifrovanie nutné vyskúšať 2719 možných kľúčov. Avšak ani vtomto prípade by potencionálny útočník šifru nerozlúštil. Pri dešifrovávaní by totiž získal 2719

možných otvorených textov dĺžky 19 (zmysluplných aj nezmyselných) a žiadnym spôsobom bynemohol rozhodnúť, ktorý z nich je ten správny text. Útočník by bol teda v situácii, ako kebynemal k dispozícii žiadny šifrový text (vedel by iba, že dĺžka otvoreného textu je 19).

Definícia 5.2.1 Nech P je množina otvorených textov, C je množina šifrových textov a nechK je množina kľúčov. Funkciu E : P → C nazveme šifrovacou funkciou, ak k nej existujedešifrovacia funkcia D : C → P , tak že:

∀k ∈ K a ∀p ∈ P : D(E(p, k), k) = p (5.2.1)

Ako vidíme, vo všetkých predchádzajúcich príkladoch aj v definícii 5.2.1, kľúč používaný prišifrovaní aj dešifrovaní je rovnaký. Preto sa takéto šifrovanie nazýva symetrické alebo tiežkonvenčné (conventional cryptography) z toho dôvodu, že až donedávna to bol jedinýspôsob šifrovania.

Vernamova šifra (one time pad)

V roku 1917 navrhol Gilbert Vernam pre společnost American Telephone and Telegraph (AT&T)jednoduchý princíp šifrovania - sčítanie otvoreného textu s náhodným heslom. Heslo bolo vy-dierované na diernej páske, ktorá sa zavádzala do ďalekopisu a sčítalo sa so znakmi písanýmina klávesnici telegrafného prístroja. V rokoch 1948 a 1949 publikoval americký vedec ClaudeElwood Shannon dva články - Matematická teória komunikácie (A Mathematical Theory ofCommunication) a Komunikačná teória tajných systémov (Communication Theory of SecrecySystems), v ktorých položil základy teórie informácie a kryptológie v termínoch informačnejteórie. Okrem iného ako prvý použil termín absolútne bezpečná šifra (unbreakable cipher)a dokázal, že Vernamova šifra je absolútne bezpečná, ak splníme nasledujúce predpoklady:

1. Heslo (kĺúč) je volené z množiny K kľúčov nezávisle, náhodne a rovnako prevdepodobne.2. Každé heslo (kľúč) môže byť použité iba raz (na zašifrovanie jediného otvoreného textu)- odtiaľ pochádza aj termín one time pad.

Príklad 5.2.3 bol príkladom Vernamovej šifry. V praxi sa Vernamova šifra realizuje tak, že abece-da otvoreného aj zdrojového textu je množina A = {0, 1} a množina otvorených aj šifrovýchtextov je množina P = C = {0, 1}n, kde n je prirodzené číslo. Kľúče sú n−bitové reťazce, čižeK = {0, 1}n a šifrovacia a dešifrovacia funkcia sú definované nasledovne. Ak p = p1|p2| . . . |pn

je otvorený text a k = k1|k2| . . . |kn je kľúč (podotýkame, že otvorený text aj kľúč sú binárnereťazce dĺžky n), potom šifrový text c = E(p, k) = p ⊕ k = p1 ⊕ k1|p2 ⊕ k2| . . . |pn ⊕ kn a predešifrovaciu funkciu platí p = D(c, k) = c⊕ k = c1 ⊕ k1|c2 ⊕ k2| . . . |cn ⊕ kn.

Máme teda k dispozícii (pri dodržaní predchádzajúcich pravidiel) absolútne bezpečný šifrovacísystém. Načo teda vymýšľať niečo ďaľšie? Vernamova šifra má jeden vážny nedostatok. Abypríjemca správy mohol získať otvorený text, musíme mu na dešifrovanie doručiť kľúč - čižen−bitový reťazec. Dôverný prenos správy dĺžky n sme teda vymenili za dôverný prenos kľúčadĺžky n. S takouto situáciou sa síce môžeme uspokojiť ak kľúče vygenerujeme dopredu a

Page 36: Časť I Algoritmy · Khwarizmi (Algorizm, 770 - 840), ktorý sa narodil na území dnešného Uzbekistanu. Zaoberal sa matematikou, astronómiou a geografiou. Aj ďaľší dôležitý

Kapitola 5: Šifrovanie 36

zabezpečíme ich jednorazovú distribúciu (napr. velvyslanec s diplomatickým kufríkom) ale pridnešnom objeme prenášaných správ je takéto niečo nemysliteľné.

V súčasnosti najčastejšie používané symetrické šifrovacie systémy používajú na šifrovanie kľúčepevnej dĺžky (napríklad 128 bitov) a rozdeľujú sa na blokové a prúdové systémy. V blokovýchsystémoch sa otvorený text rozdelí na bloky pevnej dĺžky (pritom dĺžka bloku je rovná dĺžkekľúča) a šifrovacia funkcia transformuje znaky každého bloku. Dĺžka kľúča sa volí kompromi-som; čím kratší je kľúč, tým je šifrovanie aj dešifrovanie rýchlejšie, ale zvyšuje sa riziko rozbitiašifry. Na druhej strane, čím je kľúč dlhší, tým je pre potenciálneho útočníka ťašie dešifrovaťšifrový text, ale zvyšuje sa aj zložitosť šifrovania a dešifrovania a tiež distribúcia kľúčov. Najednej strane spektra dostávema teda Caesarovu šifru extrémne jednoduchú na dešifrovanie a nadruhej strane dostávame Vernamovu šifru pri ktorej nastávajú problémy s dopravou dešifrova-cieho kľúča. Na zvýšenie odolnosti blokových šifier voči možným útokom sa používajú takzvanéiterované šifry. Pri týchto šifrách sa definuje základná transformácia, ktorá sa potom použijeviacnásobne, pričom pri každom použití sa môže použiť iný podkľúč odvodený zo základnéhokľúča vopred daným postupom ktorý sa nazýva plánovanie kľúča (key scheduling).

Prúdové systémy napodobňujú princíp Vernamovej šifry. Tajný kľúč síce nedosahuje dĺžkuotvoreného textu (dokonca je rádovo kratší) ale slúži ako inicializačný vektor nejakého konečno-stavového deterministického zariadenie na výrobu kľúča rovnakej dĺžky ako má otvorený text.Prúdové systémy sa často používajú v prípadoch, keď treba správu šifrovať (dešifrovať) eštepred jej celým prijatím. Keďže sa tu napodobňuje princíp Vernamovej šifry, jednoducho sasčítavajú po bitoch modulo 2 prijatá správa a vygenerovaný kľúč.

V oboch prípadoch musia byť šifrovacie algoritmy veľmi kvalitné. Napríklad pri blokovýchšifrách musí každý bit šifrového textu komplikovaným spôsobom závisieť na každom bite otvo-reného textu a na každom bite šifrového kľúča. Naviac, zmena jediného bitu šifrovacieho kľúčaalebo otvoreného textu musí viesť k nepredvídateľnej zmene šifrového textu. Pri dnešnompoužívaní kryptografických systémov je zásadným predpokladom, že šifrovací aj dešifrovací al-goritmus je verejne známy. Je to spôsobené tým, že ak sa nejaký útočník zameria na to akofunguje daný algoritmus, skôr či neskôr zistí jeho popis (napríklad si kúpi software s danýmalgoritmom a jeho rozborom zistí ako, pracuje). Pri návrhu algoritmu je preto nevyhnutnépredpokladadať znalosť algoritmu potencionálnym útočníkom. Preto bezpečnosť symetrickéhosystému spočíva iba na utajení šifrovacieho kľúča. Z tohoto dôvodu sa symetrické šifrovanienazýva niekedy aj šifrovanie súkromným alebo tajným kľúčom. V nasledujúcej tabuľkevidíme príklady najpoužívanejších symetrických algoritmov.

Názov algoritmu Typ šifry Dĺžka kľúčaA5 Prúdová 54, 64

AES (Advanced Encryption Standard) Bloková 128 ,192, 256CAST (Carlisle Adams, Stafford Taveres) Bloková 40, 80, 128, 256DES (Data Encryption Standard) Bloková 56

IDEA (International Data Encryption Algorithm) Bloková 128Rijndael (Joan Daemen and Vincent Rijmen) Bloková 128, 192, 256RC2 (Ronald Rivest - Ron’s Cipher 2) Bloková 40, 128RC4 (Ronald Rivest - Ron’s Cipher 4) Prúdová 40, 128

Triple-DES Bloková 112, 168

5.3 Asymetrické šifrovanie

V predchádzajúcej časti sme sa zaoberali kryptografiou so súkromným kľúčom. Predstavme siteraz nasledovnú situáciu. Adam a Eva chcú spolu komunikovať tak, aby nikto nemohol ichsprávy odšifrovať. Adam a Eva sa však nikdy nevideli, pretože sa zoznámili v diskusnom fórea zrejme sa ani tak skoro neuvidia (Adam je z Filipín a Eva pochádza zo Slovenska). Ak bychceli použiť nejaké symetrické šifrovanie, problémom by bolo, ako dopraviť šifrovací kľúč odjedného k druhému. A keby sa to aj podarilo, na zašifrovanie ďaľšej správy by bolo potrebnédopraviť ďaľší kľúč a tak ďalej.

Na druhej strane si predstavme, že v nejakej komunite chce spolu tajne korešpondovať n ľudí,ktorí poznajú iba symetrické šifrovacie systémy. S distribúciou kľúčov by nemal byť problém;všetci sú totiž z jedného mesta a dosť často sa stretávajú. Môžu tedať odovzdať tajný kľúč

Page 37: Časť I Algoritmy · Khwarizmi (Algorizm, 770 - 840), ktorý sa narodil na území dnešného Uzbekistanu. Zaoberal sa matematikou, astronómiou a geografiou. Aj ďaľší dôležitý

Kapitola 5: Šifrovanie 37

priamo osobe s ktorou chcú komunikovať. Problémom je tentokrát správa kľúčov. Ak chcen ľudí navzájom utajene komunikovať, potrebujú celkovo minimálne

(n2

)= n(n−1)

2 kľúčov a vprípade že si chcú vymeniť viac ako jednu správu dokonca ešte väčší počet. Ak by v komuniteboli čo i len študenti jedného krúžku (povedzme 25), bolo by potrebné, aby každý z nich mal kdispozícii 24 tajných kľúčov ostatných študentov, pričom všetkých 24·25

2 = 500 kľúčov by muselobyť rôznych. Každému je zrejmé, že v takej záplave kľúčov by sa vyznal málokto, najmä ak bymusel po každej odoslanej správe vygenerovať nový kľúč a doručiť ho osobe, s ktorou si správuvymenil. Potom je už jednoduchšie žiadne šifrovanie nepoužívať a hovoriť spolu vždy osobne.

V roku 1975 sa situácia na poli šifrovania dramaticky zmenila. Bol vyvinutý prvý typ šifrovania,ktorý používa dva druhy kľúčov - jeden určený na šifrovanie a druhý na dešifrovanie. Skúsmesi ukázať ideu dvoch kľúčov na príklade. Predstavme si, že napíšem 27 dielnu encyklopédius názvami dielov t, A, B,. . . , Z, v ktorej budú všetky rôzne reťazce (v ľubovoľnom poradí)znakov t, A, B,. . . , Z dĺžky 20 a túto encyklopédiu zverejním. Ak mi ktokoľvek bude chcieťposlať šifrovanú správu, vezme prvý znak otvoreného textu a vyberie zväzok s názvom tohotoznaku. Potom túto knihu otvorí na ľubovoľnej strane a z ľubovoľného miesta strany vypíše 20písmenové slovo. Potom načíta daľší znak otvoreného textu, vezme zväzok s názvom tohotoznaku a celá situácia sa opakuje. Po ukončení získa zašifrovanú správu. Ak chce niekto terazrozšifrovať správu, čo musí urobiť? Vezme prvý 20 znakový reťazec šifrového textu a prehľadávavšetkých 27 zväzkov encyklopédie, až kým nenatrafí na ten istý reťazec. Tým získa prvýznak otvoreného textu a na prehľadanie celej encyklopédie potrebuje v najhoršom prípade 2720

porovnaní. Ak však chcem odšifrovať šifrový text ja, postupujem inak. Ja, ako jediný vlastník”inverznej” encyklopédie so slovami usporiadanými lexikograficky a so zodpovedajúcim znakompriradeným ku každému slovu potrebujem na vyhľadanie slova dĺžky 20 v najhoršom prípadelog2(2720) ≤ 100 krokov. Zverejnená encyklopédia je verejnou funkciou a slúži na šifrovanie,”inverzná” encyklopédia je súkromnou funkciou slúži na dešifrovanie. Teda šifrovať vie každý,ale dešifrovať vie iba vlastník ”inverznej” encyklopédie.

Definícia 5.3.1 Asymetrickým šifrovacím systémom budeme rozumieť dvojicu funkciíE a D, z ktorých prvá bude slúžiť na šifrovanie a budeme ju nazývať verejná funkcia adruhá bude slúžiť na dešifrovanie a budeme ju nazývať súkromná funkcia. Ak pri použitítýchto funkcií používame ako parameter nejaký kľúč, často hovoríme o verejnom (public) resp.súkromnom (secret) kľúči. Preto sa toto šifrovanie niekedy nazýva aj šifrovanie verejnýmkľúčom (public key cryptography).

D-H algoritmus (Diffie-Hellman)

Ako sme už spomínali vyššie, prvý asymetrický šifrovací systém vyvinuli v roku 1976 pániWhitfield Diffie a Martin Hellman (i keď je pravdou, že už v roku 1970 niečo podobné vyvi-nula Britská tajná služba, ale, ako to už vojaci zvyknú, urobila z toho vojenské tajomstvo anepoužívala to na nič). D-H algoritmus je kryptografický protokol, pomocou ktorého si dvajaúčastníci môžu dohodnúť tajný kľúč cez nezabezpečený komunikačný kanál. Takýto účastnícisa väčšinou v kryptológii nazývajú Alica a Bob. Čo teda musia Alica a Bob urobiť, aby sidohodli tajný kľúč (často nazývaný kľúč relácie)?

1. Alica a Bob sa dohodnú na nejakom prvočísle p a na nejakom primitívnom koreniq tohoto prvočísla. (Primitívny koreň prvočísla p je ľubovoľné prirodzené číslo q ∈{1, 2, . . . , p− 1} také, že qp−1 ≡ 1(mod p) a pre žiadne prirodzené číslo r < p− 1 neplatíqr ≡ 1(mod p).) Môžeme predpokladať, že p aj prvok q sú známe všetkým potencionál-nym útočníkom.

2. Alica vyberie náhodné prirodzené číslo x a pošle Bobovi qx(mod p).3. Bob vyberie náhodné prirodzené číslo y a pošle Alici qy(mod p).4. Alica vypočíta qxy(mod p) ako (qy(mod p))x(mod p).5. Bob vypočíta qxy(mod p) ako (qx(mod p))y(mod p).

Alica aj Bob teraz majú prvok qxy(mod p), ktorý bude slúžiť ako spoločný tajný kľúč relá-cie. Tento protokol sa považuje za bezpečný, pretože je výpočetne veľmi zložité nájsť čísloqxy(mod p) ak je dané p, q, qx(mod p) a qy(mod p) (problém Diffi-Hellman). Podobnýťažko riešiteľný problém, ktorý sa používa v El-Gamalov schéme je tzv. problém diskrét-neho logaritmu: ak je dané p, q a qx(mod p), treba nájsť x. V nasledujúcej tabuľke vidímeprimitívne korene pre niekoľko prvých prvočísel.

Page 38: Časť I Algoritmy · Khwarizmi (Algorizm, 770 - 840), ktorý sa narodil na území dnešného Uzbekistanu. Zaoberal sa matematikou, astronómiou a geografiou. Aj ďaľší dôležitý

Kapitola 5: Šifrovanie 38

Prvočíslo p Primitívne korene q prvočísla p2 13 25 2, 37 3, 511 2, 6, 7, 813 2, 6, 7, 11

Príklad 5.3.1 Majme prvočíslo p = 11 a primitívny koreň q = 6. Alica si zvolí náhodne číslox = 2 a Bob si zvolí y = 4. Alica posiela Bobovi číslo 62 = 36 ≡ 3(mod 11) a Bob posiela Alicičíslo 64 = 36 · 36 ≡ 3 · 3 ≡ 9(mod 11). Alica vypočíta 92 = 81 ≡ 4(mod 11) a Bob vypočíta34 = 81 ≡ 4(mod 11). Číslo 4 je teraz spoločný tajný kľúč relácie.

RSA algoritmus

Algoritmus RSA zverejnili v roku 1978 páni Ronald Rivest, Adi Shamir a Leonard Adleman.RSA algoritmus slúži na šifrovanie a dešifrovanie informácie pomocou dvojice verejný - súkrom-ný kľúč. Pritom verejný kľúč je k dispozícii každému, kto má záujem a slúži na zašifrovanieotvoreného textu a dešifrovať môže iba vlastník súkromného kľúča. Popíšeme teraz postup akosa inicializuje (vytvorí) dvojica verejný - súkromný kľúč v RSA.

1. Zvolíme dve dostatočne veľké rôzne prvočísla p a q a položíme n = p · q.2. Vyberieme ľubovoľné prirodzené číslo e, pre ktoré platí 1 < e < φ(n) a nsd(e, φ(n)) =

1. (Funkcia φ(n) je takzvaná Eulerova funkcia a je to vlastne počet prirodzených číselmenších ako n a nesúdeliteľných s n. Ak n = p · q je súčin dvoch rôznych prvočísel, potomφ(n) = (p−1)(q−1). Druhá podmienka hovorí, že najväčší spoločný deliteľ čísel e a φ(n)je 1, čiže e a φ(n) sú nesúdeliteľné.)

3. Vypočítame (jediné) číslo d, pre ktoré platí e · d ≡ 1(mod φ(n)) (zvyšok po delení číslae · d číslom φ(n) je 1).

V dnešnej dobe sa za dostatočne veľké prvočísla pokladajú prvočísla s dĺžkou aspoň 512 bitov(t. j. číslo o veľkosti aspoň 10154), aby sme po ich vynásobení dostali aspoň 1024 bitové číslo n.V RSA algoritme je verejným kľúčom dvojica (e, n) a súkromným kľúčom je číslo d. Množinaotvorených aj šifrových textov je množina {0, 1, 2, . . . , n− 1}.

Poznámka 11 Tu si treba uvedomiť dve veci. Po prvé, ak počas výpočtu získame ako otvorenýalebo šifrový text číslo väčšie ako n−1, zredukujeme ho modulo n. Po druhé, netreba sa obávať,že môžeme šifrovať iba čísla; každý text sa totižto v počítači zapisuje ako postupnosť jednotieka núl a túto postupnosť považujeme za binárne číslo.

RSA šifrovanie: Nech p je otvorený text (čiže nejaké prirodzené číslo z intervalu (1, n)).Šifrový text bude c = pe(mod n).

RSA dešifrovanie: Nech c je šifrový text. Otvorený text bude p = cd(mod n).

Príklad 5.3.2 Zvoľme dve prvočísla, povedzme p = 7 a q = 11. Potom n = 7 · 11 = 77 aφ(n) = (7−1)(11−1) = 60. Množina otvorených aj šifrových textov bude množina {0, 1, . . . , 59}.Ak zvolíme povedzme e = 13, výpočtom zistíme, že 13 · 37 = 481 ≡ 1(mod 60) a preto d = 37.Verejný kľúč je teda dvojica (13, 77) a súkromný kľúč je číslo 37. Majme teraz otvorený textp = 5. Šifrový text bude c = 513 ≡ (56)2·5 ≡ 712·5 ≡ 36·5 ≡ 26(mod 77). Ak chceme dešifrovať,vypočítame p = 2637 ≡ (264)9 ·26 ≡ 589 ·26 ≡ (582)4 ·1508 ≡ 534 ·45 ≡ (2809)2 ·45 ≡ 372 ·45 ≡60 · 45 ≡ 2700 ≡ 5(mod 77).

V predchádzajúcom príklade sme na vygenerovanie čísla n = 77 použili veľmi malé prvočísla.Zrejme aj človek s chabými znalosťami matematiky by rýchlo prišiel na to, že 77 = 7 · 11, pretoby mohol vypočítať φ(n) a teda odhaliť náš súkromný kľúč. Avšak pre veľké n je vo všeobecnostiveľmi ťažké urobiť faktorizáciu (čiže nájsť prvočíselný rozklad) iba pri znalosti čísla n. Prehľad

Page 39: Časť I Algoritmy · Khwarizmi (Algorizm, 770 - 840), ktorý sa narodil na území dnešného Uzbekistanu. Zaoberal sa matematikou, astronómiou a geografiou. Aj ďaľší dôležitý

Kapitola 5: Šifrovanie 39

najpoužívanejších asymetrických algoritmov môžeme vidieť v nasledujúcej tabuľke.

Názov algoritmu Popis algoritmuD-H Diffie-Hellman, algoritmus pro výmenu kľúčov

resp. pre vytvorenie kľúča relácieDSA Digital Signature Algorithm,

algoritmus pre vytvorenie digitálneho podpisuECDSA (Elliptic Curve DSA) algoritmus pre digitálny podpis DSA,

realizuje sa na eliptických krivkáchElGamal El-Gamalov algoritmus,

algoritmy na vytvorenie digitálneho podpisu aj na šifrovanieRSA Rivest-Shamir-Adleman, algoritmus pre výmenu kľúčov,

digitálny podpis, šifrovanie dát

Hybridné šifrovanie

Výhody asymetrického šifrovania sú zjavné. Odpadá nutnosť výroby a distribúcie kľúčov. Akovšetko na svete, aj šifrovanie s verejným kľúčom má svoje nevýhody. Jedna z najväčších nevýhodje rýchlosť šifrovania - oproti symetrickým systémom sú pomalšie aj o niekoľko rádov. Výhodysymetrického a asymetrického šifrovania spája v sebe hybridné šifrovanie.

V hybridnom šifrovaní sa zvolí nejaký symetrický systém (napr. IDEA) a asymetrický systéms verejným a súkromným kľúčom (napríklad RSA). Najskôr sa vygeneruje náhodný kľúč nazašifrovanie dát. Tieto sa zašifrujú pomocou symetrického systému s použitím vygenerovanéhokľúča. Následne sa kľúč pre symetrickú šifru zašifruje pomocou verejného kľúča asymetrickéhosystému a pripojí sa k už zašifrovanej správe. Po prijatí šifrového textu držiteľ súkromnéhokľúča asymetrického systému odšifruje zašifrovaný kľúč pre symetrickú šifru a následne odšifru-je symetrickým systémom zašifrovaný text. Celý proces môžeme vidieť na nasledujúcej schéme.

Kryptografické hašovacie funkcie a digitálne podpisy

Nie každý sa už stretol so šifrovaním v jeho priamej podobe; to znamená, že by používal doku-menty s vysokým stupňom utajenia. Každý sa však už určite stretol s podpísaným listom,správou, dotazníkom ap. Pretože v digitálnom svete sa nedá podpisovať tak ako sme zvyknutí(použitie vlastnoručného podpisu) treba postupovať inak. Jeden z možných spôsobov je taký, žedanú správu zašifrujeme pomocou svojho súkromného kľúča a pošleme príjemcovi otvorený ajšifrový text. Šifrový text tu slúži ako podpis. Príjemca potom jednoducho použije náš verejnýkľúč, čím jednak šifrový text odšifruje (a porovnaním zistí či otvorený text nebol zmenený), ajednak zistí, že sme ho zašifrovali my (iba my sme totiž držitelia súkromného kľúča).

Predchádzajúca schéma však má niekoľko nedostatkov. Jedným z nich je (ako sme už spomí-nali) malá rýchlosť asymetrických algoritmov. Druhý nedostatok tkvie v množstve prenášanýchdát. Ak napríklad niekomu posielame súbor o veľkosti 1MB a k tomu pridáme rovnako veľkýzašifrovaný súbor, množstvo dát sa zrazu zdojnásobí.

Preto sa pri elektronickom podpisobaní nešifruje súkromným kľúčom celý šifrový text ale ibajeho odtlačok (message digest). Digitálny odtlačok správy sa realizuje pomocou hašovacíchkryptografických funkcií ako sú napríklad MD4 (Message Digest), MD5, SHA-1 (Secure HashAlgorithm) a podobne. Tieto funkcie majú nasledovné vlastnosti.

1. Pre každý text t dáva hašovacia funkcia H výstup s rovnakým počtom bitov. NapríkladMD4 a MD5 dávajú výstup dĺžky 128 bitov a SHA-1 dáva 160 bitové výstupné slovo.

2. Hašovacia funkcia musí byť jednosmerná. To znamená a) ak je daný odtlačok u, nedása nájsť text t tak, aby H(t) = u a b) ak je daný text t, nedá sa nájsť text t′ tak, abyH(t) = H(t′). Tu pod slovným spojením ”nedá sa” sa rozumie ”takmer nemožné”.

3. Hašovacia funkcia musí byť bezkolízna. To znamená, že musí byť veľmi ťažké nájsť dvavstupné texty t a t′ tak, aby H(t) = H(t′).

Digitálny podpis - podpisovanie: Alica má text t, hašovaciu funkciuH a asymetrickýkryptografický sytém s verejnou funkciou E a súkromnou funkciou D. Alica vypočíta odtlačoksprávy o = H(t), zašifruje odtlačok m = D(o) súkromným kľúčom a zašle Bobovi text t adigitálny podpis m.

Page 40: Časť I Algoritmy · Khwarizmi (Algorizm, 770 - 840), ktorý sa narodil na území dnešného Uzbekistanu. Zaoberal sa matematikou, astronómiou a geografiou. Aj ďaľší dôležitý

Kapitola 5: Šifrovanie 40

Digitálny podpis - overovanie: Bob má text t, a digitálny podpis m správy t. Bobvypočíta odtlačok správy o = H(t) a tiež odšifruje digitálny podpis použitím verejného kľúčaAlice o′ = E(m). Následne porovná o a o′. Ak sú rovnaké, vie že správu podpísala Alica anavyše, že správa t nebola cestou zmenená. Ak o′ 6= o, buď správu nepodpísala Alica, alebo jupodpísala, ale niekto cestou zmenil text t.

Cvičenia k časti 5

Cvičenie 5.3.1 Diffie-Hellmanov protokol výmeny kľúčov. Majme prvočíslo p = 11 a primi-tívny koreň q = 7 prvočísla p. Zistite aký tajný kľúč si vymenia Alica a Bob, ak Alica má tajnéčíslo x = 5 a Bob má tajné číslo y = 7. (Tajný kľúč vypočítajte pre Alicu aj Boba.)

Cvičenie 5.3.2 Diffie-Hellmanov protokol výmeny kľúčov. Majme prvočíslo p = 13 a primi-tívny koreň q = 7 prvočísla p. Zistite aký tajný kľúč si vymenia Alica a Bob, ak Alica má tajnéčíslo x = 2 a Bob má tajné číslo y = 4. (Tajný kľúč vypočítajte pre Alicu aj Boba.)

Cvičenie 5.3.3 RSA algoritmus. Nech p = 5 a q = 11 sú dve rôzne prvočísla. Vypočítajte n,ψ(n) a súkromný kľúč d, ak verejná časť kľúča je e = 3. Zašifrujte správu s = 10 súkromnýmkľúčom d a výsledný šifrový text c potom odšifrujte (kvôli kontrole) verejným kľúčom e.

Cvičenie 5.3.4 RSA algoritmus. Nech p = 5 a q = 7 sú dve rôzne prvočísla. Vypočítajte n,ψ(n) a súkromný kľúč d, ak verejná časť kľúča je e = 11. Zašifrujte správu s = 5 súkromnýmkľúčom d a výsledný šifrový text c potom odšifrujte (kvôli kontrole) verejným kľúčom e.

Cvičenie 5.3.5 a) Diffie-Hellmanov protokol výmeny kľúčov. Majme prvočíslo p = 11 a pri-mitívny koreň q = 7 prvočísla p. Zistite aký tajný kľúč k1 si vymenia Alica a Bob, ak Alica mátajné číslo x = 6 a Bob má tajné číslo y = 8.

b) RSA algoritmus. Nech p = 5 a q = 11 sú dve rôzne prvočísla. Vypočítajte n, ψ(n) asúkromný kľúč d, ak verejná časť kľúča je e = 7. Zašifrujte správu s = 5 súkromným kľúčom dčím získate šifrovú správu c = k2.

c) Majme šifrový text ”DMtXNGRtIGXAIHX” zašifrovaný symetrickým kľúčom |k1|k2| (vylepšenáCaesarova šifra). Odšifrujte tento text pomocou kľúčov k1 a k2 nájdených v a) a b). Tabuľkana prevod znakov je v príklade 5.2.1.

Page 41: Časť I Algoritmy · Khwarizmi (Algorizm, 770 - 840), ktorý sa narodil na území dnešného Uzbekistanu. Zaoberal sa matematikou, astronómiou a geografiou. Aj ďaľší dôležitý

Kapitola 5: Šifrovanie 41

Referencie

[1] G. M. Adelson-Velskij, M. E. Landis, Odin algoritm organizacii informacii, DokladyAkademii Nauk SSSR, 146 (1962), 263-266 (in Russian).

[2] J. A. Bondy, V. Chvátal, A method in graph theory, Discrete. Math., 15, (1976), 111-136.

[3] R. Berger, The undecidability of the domino problem, Memoirs Amer. Math. Soc., Provi-dence, RI (1966).

[4] V. K. Bulitko, O grafach s zadannymi okruženijami veršin, Trudy matem. inst. im. V. A.Steklova, 133, (1973), 78-94.

[5] G. Chartrand, O. R. Ollerman, Applied and Algorithmic Graph Theory, McGraw-Hill, Inc.,(1993), 238-239.

[6] N. Christofides, Graph Theory, An algoritmic approach, London, Academic press., (1978).

[7] A. Church, An unsolvable problem of elementary number theory, American J. Math., 58,(1936), 345-363.

[8] S. A. Cook, The complexity of theorem-proving procedures, Proc. Third Annual ACMSymp. on Theory of Computing, (1971), 151-158.

[9] W. E. Dijkstra, A note on two problems in connection with graphs, Numerische Math., 1,(1959), 269-271.

[10] G. A. Dirac, Some theorems on abstract graphs, Proc. London Math. Soc., 2, (1952), 69-81.

[11] J Edmonds, R. M. Karp, Theoretical improvements in algorithmic efficiency for networkflow problem, J. ACM , 19, (1972), 248-264.

[12] L. R. Ford, Jr. and D. R. Fulkerson, A simple algorithm for finding maximal network flowsand an application to the Hitchcock problem, Canad. J. Math., 9, (1957), 210-218.

[13] M. R. Garey, D. S. Johnson, Computers and Intractibility: A Guide to the Theory ofNP-Completeness, Freeman, New York (1979).

[14] C. Kim, A minimal spanning tree and approximate tours for a traveling salesman, Comp.Sci. Tech. Report, University of Maryland (1975).

[15] D. E. Knuth, The art of computer programming, 3: Sorting and searching, Reading, Mass.,Addison-Wesley (1973).

[16] J. B. Matisajevič, Diofantovosť prečislimych množestv, Dokl. Akad. Nauk. SSSR,191,(1970), 279-282.

[17] E. F. Moore, The sortest path trough a maze, Proc. Internat. Symp. Switching Theory,Harvard Univ. Press, Cambridge, (1959), 285-292.

[18] O. Ore, Note on Hamilton circuits, Amer. Math. Monthly, 67, (1960), 55.

[19] J. Plesník, Grafové algoritmy, VEDA, Bratislava (1983).

[20] V. Strassen, Gaussian elimination is not optimal, Numer. Math., 13, (1969), 354-356.

[21] A. M. Turing, On computable numbers, with an application to the Entscheidungs problem,Proc. London Math. Soc. (ser. 2), 42, (1936), 230-265.

[22] H. S. Wilf, Algorithms and Complexity, Prentice-Hall, Englewood Cliffs NJ (1986).

[23] S. Winograd, A new algorithm for inner product, IEEE Trans. on Comp., 7, (1968), 693-694.

Obsah

I Algoritmy 1

Page 42: Časť I Algoritmy · Khwarizmi (Algorizm, 770 - 840), ktorý sa narodil na území dnešného Uzbekistanu. Zaoberal sa matematikou, astronómiou a geografiou. Aj ďaľší dôležitý

Kapitola 5: Šifrovanie 42

1 Základné pojmy a definície 11.1 Úvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.2 Neformálna definícia algoritmu . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.3 Formálna definícia algoritmu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

2 Zložitosť algoritmov 22.1 Rozhodnuteľnosť . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22.2 Asympotická zložitosť . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32.3 NP a NP-úplné problémy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

3 Grafové algoritmy 53.1 Hamiltonovské grafy a úloha obchodného cestujúceho . . . . . . . . . . . . . . . 53.2 Vzdialenosti v grafoch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83.3 Toky v sieťach, veta o maximálnom toku a minimálnom reze a Ford-Fulkersonov

algoritmus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113.4 Stromy a ich aplikácie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

II Kódy 18

4 Kódovanie 194.1 Úvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194.2 Základné pojmy a definície . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194.3 Blokové kódovanie, prefixové kódovanie a Kraftova nerovnosť . . . . . . . . . . . 214.4 Najkratší kód, Huffmanova konštrukcia najkratšieho kódu . . . . . . . . . . . . . 234.5 Kompresia dát . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264.6 Bezpečnostné kódy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

5 Šifrovanie 335.1 Úvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335.2 Symetrické šifrovanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335.3 Asymetrické šifrovanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36