Databáze, sítě a techniky programování X33DSP

Podobné dokumenty
2 Datové struktury. Pole Seznam Zásobník Fronty FIFO Haldy a prioritní fronty Stromy Hash tabulky Slovníky

Databáze, sítě a techniky programování X33DSP

3 Algoritmy řazení. prvku a 1 je rovněž seřazená.

10. Složitost a výkon

Datové struktury 2: Rozptylovací tabulky

Náplň. v Jednoduché příklady na práci s poli v C - Vlastnosti třídění - Způsoby (algoritmy) třídění

Stromy, haldy, prioritní fronty

Metodický koncept k efektivní podpoře klíčových odborných kompetencí s využitím cizího jazyka ATCZ62 - CLIL jako výuková strategie na vysoké škole

Základní datové struktury III: Stromy, haldy

Dynamické datové struktury IV.

Stromy. Jan Hnilica Počítačové modelování 14

Dynamické datové struktury III.

Algoritmizace řazení Bubble Sort

TGH07 - Chytré stromové datové struktury

Stromy. Strom: souvislý graf bez kružnic využití: počítačová grafika seznam objektů efektivní vyhledávání výpočetní stromy rozhodovací stromy

TGH07 - Chytré stromové datové struktury

DobSort. Úvod do programování. DobSort Implementace 1/3. DobSort Implementace 2/3. DobSort - Příklad. DobSort Implementace 3/3

Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz

Algoritmizace prostorových úloh

Michal Krátký. Úvod do programování. Cíl kurzu. Podmínky získání zápočtu III/III

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

Algoritmizace prostorových úloh

součet cvičení celkem. známka. Úloha č.: max. bodů: skut. bodů:

Prioritní fronta, halda

IB111 Úvod do programování skrze Python

Programování 3. hodina. RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015

Základní datové struktury

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

Lineární datové struktury

Základy algoritmizace. Pattern matching

Algoritmy II. Otázky k průběžnému testu znalostí

Algoritmizace prostorových úloh

ALGORITMY A DATOVÉ STRUKTURY

Adresní vyhledávání (přímý přístup, zřetězené a otevřené rozptylování, rozptylovací funkce)

bfs, dfs, fronta, zásobník, prioritní fronta, halda

1. Převeďte dané číslo do dvojkové, osmičkové a šestnáctkové soustavy: a) b)

Test prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem

Amortizovaná složitost. Prioritní fronty, haldy (binární, d- regulární, binomiální, Fibonacciho), operace nad nimi a jejich složitost

Dynamické datové struktury I.

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

Rekurzivní algoritmy

vyhledávací stromové struktury

Algoritmy I, složitost

AVL stromy. pro každý uzel u stromu platí, že rozdíl mezi výškou jeho levého a pravého podstromu je nejvýše 1 stromy jsou samovyvažující

TÉMATICKÝ OKRUH TZD, DIS a TIS

TGH05 - Problém za milion dolarů.

Základní informace o předmětu Otázka:

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Základy algoritmizace. Hašování

přirozený algoritmus seřadí prvky 1,3,2,8,9,7 a prvky 4,5,6 nechává Metody řazení se dělí:

bfs, dfs, fronta, zásobník, prioritní fronta, halda

Dynamické programování

Časová a prostorová složitost algoritmů

Algoritmy a datové struktury

Pole a kolekce. v C#, Javě a C++

Vyvažování a rotace v BVS, všude se předpokládá AVL strom

Prohledávání do šířky = algoritmus vlny

Maturitní téma: Programovací jazyk JAVA

B3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11

Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský1/39

Třídění a vyhledávání Searching and sorting

Cílem kapitoly je seznámit studenta se seznamem a stromem. Jejich konstrukci, užití a základní vlastnosti.

Základy algoritmizace a programování

Algoritmizace Dynamické programování. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

NPRG030 Programování I, 2018/19 1 / :03:07

Binární vyhledávací stromy pokročilé partie

Vyhledávání v textu. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava

V případě jazyka Java bychom abstraktní datový typ Time reprezentující čas mohli definovat pomocí třídy takto:

B3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11

Algoritmizace prostorových úloh

Volné stromy. Úvod do programování. Kořenové stromy a seřazené stromy. Volné stromy

5. Vyhledávání a řazení 1

Stromy. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol.

A4B33ALG 2010/05 ALG 07. Selection sort (Select sort) Insertion sort (Insert sort) Bubble sort deprecated. Quicksort.

Datové typy a struktury

Zdůvodněte, proč funkce n lg(n) roste alespoň stejně rychle nebo rychleji než než funkce lg(n!). Symbolem lg značíme logaritmus o základu 2.

Binární soubory (datové, typované)

Standardní algoritmy vyhledávací.

Zadání druhého zápočtového projektu Základy algoritmizace, 2005

Da D to t v o é v ty t py IB111: Datové typy

Obsah přednášky. Analýza algoritmu Algoritmická složitost Návrhy algoritmů Urychlování algoritmů 1/41

Základy řazení. Karel Richta a kol.

ALG 09. Radix sort (přihrádkové řazení) Counting sort. Přehled asymptotických rychlostí jednotlivých řazení. Ilustrační experiment řazení

Algoritmizace. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

Řazení. Uspořádat množinu prvků obsahujících klíč podle definovaného kriteria.

Rekurze a rychlé třídění

Komprese dat. Jan Outrata KATEDRA INFORMATIKY UNIVERZITA PALACKÉHO V OLOMOUCI. přednášky

Programování v C++, 2. cvičení

Komprese dat (Komprimace dat)

Šablony, kontejnery a iterátory

Fronta (Queue) Úvod do programování. Fronta implementace. Fronta implementace pomocí pole 1/4. Fronta implementace pomocí pole 3/4

IB111 Úvod do programování skrze Python

NP-ÚPLNÉ PROBLÉMY. Doc. RNDr. Josef Kolář, CSc. Katedra teoretické informatiky, FIT České vysoké učení technické v Praze

NEJKRATŠÍ CESTY I. Doc. RNDr. Josef Kolář, CSc. Katedra teoretické informatiky, FIT České vysoké učení technické v Praze

Vyhledávání řetězců. a b a c a a b. a b a c a b. a b a c a b

Maturitní otázky z předmětu PROGRAMOVÁNÍ

autoři: Rudolf Bayer, Ed McCreight všechny vnější uzly (listy) mají stejnou hloubku ADS (abstraktní datové struktury)

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

IAJCE Přednáška č. 9. int[] pole = new int[pocet] int max = pole[0]; int id; for(int i =1; i< pole.length; i++) { // nikoli 0 if (Pole[i] > max) {

Algoritmy výpočetní geometrie

Transkript:

Databáze, sítě a techniky programování X33DSP Anotace: Náplní předmětu jsou některé techniky a metody používané ve výpočetních systémech zaměřených na biomedicínské inženýrství. Cílem je položit jednotný základ informačních technologií pro všechny studenty magisterského programu BMI a vybavit absolventy základními znalostmi v oblasti systematického přístupu k programování, správě operačních systémů a sítí i k tvorbě elementárních databázových aplikací. Předn ednáš ášej ející: Ing. Tomáš Vlček, CSc. Doc. Ing. Zdeněk Kouba, CSc. Cvičící: Mgr. Ing. David Šteiner Ing. Miloslav Radakovič Ing. Lenka Novákov ková,, PhD. 1

Osnova přednášek 1. Základy teorie složitosti, polynomiální a nepolynomiální problémy, neřešitelné úlohy (21.9.) 2. Státní svátek (28.9.) 3. Datové struktury, jejich implementace, rekurze (5.10.) 4. Algoritmy řazení a vyhledávání, komprimační algoritmy (12.10). 5. Grafové algoritmy (19.10.) 6. Databáze - datový model, relační model (26.10.) 7. Normální formy, dotazovací jazyk SQL (2.11.) 8. Dotazovací jazyk SQL (9.11.) 9. Transakce, distrib. databáze, replikace, synchronizace (16.11.) 10. Poč. sítě a jejich struktury, adresování, směrování v sítích (23.11.) 11. IP protokoly, porty, služby. Základy bezpečnosti v sítích. (30.11.) 12. Operační systémy I (7.12.) 13. Operační systémy II (14.12.) 14. Datové sklady, správa dokumentů, verzování (21.12.) 2

Podmínky udělení zápočtu a složení zkoušky Podmínky udělení zápočtu Max. 2 absence Maximální počet bodů ze cvičení je 25 (celkem 5 úloh), pro získání zápočtu min. 13 Během testu, řešení semestrální úlohy a zkoušky bude kladen důraz na zásadu samostatné práce. Podmínky zkoušky Zkouška probíhá ústně Tři otázky (algoritmy/databáze/sítě-os) Na každou otázku písemná příprava Každá otázka ohodnocena max. 25 body Pokud je odpověď na libovolnou z těchto tří otázek hodnocena méně než 10 body, celková známka je nedostatečně Výsledná známka je dána součtem bodového hodnocení cvičení a odpovědí na otázky dle platné klasifikační stupnice. 3

Doporučená literatura Wróblewski, Piotr: Algoritmy. Datové struktury a programovací techniky. Computer Press 2004. ISBN: 80-251-0343-9 Knuth, D.E.: Umění programovat. 1.díl Základní algoritmy. Computer Press 2008. ISBN: 978-80-251-2025-5 Herout, Pavel: Učebnice Jazyka Java, Kopp, 2003. Tutoriál Java - http://java.sun.com/docs/books/tutorial/ Wirth, N.: Algorithm + Data Structures = Program. Prentice- Hall, New Jersey, 1975 Louden, Kenneth, C.: Programming Languages. Principles and Practice. PWS-Kent, Massachusetts, 1993 Pokorný J., Halaška I.: Databázové systémy. Praha, ČVUT, 1998 Další publikace o DBMS aktuálně doporučí přednášející 4

1 Složitost algoritmů Definice algoritmu Algoritmus můžeme definovat jako jednoznačně určenou posloupnost konečného počtu elementárních kroků vedoucí k řešení daného problému, přičemž musí být splněny základní vlastnosti každého algoritmu: Hromadnost a univerzálnost - algoritmus musí vést k řešení celé třídy úloh, vzájemně se lišících pouze vstupními údaji. Determinovanost (jednoznačnost) - v každém kroku algoritmu musí být jednoznačně určeno, co je výsledkem tohoto kroku a jak má algoritmus dále pokračovat. Pro stejná vstupní data vydá algoritmus vždy stejný výsledek. Konečnost - algoritmus v konečné době skončí. Rezultativnost - algoritmus při zadání vstupních dat vždy vrátí nějaký výsledek. Korektnost - výsledek vydaný algoritmem musí být správný. Opakovatelnost při použití stejných vstupních údajů musí algoritmus dospět vždy k témuž výsledku. 5

1 Složitost algoritmů Ověřování správnosti algoritmu Algoritmus můžeme považovat za korektní, pokud není opomenuta žádná z možností zpracování dat při průchodu algoritmem. Algoritmus je parciálně správný, právě když platí, že pokud skončí, vydá správný výsledek. Algoritmus je konečný, když pro všechna přípustná data algoritmus po konečném počtu kroků skončí. Věta o zastavení Halting Theorem. Úloha o zastavení není algoritmicky řešitelná - neexistuje algoritmus, který by pro libovolné slovo w a libovolný algoritmus A rozhodl, zda se A při vstupu w zastaví, nebo ne. Kvantitativní ukazatele kvality algoritmů operační složitost paměťová složitost (náročnost) 6

1 Složitost algoritmů Příklad 1 - Sekvenční hledání 1 boolean searchlinear(value[] array, Value val) { 2 boolean ret = false; 3 for (int i = 0; i < array.length; i++) { 4 if (val == array[i]) { 5 ret = true; 6 break; 7 } 8 } 9 return ret; 10 } Operační složitost v nejhorším případě cyklus proběhne n-krát. Paměťová náročnost proměnné. 7

1 Složitost algoritmů Příklad 2 binární hledání 1 boolean binsearch(value[] array, Value val) { 2 boolean ret = false; 3 int l = 0; int r = array.length; int i; 4 while (!ret && r >= l) { 5 i = (l + r) / 2; 6 if (val == array[i]) { 7 ret = true; 8 } else { 9 if (val > array[i]) { 10 l = i + 1; 11 } else { 12 r = i - 1; 13 } 14 } 15 } 16 return ret; 17 } 8

1 Složitost algoritmů Příklad 2 binární hledání 1 boolean binsearch(value[] array, Value val) { 2 boolean ret = false; 3 int l = 0; int r = array.length; int i; 4 while (!ret && r >= l) { 5 i = (l + r) / 2; 6 if (val == array[i]) { 7 ret = true; 8 } else { 9 if (val > array[i]) { 10 l = i + 1; 11 } else { 12 r = i - 1; 13 } 14 } 15 } 16 return ret; 17 } Operační složitost v nejhorším případě cyklus proběhne log 2 (n) krát. Paměťová náročnost proměnné l, i a r. 9

1 Složitost algoritmů Fibonacciho posloupnost n 0 1 2 3 4 5 6 7 8 9 10 11 f(n) 1 1 2 3 5 8 13 21 34 55 89 144 Příklad 3 Rekurzivní výpočet Fibonacciho čísla 1 private int fib(int n) { 2 return (n == 0)?0 : ((n == 1)?1 : fib(n-1) + fib(n-2)); 3 } 10

1 Složitost algoritmů Fibonacciho posloupnost n 0 1 2 3 4 5 6 7 8 9 10 11 f(n) 1 1 2 3 5 8 13 21 34 55 89 144 11

1 Složitost algoritmů Příklad 3 tisk posloupnosti S rekurzí: 1 public void printfib1(int n) { 2 for (int i = 1; i <= n; i++) { 3 System.out.println(i + " " + fib(i)); 4 } 5 } Neefektivní, viz strom volání fib() pro n=4 12

1 Složitost algoritmů Bez rekurze: 1 public void prinfib2(int n) { 2 int p0 = 1; int p1 = 1; int p; 3 for (int i = 1; i <= n; i++) { 4 System.out.println(i + " " + p0); 5 p = p1; p1 = p0 + p1; p0 = p; 6 } 7 } I 1 2 3 4 p0 1 1 2 3 5 p1 1 2 3 5 8 p 1 2 3 5 f(i) 1 1 2 3 5 13

1 Složitost algoritmů Složitost algoritmu Složitost závisí na velikosti vstupních dat, tj. můžeme popsat jako funkci T(n), kde číslo n udává velikost vstupních dat. Např. T(n) = an + b je zápis lineárníčasové složitosti. Multiplikativní konstanta a reprezentuje počet operací na jednotku vstupních dat, aditivní konstanta b udává nárůst složitosti nezávislý na velikosti vstupních dat. Pro odhad složitosti důležitý pouze typ funkční závislosti. Efektivní algoritmy - takové postupy, jejichž složitost je maximálně polynomiální (např. n 2 ), nikoliv exponenciální např. 2 n ). 14

1 Složitost algoritmů 15

1 Složitost algoritmů Čas potřebný ke zpracování dat velikosti n, jestliže výpočetní složitost je dána funkcí T(n) a provedení jedné operace trvá 1 µs T(n) 20 40 60 80 100 n 20 µs 40 µs 60 µs 80 µs 0,1 ms n log (n) 86 µs 0,2 ms 0,35 ms 0,5 ms 0,7 ms n 2 0,4 ms 1,6 ms 3,6 ms 6,4 ms 10 ms n 3 8 ms 64 ms 0,22 s 0,5 s 1 s n 4 0,16 s 2,56 s 13 s 41 s 100 s 2 n 1 s 11,7 dne 36600 let 3,6.10 9 let n! 77000 let 16

1 Složitost algoritmů Horní odhad složitosti algoritmu T worst (n) udává složitost algoritmu v nejhorším případě: Složitost algoritmu f(n) je asymptoticky menší nebo rovna g(n), tj. f(n) = O(g(n)), právě když existuje taková kladná konstanta c tak, že pro každou velikost dat n od určité hodnoty n 0 platí: 0 f(n) cg(n), neboli: Např.: 2n 2 + 3n + 4 = O(n 2 ), neboť pro n 0 = 1 a c = 10 platí 2n 2 + 3n + 4 <= 10*n 2. 17

1 Složitost algoritmů Dolní odhad složitosti T best (n) určuje minimální složitost daného algoritmu, která nastává jen pro určité případy vstupních dat: Složitost algoritmu f(n) je asymptoticky větší nebo rovna g(n), tj. f(n) = Ω(g(n)), právě když existuje taková kladná konstanta c tak, že pro každou velikost dat n od určité hodnoty n 0 platí: 0 cg(n) f(n), neboli: Např. zápis T best (n) = Ω (n 3 ) udává kubickou dolní složitost algoritmu. 18

1 Složitost algoritmů Složitost v průměrném případě (očekávaná složitost) T avrg (n) se počítá jako střední hodnota náhodné složitosti T(n) při nějakém rozložení vstupních dat. Někdy může být i řádově lepší než složitost v nejhorším případě. Algoritmus je optimální pro danou úlohu, jestliže neexistuje algoritmus, který by úlohu řešil v nejhorším případě s menším počtem základních operací. Asymptoticky stejná složitost složitosti f(n), g(n) jsou asymptoticky stejné, právě když existují takové kladné konstanty c 1,c 2 tak, že pro každou velikost dat n od určité hodnoty n 0 platí: 0 c 1 g(n) f(n) c 2 g(n), neboli: 19

1 Složitost algoritmů Optimalizační úloha slouží k popisu úkolu nalezení řešení, které je omezeno podmínkami a které zároveň nejlépe vyhovuje daným kritériím (účelové nebo kriteriální funkci) Rozhodovací úloha je úloha, jejímžřešením je odpověď ano nebo ne. Každá optimalizační úloha lze převést na rozhodovací úlohu. Příklad - problém obchodního cestujícího. 20

1 Složitost algoritmů Je dána množina měst {M 1,, M n } a pro každou dvojici měst M i, M j je dána jejich přímá vzdálenost d(m i, M j ). Uvažujme trasu, která je posloupnost měst M π(1), M π(2),, M π(n), kde π je permutace čísel 1,, n. Délka této trasy je n 1 i= 1 d( M π ( i), M π( i+ 1) ) + d( M π( n), M π(1) ) Optimalizační verze: Najděte trasu nejkratší délky. Rozhodovací verze: Je dáno navíc číslo K. Rozhodněte, zda existuje trasa délky K. Řešení NPC úloha, heuristické algoritmy 21

1 Složitost algoritmů Nedeterministický algoritmus má dvě fáze nedeterministická, kdy se náhodně vygenerujeřetězec symbolů s deterministická, kdy na vstupu úlohy je jak instance úlohy, takřetězec s. Po konečném počtu kroků je výstupem ano nebo ne. Řetězec s je vlastně navrženéřešení úlohy, které se v deterministickéčásti otestuje, zda platí. Pro obchodního cestujícího je to číslo K. Nedeterministický algoritmus je nedeterministický polynomiální (NP algoritmus), jestliže ověřující fáze je splnitelná v polynomiálním čase vzhledem k rozsahu vstupních dat. 22

1 Složitost algoritmů Třída P je třída všech rozhodovacích úloh U, pro něž existuje polynomiální algoritmus, řešící U. NP úloha je taková úloha, kdy platí : pro každou ano instanci lze v polynomiálnímčase ověřit správnost odpovědi ano. Pro ne instanci takový algoritmus neexistuje. Třída NP je třída všech rozhodovacích úloh U, pro něž existuje nedeterministický algoritmus, pracující v polynomiálnímčase. 23

1 Složitost algoritmů Obtížnost rozhodovacích úloh se dá srovnávat. Pojem U se redukuje na V zpřesňuje sdělení, že rozhodovací úloha U není těžší než rozhodovací úloha V. U se redukuje na V, jestliže existuje algoritmus A, který pro každou instanci I úlohy U zkonstruuje instanci A(I) úlohy V tak, že I je ano instance U iff A(I) je ano instance V. Je-li A polynomiální, jde o polynomiální redukci. Rozhodovací úloha U je NP úplná, jestliže je NP úloha a každá NP úloha se na U polynomiálně redukuje. Třídu NP úplných úloh označujeme jako NPC. (NP úplné úlohy jsou nejtěžší mezi NP úlohami) 24

2 Datové struktury Pole Seznam Zásobník Fronty FIFO Haldy a prioritní fronty Stromy Hash tabulky Slovníky 25

2 Datové struktury Pole Datová struktura kolekce elementů (hodnot či proměnných), identifikovaných jedním nebo více indexy, ze kterých je adresa každého elementu spočitatelná; počet indexů koresponduje s dimenzí pole (vektor, matice, tensor) předem stanovená velikost, prvky stejné velikosti přímý přístup na prvek pomocí indexu v konstatním čase vyhledání a zrušení prvku: O(n) - nutné projít (posunout) celé pole přidání/zrušení prvku na začátku a konci: O(1) nalezení nejmenšího a největšího prvku: O(n) Setříděné pole vyhledání prvku v O(log n) smazaní prvku v O(log n), pokud je implementováno jako označení prvku za neplatný (jinak v O(n) ) přidání prvku v O(n) nalezení nejmenšího v O(1) a největšího prvku v O(n) 26

2 Datové struktury Spojový seznam lineární spojový seznam - dynamická datová struktura, obsahující 1+ datových položek stejného typu, které jsou navzájem lineárně provázany vzájemnýmí odkazy pomocí ukazatelů nebo referencí. Aby byl seznam lineární, nesmí existovat cykly ve vzájemných odkazech. jednosměrný seznam - každá položka odkazuje na položku následující, v obousměrném seznamu odkazuje položka na následující i předcházející položky; konec (tail) a začátek (head) seznamu označují zarážky kruhový (cyklický) seznam obsahuje cyklus, vytvořený navázáním konce a začátku seznamu Sekvenční přístup k prvkům vyhledání prvku: O(n) přidání/zrušení prvku: O(1) 27

2 Datové struktury Zásobník Abstraktní datový typ, charakterizován způsobem manipulace s daty LIFO (Last In, First Out) pro manipulaci se udržuje tzv. ukazatel zásobníku, který udává tzv. vrchol zásobníku (poslední přidaná položka), a (minimálně) dvě operace push a pop Typickáčasová složitost O(1) operací se snadno realizuje pomocí pole nebo lineárního (jednosměrného) spojového seznamu Typické užití zásobníku pro ukládání info a dat při volání zanořených procedur (bezpečnostní problém s buffer overflow) 28

2 Datové struktury Fronty FIFO abstraktní datový typ, charakterizován způsobem manipulace s daty- FIFO (First In, First Out). Typickáčasová složitost O(1) operací, realizuje se obvykle pomocí spojového seznamu Obvyklé operace: bool empty() příznak prázdná/neprázdná fronta T& front() vrací referenci na položku v čele neprázdné fronty void dequeue() odebere položku v čele neprázdné fronty void enqueue(const T& foo) zařadí argument foo na konec fronty int size() vrací počet položek ve frontě 29

2 Datové struktury Halda stromová datová struktura splňující vlastnost haldy: pokud je B potomek A, pak klíč(a) klíč(b). min-heap - v kořenu stromu je prvek s nejmenším klíčem, naopak max-heap. 30

2 Datové struktury Halda min-heap - v kořenu stromu je prvek s nejmenším klíčem, naopak max-heap. stromová datová struktura splňující vlastnost haldy: pokud je B potomek A, pak klíč(a) klíč(b). Obvyklé operace: delete-max / delete-min: odstranění kořene z max-/min-heapu increase-key, decrease-key: aktualizace klíče v max-/min-heapu insert: vložení nového klíče merge: spojení dvou heapů do jednoho nového implementace v poli: k i < k 2i+1, k i < k 2i+2 31

2 Datové struktury Prioritní fronty abstraktní datový typ, charakterizován způsobem manipulace s daty: InsertWithPriority vlož prvek s asociovanou prioritou GetNext: vyber prvek s nejvyšší prioritou PeekAtNext: ukaž prvek s nejvyšší prioritou, aniž by byl z fronty odstraněn Implementace pomocí lineární struktury (pole, spojový seznam) výběr z čela fronty O(1), vložení se zařazením O(n) Implementace pomocí binárního stromu(haldy) maxheap, výběr O(log n), vložení O(log n) 32

2 Datové struktury Stromy zákl.pojmy - kořen stromu, (vnitřní) uzly či vrcholy, listy, předek (předchůdce) a následovník, rodič a potomek, podstrom stupeň (arita) uzlu = počet přímých následovníků vnitřního uzlu stupeň stromu = maximální stupeň mezi všemi uzly stromu cesta ve stromu: délka cesty = počet hran od kořene k danému uzlu (=hloubka uzlu) délka vnitřní cesty = součet délek cest jednotlivých uzlů průměrná délka vnitřní cesty: 1 P = n. i kde n i je počet vrcholů na i-té úrovni hloubka uzlu - délka cesty od kořene k uzlu hloubka stromu / výška stromu - rovna hodnotě maximální hloubky uzlu (pro binární strom: n=2 h+1 1, tedy hloubka h=floor(log 2 n) ) I n i i 33

2 Datové struktury Procházení stromem do šířky procházení po hladinách (vrstvách úrovní) - prohledávání do šířky. do hloubky procházení od kořene stromu na potomky daného vrcholu po jednotlivých větvích - prohledávání do hloubky. Uspořádání metody procházení: Přímé (pre-order) uspořádání - R, A, B Vnitřní (in-order) uspořádání - A, R, B A Inverzní (post-order) uspořádání - A, B, R Dokonale vyvážený strom pro každý vrchol platí, že počet vrcholů v levém podstromu a pravém podstromu se liší nanejvýše o jedna. Vyhledávací - všechny klíče v levém podstromu jsou menší než a všechny klíče v pravém podstromu jsou větší než klíč v daném vrcholu. R B 34

2 Datové struktury Binární strom Orientovaný graf s jedním kořenem, z něhož existuje cesta do všech vrcholů grafu; každý vrchol má max. dva následovníky a s výjimkou kořene právě jednoho předka. Kořen předka nemá. Reprezentace - pomocí dynamické struktury (hrany reprezentovány ukazateli), pomocí pole (viz halda). B-strom vícecestný m-ární strom, se stránkovou organizací; každá stránka (až na jednu) musí obsahovat n až 2n uzlů, kde n je zvolená konstanta (= řád B-stromu) B-strom je díky této vlastnosti vyvážený, operace přidání, vyjmutí i vyhledávání tedy probíhají v logaritmickém čase (výška B-stromu min. log m n, max log m/2 n). Typické užití modifikace (B+) používají souborové systémy (NTFS, ReiserFS, XFS a JFS2) a relační databáze ukládání indexů 35

2 Datové struktury seznam binární strom (min-) heap insert O(1) O(log n) O(log n) findmin O(n) O(1) O(1) deletemin O(n) O(log n) O(log n) decreasekey O(1) O(log n) O(log n) delete O(n) O(log n) O(log n) merge O(1) O(m log(n+m)) O(m log(n+m)) 36

2 Datové struktury Skip List Přeskakovací seznam - N-vrstvá struktura, popsána 1990 (William Pugh) jako jednodušší/rychlejší alternativa k vyváženým stromům Randomizovaná varianta setříděného spojového seznamu s dodatečnými paralelními vrstvami. Paralelní seznamy přeskakují více položek. Vyhledávání začíná na nejvyšší vrstvě a přechází do nižších vrstev pokud je aktuální položka větší/rovna vyhledávanému klíči. Je-li rovna, je nalezeno, je-li aktuální položka větší, procedura se opakuje po návratu o jeden krok a přechodu do nižší vrstvy.. Operace Insert, Search, Delete jsou prováděny v čase O(log n) za podmínky dostatečného počtu vrstev 37

2 Datové struktury Hash (rozptylovací) tabulky Datová struktura, která používá hashovací funkci H(key) pro efektivní mapování klíče k na celéčíslo z intervalu <0, N-1> a ukládá položky (klíč, data) na vypočtené pozice H(key) Při mapování hašovací funkcí může docházet ke kolizím řešenířetězené seznamy (rozptýlené tabulky), řetězené seznamy s oblastí přetečení, otevřená adresace (sekundární hashovací fce lineární/kvadratické pokusy, double hash fce) Perfektní hashování: ke kolizím nedochází Vlastnosti: nejhorší případ - všechny klíče kolidují složitost O(n) Při faktoru naplnění A = n/n (počet položek/velikost tab.) 0,7 je očekávaná složitost O(1) Příklad H(key) = Ordinal(key) mod N 38

2 Datové struktury Řešení kolizí 1. řetězené seznamy tzv. rozptýlené tabulky. 2. oblast přetečení řetězený seznam je vytvářen v oblasti přetečení 3. sekundární hashovací funkce - umístění vkládaného prvku na jinou volnou pozici, kterou určíme sekundární hašovací funkcí. metoda lineárních pokusů - sekvenčně prohledává tabulku, G(i)=i ; tj. h 0 = H(k) h i = (h 0 + i) mod L, i = 1,, L-1 Prvky se shlukují kolem pozic primárních klíčů metoda kvadratických pokusů - rozptyluje prvky rovnoměrněji po celém poli, G(i)=ci 2, tj. h 0 = H(k) h i = (h 0 + ci 2 ) mod L, i > 0, c>0 metoda dvojího hashování h 0 = H(k) h i = (h 0 + j H (k)) mod L, i > 0, c>0 L... Neexistuje společný dělitel L a počet řádků (L je bezpečné), jinak se některé pozice obsazují a jiné vůbec 39

2 Datové struktury Slovníky Slovník je abstraktní datová struktura, skládající se z množiny unikátních klíčů a a množiny hodnot, kde každý klíč je asociován (mapován) s jednou hodnotou nebo s množinou hodnot. Základní operace: new, insert, find and delete. new() vrací slovník D find(k, D) vrací hodnotu asociovanou s klíčem k ve slovníku D insert(k, v, D) asociuje ve slovníku D klíč k s hodnotou v delete(k, D) ruší klíč k ve slovníku D Implementace binární vyhledávací stromy (AVL), skiplisty, hash tabulky aj. 40

2 Datové struktury Rekurze rekurzivní algoritmus volá sám sebe dokud není dosažena ukončovací podmínka Iterativní algoritmus používá opakující se konstrukce (cykly) Příklad Tree (length, angle) { Draw(length, angle); Tree(length/2, angle+delta); Tree(length/2, angle-delta); } Každý algoritmus využívající rekurzi lze přepsat do nerekurzivního tvaru (např. s použitím zásobníku) Rekurzivní datové struktury definice dynamických datových struktur (seznamy, stromy): struct node { int n; // some data struct node *ptr_next; // pointer to another struct node }; // LIST is simply a synonym for struct node * typedef struct node *LIST; 41

3 Algoritmy řazení Specifikace problému řazení (třídění): A... neprázdná množina prvků Posl(A)... množina všech posloupností prvků z A <a 1,...a n >... prvky množiny Posl(A) q... délka posloupnosti Posl(A), přičemž Delka(<>) = 0 a Delka(<a 1,..a n >) = n Klic(a i )... klíč prvku a i pro porovnávání prvků Posloupnost q je seřazená právě tehdy, když: 1. q < 2, nebo 2. q >=2 a současně platí: a)klic (a 1 ) <= Klic (a 2 ) a b)posloupnost <a 2,...>, která vznikne z posloupnosti q vypuštěním prvku a 1 je rovněž seřazená. 42

3 Algoritmy řazení Klasifikace metod řazení Dle způsobu uložení: vnitřnířazení (řazení v paměti) vnějšířazení (řazení souborů) Dle způsobu využití klíčů: adresnířazení (Klic(x) udává polohu x ve výstupu) asociativnířazení (Klic() využíván pro stanovení relativní polohy prvku ve výstupu, tj. je-li Klic(x) < Klic(y), pak ve výstupu x předchází y) Algoritmus se nazývá stabilní, pokud se relativní pořadí prvků se shodným klíčem v procesuřazení nemění. Algoritmus se nazývá přirozený, pokud algoritmus rychleji zpracuje seřazenou množinu než neseřazenou. 43

3 Algoritmy řazení Algoritmy vnitřního řazení základní metody Řazení výběrem nalezne vždy nejmenší z (zbývajících neseřazených) prvků a umístí na konec postupně budované posloupnosti. Řazení vkládáním v řazené posloupnosti prvků se postupně berou jednotlivé prvky a vkládají se na správné místo v budované seřazené posloupnosti. Řazení záměnou algoritmy vyberou dvojici prvků, které jsou ve špatném pořadí, a tyto prvky navzájem zamění. Řazení slučováním - vstupní posloupnost prvků rozdělí na části, které seřadí; seřazenéčásti se poté sloučí tak, aby výsledná posloupnost byla seřazená. Neexistuje ideální algoritmus pro všechna možná data, algoritmy mají různéčasové a paměťové složitosti, implementační úskalí aj. 44

3 Algoritmy řazení Vlastnosti běžných algoritmů vnitřního řazení * Název Časová složitost Minimum Průměrně Maximum Dodatečná paměť Stabilní Přirozená Metoda Bubble sort Bublinkovéřazení Heapsort Řazení haldou Insertion sort Řazení vkládáním Merge sort Řazení slučováním Quicksort Rychléřazení Selection sort Řazení výběrem Shell sort ** Shellovo řazení O(n) O(n²) O(n²) O(1) ano ano Záměna O(n log n) O(n log n) O(n log n) O(1) ne ne Výběr O(n) O(n²) O(n²) O(1) ano ano Vkládání O(n log n) O(n log n) O(n log n) O(n) ano ano Slučování O(n log n) O(n log n) O(n²) O(log n) ne ne Záměna O(n²) O(n²) O(n²) O(1) ano/ne ne Výběr O(n 3/2 ) O(n log² n) O(1) ne ano Vkládání * Zdroj www.wikipedia.org ** Složitost závisí na parametrech algoritmu (velikosti kroku), viz Robert Sedgewick: Analysis of Shellsort and Related Algorithms 45

3 Algoritmy řazení Insertion Sort for i ϵ < 2, n > vlož a i na patřičné místo mezi a 1,..., a i Autor Nuno Nogueira, wikipedia.org void insertionsort(int[] arr) { int i, j, newvalue; for (i = 2; i < arr.length; i++) { newvalue = arr[i]; j = i; while (j > 0 && arr[j - 1] > newvalue) { arr[j] = arr[j - 1]; j--; } arr[j] = newvalue; } } Časová složitost O(n 2 ), nejlepší O(n) Paměťová náročnost O(1) Stabilní algortimus 46

3 Algoritmy řazení 1 2 3 4 5 6 7 8 44 55 12 42 94 18 06 67 i=2 44 55 12 42 94 18 06 67 i=3 12 44 55 42 94 18 06 67 i=4 12 42 44 55 94 18 06 67 i=5 12 42 44 55 94 18 06 67 i=6 12 18 42 44 55 94 06 67 i=7 06 12 18 42 44 55 94 67 i=8 06 12 18 42 44 55 67 94 Animace: http://www.sorting-algorithms.com/insertion-sort 47

3 Algoritmy řazení Merge Sort 1. Je-li seznam délky 0 nebo 1, je seřazen. Jinak: 2. Rozděl seznam na dva cca poloviční velikosti. 3. Seřaď každý vzniklý seznam rekurzivně. 4. Spoj dva seznamy zpět do seřazeného seznamu. Merge sort je založen na myšlence: 1. Krátký seznam se řadí menším počtem kroků než delší seznam. 2. K vytvoření seřazeného seznamu je méně kroků potřeba při spojení dvou seřazených seznamů než neseřazených. Nevýhoda - potřeba dočasného pole velikosti N. Mergesort bývá pomalejší než Quicksort nebo Heapsort. Výhoda - stabilnířadicí algoritmus, dobře se paralelizuje. Implementován standardně v Perlu, v Javě, GNU C Library). Časová složitost O(n log n) Paměťová náročnost O(n) (dočasné pole) Animace: http://www.sorting-algorithms.com/merge-sort 48

3 Algoritmy řazení Quick Sort 1. V poli zvolíme libovolný prvek x; 2. Hledáme zleva, dokud se nenajde prvek a i > x; 3. Hledáme zprava, dokud se nenajde prvek a j < x. 4. Tyto dva prvky zaměníme 5. Pokračujeme, dokud se hledání zleva a zprava nesetkají u prvku x. 6. Výsledkem jsou dva úseky: v levém jsou všechny prvky < x a v pravém > x. 7. Rekurzivně seřadíme levý i pravý úsek. Problém - volba pivota, při volbě mediánu je algoritmus velmi rychlý, v opačném případě se časová složitost blíží O(n 2 ). Hledání mediánu běží v lineárním čase k počtu prvků, tím je výsledná složitost O(n log 2 n) v nejhorším případě. Není stabilní. Na náhodných datech je nejrychlejší Paměťová náročnost O(log n) dána rekurzivními voláními Animace: http://www.sorting-algorithms.com/quick-sort 1 2 3 4 5 6 7 8 44 55 12 42 94 18 06 67 06 55 12 42 94 18 44 67 06 18 12 42 94 55 44 67 49 Medián je hodnota, jež dělířadu podle velikosti seřazených výsledků na dvě stejně početné poloviny.

3 Algoritmy řazení Heap Sort Využití datové struktury halda (heap), s indexací od 1: Halda je posloupnost klíčů h l, h l+1,..., h n takových, že platí pro všechna i = l... n/2: h i < h 2i, h i < h 2i+1 [min-heap], resp. h i > h 2i, h i > h 2i+1 [max-heap] Přidávání do haldy: 1. Přidej prvek do spodní úrovně haldy na první místo zleva. 2. Porovnej přidaný prvek s rodičem. Jsou-li ve správném pořadí, konec. 3. Prohoď přidaný prvek s rodičem a jdi na předchozí bod. 11 11 15 5 8 5 15 5 11 3 4 15 3 4 8 3 4 8 Postup přidávání prvků pro max-heap 50

3 Algoritmy řazení Heap Sort Využití datové struktury halda (heap), s indexací od 1: Halda je posloupnost klíčů h l, h l+1,..., h n takových, že platí pro všechna i = l... n/2: h i < h 2i, h i < h 2i+1 [min-heap], resp. h i > h 2i, h i > h 2i+1 [max-heap] Odebírání kořenového prvku z haldy: 1. Nahraď kořen posledním prvkem poslední úrovně. 2. Porovnej nově umístěný prvek s potomky. Jsou-li ve správném pořadí, konec. 3. Prohoď nově umístěný prvek s potomkem a jdi na předchozí bod. 15 8 11 5 11 5 11 5 11 5 8 3 4 8 3 4 8 3 4 3 4 Postup odebírání kořene pro max-heap 51

3 Algoritmy řazení Heap Sort Využití datové struktury halda (heap), s indexací od 1: Halda je posloupnost klíčů h l, h l+1,..., h n takových, že platí pro všechna i = l... n/2: h i < h 2i, h i < h 2i+1 [min-heap], resp. h i > h 2i, h i > h 2i+1 [max-heap] Základní princip algoritmu heap sort: 1. Vybudujeme haldu postupným zařazováním prvků z nesetříděného pole s využitím algortimu vkládání prvku do haldy. 2. Postupně odebíráme kořenové prvky z haldy (s využitím algoritmu pro odebírání kořene) a vkládáme je do výsledného pole. 3. V případě max-heap je výsledné pole setříděno sestupně, v případě min-heap je setříděno vzestupně. 52

3 Algoritmy řazení Heap Sort Využití datové struktury halda (heap), s indexací od 1: Halda je posloupnost klíčů h l, h l+1,..., h n takových, že platí pro všechna i = l... n/2: h i < h 2i, h i < h 2i+1 [min-heap], resp. h i > h 2i, h i > h 2i+1 [max-heap] Je dáno pole h 1... h n, prvky h n/2+1... h n již tvoří haldu - tvoří listy příslušného binárního stromu a nevyžadují přeuspořádání. h2 Ke stávající haldě budeme přidávat další prvky "zleva" - haldu rozšíříme v každém kroku o 1 prvek doleva, až vytvoříme n-prvkovou haldu h8 h4 h9 h10 h5 h11 h1 h6 h12 h13 třídění na místě - zaměníme prvek z kořene haldy a poslední prvek haldy h n Přeuspořádáme haldu h 1... h n-1 Postup se opakuje pro stále se zmenšující haldu. Při každém kroku je na vrcholu haldy největší ze zbývajících prvků, a ten je výměnou s posledním prvkem této menší haldy zařazen na správné pořadí v poli. Časová složitost O(n log n), paměťová náročnost O(1), není stabilní h3 h14 h7 h15 53

3 Algoritmy řazení 1 2 3 4 5 6 7 8 94 18 06 67 I I 44 55 12 42 94 18 06 67 II 44 55 12 42 94 18 06 67 III 44 55 06 42 94 18 12 67 IV 44 42 06 55 94 18 12 67 V 06 42 12 55 94 18 44 67 42 67 55 67 42 94 94 18 06 06 18 12 06 II III 67 42 12 55 94 18 44 06 55 94 18 12 IV 12 42 67 55 94 18 44 06 67 12 42 18 55 94 67 44 06 06 12 42 18 55 94 67 44 06 44 42 18 55 94 67 12 06 55 42 94 12 18 44 V atd.... 67 54

3 Algoritmy řazení Řazení v souborech přímé a přirozené slučování (Merge Tape Sort) soubor se jako celek nevejde do operační paměti sekvenční struktury, je přístupný právě jeden element každého otevřeného souboru. operace přesouvání jsou časově náročné rozdělení 44 55 12 42 94 18 06 67 44 55 12 42 sloučení do usp. dvojic rozdělení 94 18 06 67 44 94 18 55 06 12 42 67 44 94 18 55 sloučení do usp. čtveřic rozdělení 06 12 42 67 06 12 44 94 18 42 55 67 06 12 44 94 06 12 18 42 44 55 67 94 sloučení do usp. osmic 18 42 55 67 Na přímé slučování nemá žádný vliv částečné setřídění vstupní posloupnosti a délka všech uspořádaných sloučených posloupností po k-tém kroku je 2 k Přirozené slučování slučuje vždy dvě nejdelší možné uspořádané posloupnosti max.běhy 55

3 Algoritmy řazení 2-fázové (tzv. třípáskové) třídění: a a a c c c b b b fáze rozdělovací fáze slučovací Tvorba setříděného souboru: kmenový soubor - setříděný rozsáhlý změnový soubor - malý, možno setřídit rychle, někdy i v poli v paměti Cílový setříděný soubor vznikne pouhým slučováním. krok Modifikace - 1-fázové (tzv. čtyřpáskové) třídění: a c a c c b d b - v rámci slučovacího procesu se uspořádané n-tice rovnou distribuují na dvě pásky 56

3 Algoritmy vyhledávání Dokonale vyvážený strom je strom, pro jehož každý vrchol platí, že počet vrcholů v levém podstromu a pravém podstromu se liší nanejvýše o jedna. 57 Tvorba dokonale vyváženého binárního stromu o n vrcholech: zvolíme jeden vrchol za kořen vytvoříme levý podstrom s počtem vrcholů n l = n div 2 vytvoříme pravý podstrom s počtem vrcholů n r = n - n l - 1 Pravidla aplikujeme rekurzivně Binární vyhledávací strom je uspořádaný binární strom, ve kterém jsou všechny klíče v levém podstromu menší než a všechny klíče v pravém podstromu jsou větší než klíč daného vrcholu. Přetvoření existujícího dokonale vyváženého stromu na vyhledávací je však velmi nákladné. Vyžaduje prakticky úplné přeuspořádání stromu. Podmínku na dokonalé vyvážení stromu lze oslabit, pak můžeme stromy budovat již přímo jako vyhledávací. To vede na úlohu vyhledávání spojeného s přidáváním, výsledný strom je však značně nevyvážený.

3 Algoritmy vyhledávání Rušení vrcholů ve stromu Inverzním problémem k přidávání je rušení vrcholů. Odstraňování prvku ze stromu je mnohem složitější než jeho přidání. V binárním stromu jsou možné čtyři případy: prvek s daným klíčem se ve stromu nenachází prvek je listem - zrušení je triviální prvek má jednoho následníka - prvek se nahradí svým následníkem prvek má dva následníky - prvek se nahradí buď nejpravějším prvkem levého podstromu nebo nejlevějším prvkem pravého podstromu. V levém podstromu jsou všechny uzly s klíčem menším a v pravém s klíčem větším než klíč rušeného prvku 58

3 Algoritmy vyhledávání AVL-vyvážené stromy Přidávání a rušení prvků stromu způsobuje nevyvážení, dokonalé vyvážení stromu je velmi obtížné. Proto se hledaly alternativní definice vyváženosti, které by poskytovaly dostatečně efektivní vyhedávací možnosti, a byly přitom zvládnutelné. Adelson-Velskii a Landis [1962] publikovali následující kriterium vyváženosti: Binární strom je AVL-vyvážený právě tehdy, když výšky obou podstromů každého uzlu se liší nejvýše o jedna, každý podstrom je AVL vyvážený. Autoři dokázali, že na vyvážených stromech mají operace vyhledání prvku podle klíče a přidáníči vyjmutí prvku s daným klíčem asymptotickou složitost O(log n), kde n je počet vrcholů ve stromu. 59

3 Algoritmy vyhledávání Pro reorganizaci zavádíme transformace (rotace), které modifikují strukturu stromu, avšak zachovávají lexikografické (in-order) uspořádání: 60

3 Algoritmy vyhledávání Přidání vrcholu se pak skládá ze tří kroků: Prohledání stromu za účelem zjištění, zda se takový vrchol již ve stromu nenachází. Přidání vrcholu a určení vyvažovacího faktoru. Kontrola vyvažovacího faktoru ve vrcholech ve směru opačném vůči vyhledávání (směrem ke kořenu) a případné vyvážení. Operace rušení vrcholu je variací na rušení v obyčejném binárním stromu, doplněné o vyvažování 61

3 62

3 Algoritmy vyhledávání B-stromy [BAYER 1970]: B-stromřádu n tedy splňuje následující kriteria: Každá stránka obsahuje nejvýše 2n položek (=klíčů). Každá stránka s výjimkou kořene stromu obsahuje aspoň n položek. Každá stránka je buď listem stromu (a pak nemá následníky) nebo má právě m+1 následníků, kde m je skutečný počet položek ve stránce. Všechny listové stránky jsou na jedné úrovni. V nejlepším případě je výška B-stromu log M n, v nejhorším případě log M/2 n, kde M je maximální počet potomků minimalizace přístupů (diskových operací) - rozsáhlé stromy, je možno rozdělit na stránky uložené na disku. Aplikace: indexace tabulek v DBMS (DB2, MS SQL, Oracle, MySQL,...), indexace metadat v souborových systémech (NTFS, IBM JFS,...) B+ stromy 63

3 Algoritmy vyhledávání 1. Vyhledání prvku s klíčem k. Načtení stránky do paměti. Vyhledání ve stránce (sekvenčně, binárním půlením). Pokud se klíč ve stránce nenachází a stránka není list, hledáme 64 ve stránce c 1, pokud key < k 1, ve stránce c m, pokud key > k (m 1), m je aktuální počet prvků ve stránce ve stránce c i, kde k i < k < k i + 1. 2. Přidání Najdeme místo i pro vložení nového prvku s klíčem k, tak aby k i 1 < k < k i+1. Pokud je ve stránce volné místo jednoduše vložíme nový prvek. Pokud je stránka plná, je nutné přeuspořádání: Rozdělíme stránku (2n + 1 prvků) na dvě podstránky stránky po n prvcích, prostřední prvek zůstává v rodičovské stránce. Pokud přeteče kořen stromu, výška stromu se zvětší.

3 Algoritmy vyhledávání Odebírání prvků z B-stromu Pokud se odebíraný prvek nenachází v listové stránce, musí se nahradit jedním ze dvou lexikograficky sousedících prvků v listové stránce. sestoupíme ve směru pravého ukazatele až do nejlevější listové stránky P, nahradíme odebíraný prvek nejlevějším prvkem stránky P a snížíme velikost obsazení P (v podstatě hledáme nejmenší větší klíč, resp. následovníka z uspořádané posloupnosti klíčů). Alternativně lze sestupovat ve směru levého ukazatele k nejpravějšímu prvku. Kontrola počtu prvků m ve stránce P: je-li m < n, je nutné provést reorganizaci - obsazení sousedních stránek P a Q se vyrovnává = vyvažování. V případě, že stránka Q již dosáhla své minimální velikosti n, pak celkový počet prvků na stránkách P a Q je 2n-1 a stránky můžeme sloučit: 65 do stránky P přesuneme "prostřední" prvek stránky předchůdců P a Q do stránky P přesuneme prvky ze stránky Q a stránku Q zrušíme. Postup může vyvolat další vyvažováníči slučování stránek na vyšší úrovni, v extrémním případě až po kořen B-stromu. Když se velikost kořenové stránky zmenší na nulu, je třeba ji odstranit (jediný způsob zmenšení výšky B-stromu).

3 Algoritmy vyhledávání B+ stromy Jsou modifikací B-stromů tak, že klíče jsou zopakovány v následnících a listové stránky jsou navzájem propojeny obousměrnými spojkami: B+ stromy se používají v moderních databázích jako forma indexních souborů. Při klasickém vyhledávání se postupuje prakticky stejně jako u obyčejných B-stromů. Ukazatele (diskové adresy dat) se nacházejí jen v listech. B+ stromy jsou velmi výhodné z hlediska vytváření uspořáda-ných pohledů na data. Stačí procházet listy stromu a tím získávat data setříděná podle konkrétního klíče. Z důvodů optimalizace přístupové doby korespondují stránky s diskovými bloky. Nevýhodou je opakování klíčů a složitější údržba stromů. 66

3 Komprimace dat Členění: bezeztrátová komprimace v procesu komprimace/dekomprimace jsou originální data přesně obnovena ztrátová komprimace v procesu komprimace/dekomprimace může dojít k odchylkám od originálních dat Claude E. Shannon: A Mathematical Theory of Communication (1948) formulace teorie komprimace dat, definoval fundamentální limit pro bezeztrátovou kompresi míru entropie H, která závisí na povaze informačního zdroje. Není možné bez ztráty informace komprimovat data v poměru vyšším než je míra entropie. Teorie datové komprese vymezuje základní hranice účinnosti všech komprimačních algoritmů. Pro daný zdroj se známou statistickou povahou a danou míru zkreslení D, je možné nalézt tzv. rate-distortion function R(D), udávající pro přípustnou míru zkreslení nejlepší dosažitelný kompresní poměr R(D). 67

3 Komprimace dat Zdroj má entropii H a dokonalý přenosový kanál kapacitu C; průměrná rychlost přenosu nemůže být větší než H/C. Důsledek nelze zkomprimovat informační zdroj pod velikost jeho entropie. Entropii H Shannon definoval pro stochastické procesy takto (počet bitů na znak): Důležité vlastnosti pro komprimaci: kde m je velikost vstupní abecedy a p i je pravděpodobnost výskytu znaku i 1. H = 0 pouze v případě, že existuje jediné i takové, že pi > 0 uniformní zpráva mající všechny znaky stejné, bude mít entropii jdoucí k nule (můžeme ji zakódovat do jediného znaku). 2. Pro daný počet jevů n je H maximální, jestliže všechny jevy mají stejnou pravděpodobnost p = 1/n. V takovém případě je H rovno log n. náhodně generovaná zpráva s rovnoměrným rozložením má entropii rovnou její velikosti v bitech děleno počtem symbolů (maximální entropie). 68

3 Komprimace dat Modely Informační zdroj X={X1,X2,...}, angl.text, velikost abecedy m=27 Zero-Order Model: znaky statisticky nezávislé, pravděpodobnost výskytu jednotlivých znaků je shodná. Potom H = log 2 m, tj. H = log 2 27 = 4.75 [bitů/znak] First-Order Model: znaky statisticky nezávislé, p i je pravděpodobnost výskytu i-tého znaku abecedy. Potom, tj. pro angl.text 4.07 bitů/znak. 69

3 Komprimace dat Second-Order Model: Nechť P j i je podmíněná pravděpodobnost, že aktuální symbol je j-tý znak abecedy, jestliže předchozí symbol je i-tý znak. Potom, tj. 3.36 bitů/znak pro angl.text Third-Order Model: Nechť P k j,i je podmíněná pravděpodobnost, že aktuální symbol je k-tý znak abecedy, jestliže předchozí symbol je j-tý znak abecedy, kterému předchází i-tý znak. Potom, tj. 2.77 bitů/znak pro angl.text Model lze zobecnit. Shannon odhadl, že entropie angl.textu je 2.3 bitů/znak. 70

Statistical Distributions of English Text (EXAMPLES) I. First-Order Statistics a b c d e f g h i j k ========= ========= ========= ========= ========= ========= ========= ========= ========= ========= ========= 0.0651738 0.0124248 0.0217339 0.0349835 0.1041442 0.0197881 0.0158610 0.0492888 0.0558094 0.0009033 0.0050529 II. Second-Order Statistics The second number in the first row is the conditional probability P(Xi=b Xi-1=a)=0.0228302 a b c d e f g h i j ========= ========= ========= ========= ========= ========= ========= ========= ========= ========= a 0.0002835 0.0228302 0.0369041 0.0426290 0.0012216 0.0075739 0.0171385 0.0014659 0.0372661 0.0002353 b 0.0580027 0.0058699 0.0000791 0.0022625 0.3416714 0.0002057 0.0004272 0.0003639 0.0479084 0.0076894 c 0.1229841 0.0000271 0.0215451 0.0005246 0.1715916 0.0000090 0.0000000 0.1701716 0.0565490 0.0000000 III. Third-Order Statistics The fourth number in the second row is the conditional probability P(Xi=d Xi-1=b,Xi-2=a)=0.0085877 a b c d e f g h i j ========= ========= ========= ========= ========= ========= ========= ========= ========= ========= a a 0.0000000 0.0000000 0.0106383 0.3297872 0.0000000 0.0106383 0.0000000 0.0000000 0.0000000 0.0000000 a b 0.0075307 0.0140045 0.0000000 0.0085877 0.0202140 0.0000000 0.0000000 0.0029066 0.1762452 0.0014533 a c 0.0066204 0.0000817 0.0963629 0.0006539 0.2368615 0.0000000 0.0000000 0.1985288 0.0402942 0.0000000 a d 0.0304960 0.0001415 0.0000708 0.0352367 0.1144131 0.0038916 0.0004245 0.0027595 0.0417463 0.0038916 a e 0.0345679 0.0000000 0.0024691 0.0098765 0.0074074 0.0000000 0.0222222 0.0000000 0.0000000 0.0000000 71

RLE (Run Length Encoding) Jednoduchý bezeztrátový komprimační algoritmus, kompresní poměr silně závislý na charakteru dat pokud neobsahovují delší sekvence stejných znaků, účinost komprese výrazně klesá. RLE nahrazuje sekvence stejných hodnot dvojicí (délka sekvence, hodnota). Předpokládejme např. řetězec dat (17 bytů): ABBBBBBBBBCDEEEEF Pomocí RLE komprese lze zkomprimovat např. takto: (10 bytů) : A *8B C D *4E F Opakující se znaky jsou nahrazeny řídícím znakem a dvojicí (délka,znak). Existující různé modifikace. Aplikace pro kompresi obrazových dat, který obsahuje větší plochy stejné barvy. V grafických formátech existují různé varianty RLE komprese, buď jako hlavní komprese dat (např. PCX) nebo jako pomocná metoda komprese dat (JPEG, TIFF). Typické užití pro TIFF CCITT fax formát. 72

3 Komprimace dat Huffmanovo kódování bezeztrátová komprese dat, konvertuje znaky vstupní abecedy do bitových řetězců frekventované znaky do bitových řetězců s kratší délkou Dvě fáze: 1. určení frekvence výskytu znaků, 2. vytvoření binárního stromu k následné komprimaci vstupních dat. Jsou-li znaky např. E,T,A,S,N,O, uspořádány v binárním stromu: Potom TEA 10 00 010 SEA 011 00 010 TEN 10 00 110 73

3 Komprimace dat Příklad konstrukce stromu: 74

3 Komprimace dat Příklad: komprimace DECAF D: 111 E:1101 C:100 A: 0 F:1100 111110110001100 Časová složitost Huffmanova algoritmu je O(n log 2 n). Příklad: dekomprimace 111110110001100 111: D 1101: E 100: C 0: A 1100: F DECAF 75

3 Komprimace dat LZ77, LZ78 a LZW algoritmus (Abraham Lempel, Jakob Ziv and Terry Welch) LZ77. Publikovaný Abrehamem Lempelem a Jacobem Zivem v roce 1977. patří mezi takzvané slovníkové algoritmy Algoritmus prochází data postupně od začátku do konce. V případě, že narazí na skupinu znaků, která se již v předchozích datech objevila, nahradí tuto skupinu znaků odkazem na předchozí výskyt. Komprimovaná data se pak skládají ze znaků, pro které nebyla nalezena žádná reference, tzv. literálů a referencí nahrazujících skupiny znaků. Mějme text: the quick brown fox jumps over the lazy dog. Slovo 'the' se vyskytuje dvakrát, lze komprimovat: the quick brown fox jumps over << lazy dog. kde << je pointer na prvníčtyři znaky v textu. 76

3 Komprimace dat Popis algoritmu LZ77: Při komprimaci se vytváří okno, které prochází přes sekvenci komprimovaných dat a v každém kroku hledá nejdelšíčást okna shodnou s předchozí sekvencí. Opakující se části dat odkazem na jejich původní výskyt, dvojicí (délka,offset) a připojí prvním následujícím znakem za ukazatelem. Poz 1 2 3 4 5 6 7 8 9 Krok A A B C B B A B C Aktuální pozice Shoda okna se sekvencí Následující znak Výstup 1. 1 - A (0,0)A 2. 2 A B (1,1)B 3. 4 - C (0,0)C 77 6. 7 AB C (2,2)C Při dekomprimaci v každém kroku se čte ze vstupu pár (délka,ofset)znak ze vstupu a na výstup jde sekvence daná oknem (délka,ofset) a Znak.

3 Komprimace dat LZ78. Zatímco LZ77 pracuje na minulých datech, LZ78 se pokouší pracovat s budoucími daty. Prochází data a porovnává je se slovníkem, který udržuje. Dívá se dopředu v sekvenci a hledá co nejdelší sekvenci, nacházející se již ve slovníku. Na tu se pak odkazuje stejně jako v LZ77. Do slovníku je přidána sekvence společně s následujícím znakem, čímž slovník roste. Mějme opět text: the quick brown fox jumps over the lazy dog. Slovo 'the' se vyskytuje dvakrát, je tedy přidáno do slovníku a nahraženo odkazem *: * quick brown fox jumps over * lazy dog. 78

3 Komprimace dat LZW. Jde o modifikaci původního algoritmu, kterou vytvořil Terry Welch (1984). LZW pracuje, podobně jako LZ78, na principu udržování slovníku a odkazováním do něj. Na rozdíl od LZ78 si LZW slovník postupně vytváří spojováním kratších slov. Na počátku je slovník inicializován jednoznakovými slovy použité abecedy (typicky 256 znaků ASCII). Postupně, jak prochází sekvenci, ukládá do slovníku nalezené unikátní dvoupísmenné výrazy a jednopísmenné slovo vypíše na výstup. Tímto způsobem postupně skládá slova dohromady a rozšiřuje si tak slovník. set w := NIL loop read a character k if wk exists in the dictionary w := wk else output the code for w add wk to the dictionary w := k endloop 79 read a character k output k w := k loop read a character k entry := dictionary entry for k output entry add w + first char of entry to the dictionary w := entry endloop Animace: http://www.cs.sfu.ca/cc/365/li/squeeze/lzw.html

3 Vyhledávání v řetězcích Nechť P je řetězec velikosti m, pak fragment P[i..j] se sestává z i-tého až j-tého znaku řetězce P prefixem (předponou) řetězce P je fragment typu P[0..i] sufixem (příponou) řetězce P je fragment typu P[i..m-1] Mějme řetězce T (text) a P (vzorek), pak úloha spočívá ve vyhledávání fragmentu P v řetězci T Typické algoritmy pro vyhledávání výskytů jednoho vzorku Brute-force Match - algoritmus hrubé síly Knuth-Morris-Prattův algoritmus porovnává vzorek s textem zleva doprava, ale posouvá vzorek inteligentněji než brute-force algoritmus Algoritmus Boyer-Moore algoritmus porovnává vzorek s textem od konce vzorku, tj. zprava doleva, při neshodě přeskakuje znaky Vyhledávání výskytů množiny vzorků Algoritmus Aho-Corasickové - algoritmus je založen na vyhledávání ve slovníku uspořádaném do tzv. keyword tree struktury (tzv. trie) s využitím konečného stavového automatu 80

3 Vyhledávání v řetězcích Brute-force Match Algoritmus hrubé síly porovnává vzorek P délky m s řetězcem T délky n pro každé možné posunutí P vůči T, dokud je nalezena shoda, nebo všechna umístění vzorku byla vyzkoušena Časová složitost je O(nm) Příklad pro nejhorší případ: 81 T = aaa ah, P = aaah Může se vyskytnout v binárních datech (např. v obrázcích), pro text je nepravděpodobné. T 0 1 2 3 4 5 6 7 8 9 p a t t e r n m a i Algorithm BruteForceMatch(T, P) Input text T of size n, pattern P of size m Output starting index of a substring of T equal to P or 1 if no such substring exists for i 0 to n m { test shift i of the pattern } j 0 while j < m and T[i + j] = P[j] j j + 1 endwhile if j = m then return i {match at i} endfor return -1 {no match anywhere} P 0 1 2 3 t e r n j

3 Vyhledávání v řetězcích Algoritmus Boyer-Moore Algoritmus se opírá o dvě heuristiky: Zrcadlová heuristika: Porovnej sekvenci v T se vzorkem P od konce, tj. zprava doleva Přeskakování znaků: Když nastane neshoda ve znaku T[i] = c Pokud P obsahuje c, posuň P tak, aby se shodoval poslední výskyt c v P s T[i], viz případ {A}; není-li posun doprava možný (poslední výskyt c je za aktuální pozicí), pak posuneme P doprava o jeden znak Pokud neobsahuje, posuň P tak, aby P[0] souhlasilo s T[i + 1], viz případ {B} Příklad: T= a pattern matching algorithm P= rithm t m T[i]= t T[i]= a a m T[i+1] 82 {A} {B} P[0]

3 Vyhledávání v řetězcích Boyer-Moorův algoritmus předzpracovává vzorek P a abecedu Σ tak, aby sestavil funkci posledního výskytu (last-occurrence) L mapujícíσna celá čísla, kde L(c) je definováno jako největší index i takový, kdy P[i] = c, nebo 1, pokud takový neexistuje Příklad: P = abacab, Σ = {a, b, c, d} 0 1 2 3 4 5 a b a c a b c a b c d L(c) 4 5 3-1 Funkce posledního výskytu L(c) může být reprezentována polem indexovaným podle numerického kódu znaku; funkce se napočítá pro vzorek P před vyhledáváním Časová složitost funkce L(c) je úměrná O(m + s), kde m je velikost P a s je velikost abecedy Σ Algoritmus je vhodný pro vyhledávání v textových řetězcích 83

3 Vyhledávání v řetězcích Algorithm BoyerMooreMatch(T, P, Σ) L(c)... lastoccurencefunction(p, Σ ) i m 1 j m 1 repeat if T[i] = P[j] if j = 0 84 index posledního znaku v příznaku P return i { match at i } else i i 1 j j 1 else { character-jump } l L[T[i]] i i + m min(j, 1 + l) j m 1 until i > n 1 return 1 { no match } Porovnej sekvenci v T s příznakem P od konce, tj. zprava doleva Když nastane neshoda, posuň P vůči T Pozn.: m...počet znaků v P, n...počet znaků v T pole P a T indexovány od nuly poslední výskyt v P před neshodou poslední výskyt v P za neshodou

3 Vyhledávání v řetězcích Příklad: Časová složitost Boyer-Moorova algoritmu je O(nm + s) Příklad pro nejhorší případ: T = aaa a, P = baaa Může se vyskytnout v binárních datech (např. v obrázcích), pro text je nepravděpodobné. Boyer-Moorův algoritmus je na textu výrazně rychlejší než brute-force algoritmus pro velkou abecedu Σ 85 c a b c d L(c) 4 5 3-1

3 Vyhledávání v řetězcích KMP algoritmus Knuth-Morris-Prattův algoritmus porovnává vzorek P s textem T zleva doprava, ale posouvá vzorek inteligentněji než bruteforce algoritmus Když dojde k neshodě, jak můžeme co nejvíce posunout vzorek P, abychom vyloučili redundantní porovnávání? Odpověď: Najdeme nejdelší prefix podřetězce P[0..j-1], který je i sufixem podřetězce P[1..j-1] 0 5 Není nutné porovnávání opakovat 0 2 Pokračovat v porovnávání odtud j=5 j=2 Nalezneme nejdelší předponu v "a b a a b" ( P[0..j 1] ), shodnou s příponou v "b a a b" ( P[1.. j 1] ): Odpověď: "a b" Nová hodnota j = 2 86

3 Vyhledávání v řetězcích Knuth-Morris-Prattův algoritmus předzpracovává vzorek, aby vyhledal shody prefixů vzorku se vzorkem samotným Funkce neshody (failure function) F(k) je definována jako délka nejdelšího prefixu podřetězce P[0..k], který je zároveň sufixem podřetězce P[1..k], kde k=j-1 je pozice před neshodou Knuth-Morris-Prattův algoritmus modifikuje prostý brute-force algoritmus tak, že pokud neshoda nastane v P[j] T[i], pokračujeme j F(j 1) k 0 1 2 3 4 5 P(k) a b a a b a F(k) 0 0 1 1 2 3 Není nutné porovnávání opakovat k = j-1 Pokračovat v porovnávání odtud 87

3 Vyhledávání v řetězcích Funkce neshody může být reprezentována polem a může být sestavena v čase O(m) Při každé iteraci ve while smyčce: i se zvyšuje o jedna, nebo posunutí i j se zvyšuje nejméně o jedna (přičemž F(j 1) < j) Smyčka tedy má složitost O(n) Algorithm KMPMatch(T, P) F failurefunction(p) i 0 j 0 while i < n if T[i] = P[j] if j = m 1 return i j { match } else i i + 1 j j + 1 else if j > 0 j F[j 1] else i i + 1 return 1 { no match } KMP s algoritmus běží v optimálním čase O(m + n) Algoritmus není příliš vhodný pro vyhledávání v textu (málo opakování v prefixu/sufixu), je vhodný pro binární data 88

3 Vyhledávání v řetězcích j 1 2 3 4 5 6 k=5: j F(k)=2 k 0 1 2 3 4 5 1 2 3 4 5 6 k=1: j F(k)=0 0 1 2 3 4 5 1 2 3 4 5 6 k=4: j F(k)=1 0 1 2 3 4 5 k=0: j F(k)=0 1 2 3 4 5 6 0 1 2 3 4 5 1 2 3 4 5 6 89

4 Grafové algoritmy Základní pojmy Graf G je dvojice (V,E). Prvky množiny V jsou vrcholy a prvky jsou hrany. Neorientovaný graf G značíme G(V,E), kde V je množina vrcholů a E je množina dvojic vrcholů z V, hrana e = {u,v}. Vrcholy jsou body a hrany spojnice vrcholů Orientovaný graf G značíme G(V,E), kde V je množina vrcholů a E je množina uspořádaných dvojic vrcholů z V, hrana e = (u,v) počáteční vrchol hrany e se značí PV(e), koncový vrchol KV(e) hrany se značí šipkou ve směru od počátečního vrcholu neorientovaný graf lze převést na orientovaný nahrazením každé neorientované hrany {u,v} dvojicí orientovaných hran (u,v) a (v,u). Pokud hrana začíná a končí ve stejném vrcholu, jedná se o smyčku Pokud je více hran, které začínají ve stejném vrcholu a končí ve stejném vrcholu, říká se těmto hranám násobné a grafu se říka multigraf Počet vrcholů se značí V = n, počet hran se značí E = m Hranám a (nebo) vrcholům mohou být přiřazeny nějaké hodnoty. Takovému grafu se říká ohodnocený. 90

4 Grafové algoritmy Důležité množiny hran a vrcholů V(G) množina vrcholů grafu G E(G) množina hran grafu G Příklad: V(x) množina sousedních vrcholů vrcholu x V+(x) množina následníků vrcholu x; vrcholy, do kterých vede hrana z x V-(x) množina předchůdců vrcholu x; vrcholy, ze kterých vede hrana do x deg(x), d(x) stupeň vrcholu x; počet hran, jejichž je x krajní vrchol (smyčky počítáme dvakrát) deg + (x), d + (x) výstupní stupeň vrcholu x; počet hran vycházejících z x deg - (x), d - (x) vstupní stupeň vrcholu x; počet hran vcházejících do x 91

4 Grafové algoritmy Podgraf. Graf G je podgrafem grafu G, vznikne-li grafu G vynecháním nějakých (žádných) vrcholů a příslušných hran. Podgraf musí být stále grafem. Pokud je odebrán, musí být odebrány i všechny hrany, kterých je odebíraný vrchol součástí a pro každou hranu podgrafu do něo musí patřit oba krajní vrcholy. Faktor grafu. Graf G je faktorem grafu G, vznikne-li pouze vynecháním hran, tzn. V(G) = V(G ). Indukovaný (úplný) podgraf. Graf G je podgrafem indukovaným množinou vrcholů (úplným podgrafem na množině A), jestliže množina vrcholů G je A a obsahuje všechny hrany grafu G, jejichž oba krajní vrcholy patří do A. Sled. Posloupnost vrcholů a hran v0,e1,v1,e2,v2,...,en,vn nazýváme sledem, jestliže každá hrana ei spojuje vrcholy vi-1,vi (mohou se opakovat vrcholy i hrany) Tah. Sled, ve kterém se neopakuje žádná hrana, se nazývá tah. Cesta. Tah, ve kterém se neopakuje žádný vrchol se nazývá cesta. Uzavřený sled (tah,cesta) je sled (tah,cesta), který začíná a končí ve stejném vrcholu. 92

4 Grafové algoritmy Reprezentace grafu Seznam hran Příklad: Neorientovaný graf na obrázku má 5 vrcholů A až E a seznam hran AB, AC, AD, BD, CD, DE. Orientovaný graf má 4 vrcholy a až d a seznam hran ab, ac, ba, cb a dc. Matice sousednosti Matice sousednosti obsahuje jen nuly nebo jednicky. Je-li graf ohodnocený, pro každou hranu budeme ukládat do matice ohodnocení a ij hrany ij. Pokud a ij uložíme vzdálenost vrcholu i od vrcholu j, tak dostaneme matici vzdáleností. 93

4 Grafové algoritmy Seznam sousedů Orientovaný graf G = (V,E). Pro každý vrchol v si budeme pamatovat seznam jeho sousedů. Náhrada spojového seznamu - dvě pole: pole V[], obsahující ukazatele na začátky seznamů pole Sousedi[], obsahující seznamy sousedů všech vrcholů V[i] bude obsahovat index do pole Sousedi[], na kterém začíná seznam sousedů vrcholu i. Obě pole obsahují navíc zarážku. Přehled reprezentací Reprezentace Je uv hrana? Projít sousedy v Paměťová náročnost seznam hran O(m) O(m) O(m) matice sousednosti seznam sousedů O(1) O(n) O(n 2 ) O(n) O(#sousedů) O(n+m) 94

4 Grafové algoritmy Úloha procházení grafu pravidla pro efektivní průchod grafem každou hranou můžeme v každém směru projít maximálně jednou hranou, kterou do vrcholu vstoupíme poprvé, se smíme vrátit, až když z daného vrcholu nevede neprozkoumaná hrana hranou, kterou vstoupíme do již navštíveného vrcholu, se ihned vracíme zpět Vlastnosti konečnost zajišťuje první pravidlo - v každém kroku projdeme po jedné hrane, každou hranu jen jednou a hran je jen konečně mnoho korektnost v souvislém grafu projdeme všechny hrany. Nejde-li aplikovat žádné z pravidel, tak jsme v počátečním vrcholu a každou hranu jsme již prošli právě dvakrát složitost - O(n+m) pokud je práce na každém vrcholu a hraně konstatntní -čas za průchod je úměrný počtu hran m, které procházíme, a případná práce ve vrcholech počtu vrcholů n. 95

4 Grafové algoritmy Prohledávání do hloubky (DFS z anglického Depth First Search) V prvním vrcholu si vybereme jednu možnou hranu a po ní přejdeme do dalšího vrcholu. Všechny procházené hrany označujeme. V každém vrcholu, do kterého přejdeme, ověříme: Pokud jsme v již dříve navštíveném vrcholu, vrátíme se zpátky do předchozího vrcholu. Pokud je to dříve neprozkoumávaný vrchol, pokračujeme první možnou neprošlou hranou. Pokud taková hrana neexistuje, je vrchol zcela prozkoumán a vrátíme se do předchozího vrcholu. Tímto postupem projdeme celý graf a nakonec se vrátíme do výchozího vrcholu. 96

4 Grafové algoritmy Prohledávání do šířky (BFS z anglického Breadth First Search) průchod (prohledání grafu) ve vlnách tzv. algoritmus vlny. Vyjdeme z vrcholu všemi hranami (vlna) a při vstupu do dalších vrcholů se vlna znovu rozdělí po všech hranách. Graf prozkoumáváme po vlnách V první vlně se dostaneme do vrcholů, do kterých vede z výchozího vrcholu hrana. V druhé vlně se dostaneme do vrcholů, které jsou ve vzdálenosti 2 od výchozího vrcholu. Podobně v k-té vlně se dostaneme do vrcholu ve vzdálenosti k od výchozího vrcholu. Implementuje se obvykle tak, že při vstupu do nového vrcholu uložíme všechny možné cesty do fronty. Frontu průběžně zpracováváme. atd... 97

4 Grafové algoritmy Hledání nejkratší cesty v grafu Nechť G=(V,E) je souvislý graf. Nechť w je funkce přiřazující každé hraně e z E reálnou hodnotu (cenu hrany). Chceme najít nejlevnější (nejkratší) cestu ze startovního vrcholu do cílového vrcholu. Fakticky se hledají nejkratší sledy. Ty se ale rovnají nejkratším cestám, pokud ohodnocení hran grafu je nezáporné. Dijkstrův algoritmus je algoritmus pro nalezení nejkratší cesty v grafu z vrcholu s do vrcholu t. Je konečný, protože v každém průchodu cyklu se do množiny navštívených uzlů přidá právě jeden uzel (průchodů cyklem je nejvýše tolik, kolik má graf vrcholů). Funguje nad hranově kladně ohodnoceným grafem (neohodnocený graf lze na ohodnocený snadno převést). Předpokládáme: Graf je souvislý Graf má neorientované hrany Graf má nezáporně ohodnocené hrany Pro grafy s hranami se záporným ohodnocením se obvykle používá pomalejší Bellman-Fordův algoritmus. 98

4 Grafové algoritmy Dijkstrův algoritmus Mějme graf G, v němž hledáme nejkratší cestu. V je množina všech vrcholů grafu G, množina E obsahuje všechny hrany grafu G. Algoritmus pracuje tak, že si pro každý vrchol v z V pamatuje délku nejkratší cesty d[v], kterou se k němu dá dostat (na začátku: pro počáteční vrcholu s je d[s]=0, pro ostatní vrcholy d[v]= ). Množina Z obsahuje už navštívené vrcholy a N dosud nenavštívené. Algoritmus pracuje v cyklu tak dlouho, dokud N není prázdná. V každém průchodu cyklu se přidá jeden vrchol v min z N do Z, a to takový, který má nejmenší hodnotu d[v] ze všech vrcholů v z N. Relaxace hran: Pro každý vrchol u, do kterého vede hrana z v min, se provede následující operace: pokud (d[v min ] + l(v min,u)) < d[u], pak do d[u] d[v min ] + l(v min,u), jinak nic. Až algoritmus skončí, potom pro každý vrchol v z V je délka jeho nejkratší cesty od počátečního vrcholu s uložena v d[v]. 99 Příklad: d(u)=50, d(z)=60, e=10 d(z) min{d(z), d(u)+e} relaxovaná hrana

4 Grafové algoritmy N: B C D E F Z: A N: B E F Z: A C D N: F Z: A C D E B N: B D E F Z: A C N: B F Z: A C D E N: Z: A C D E B F 100