OZD. Organizace a zpracování dat. učební text



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

Grafové algoritmy. Programovací techniky

Obsah prezentace. Základní pojmy v teorii o grafech Úlohy a prohledávání grafů Hledání nejkratších cest

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

Grafové algoritmy. Programovací techniky

Vzdálenost uzlů v neorientovaném grafu

Úvod do teorie grafů

Algoritmy na ohodnoceném grafu

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

ALGORITMY A DATOVÉ STRUKTURY

Maturitní téma: Programovací jazyk JAVA

Dijkstrův algoritmus

Algoritmizace prostorových úloh

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

07 Základní pojmy teorie grafů

Kostry. 9. týden. Grafy. Marie Demlová (úpravy Matěj Dostál) 16. dubna 2019

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

Stromy, haldy, prioritní fronty

STROMOVE ALGORITMY Prohledavani do sirky (level-order) Po vodorovnejch carach fronta

Grafy. RNDr. Petra Surynková, Ph.D. Univerzita Karlova v Praze Matematicko-fyzikální fakulta.

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

Modely teorie grafů, min.kostra, max.tok, CPM, MPM, PERT

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

Algoritmy a 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

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

Základy informatiky. Teorie grafů. Zpracoval: Pavel Děrgel Úprava: Daniela Szturcová

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.

Dynamické datové struktury IV.

Grafy. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 13.

Prioritní fronta, halda

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

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

Řešení: PŘENESVĚŽ (N, A, B, C) = přenes N disků z A na B pomocí C

Dynamické datové struktury I.

Algoritmizace řazení Bubble Sort

TGH05 - aplikace DFS, průchod do šířky

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

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

ADT STROM Lukáš Foldýna

Teorie grafů BR Solutions - Orličky Píta (Orličky 2010) Teorie grafů / 66

Algoritmizace prostorových úloh

5 Orientované grafy, Toky v sítích

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í

Operační výzkum. Síťová analýza. Metoda CPM.

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

zejména Dijkstrův algoritmus pro hledání minimální cesty a hladový algoritmus pro hledání minimální kostry.

4EK311 Operační výzkum. 5. Teorie grafů

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

3. Prohledávání grafů

Datové typy a struktury

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

ORIENTOVANÉ GRAFY, REPREZENTACE GRAFŮ

Použití dalších heuristik

Základy umělé inteligence

Základní pojmy teorie grafů [Graph theory]

TGH07 - Chytré stromové datové struktury

TGH05 - aplikace DFS, průchod do šířky

Jan Březina. 7. března 2017

Graf. Uzly Lokality, servery Osoby fyzické i právní Informatické objekty... atd. Hrany Cesty, propojení Vztahy Informatické závislosti... atd.

Vektory a matice. Obsah. Aplikovaná matematika I. Carl Friedrich Gauss. Základní pojmy a operace

Základy informatiky. 07 Teorie grafů. Kačmařík/Szturcová/Děrgel/Rapant

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

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

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

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

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

Lineární datové struktury

Algoritmy I, složitost

Dynamické datové struktury III.

Základní datové struktury

4 Stromy a les. Definice a základní vlastnosti stromů. Kostry grafů a jejich počet.

bin arn ı vyhled av an ı a bst Karel Hor ak, Petr Ryˇsav y 23. bˇrezna 2016 Katedra poˇ c ıtaˇ c u, FEL, ˇ CVUT

Datový typ prioritní fronta Semestrální práce z předmětu 36PT

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

Anotace. Spojové seznamy, haldy. AVL-stromy, A-B stromy. Martin Pergel,

TÉMATICKÝ OKRUH TZD, DIS a TIS

1 Teorie grafů. Základní informace

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

Algoritmus pro hledání nejkratší cesty orientovaným grafem

TEORIE GRAFŮ TEORIE GRAFŮ 1

Lineární spojový seznam (úvod do dynamických datových struktur)

Algoritmizace prostorových úloh

Select sort: krok 1: krok 2: krok 3: atd. celkem porovnání. výběr nejmenšího klíče z n prvků vyžaduje 1 porovnání

Maturitní témata. IKT, školní rok 2017/18. 1 Struktura osobního počítače. 2 Operační systém. 3 Uživatelský software.

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

TGH07 - Chytré stromové datové struktury

Ohodnocené orientované grafy

Konvexní obal a množina

STROMY A KOSTRY. Stromy a kostry TI 6.1

ABSTRAKTNÍ DATOVÉ TYPY

HEURISTICKÉ ALGORITMY PRO ŘEŠENÍ ÚLOH OBCHODNÍHO CESTUJÍCÍHO

Metody síťové analýzy

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

Časová a prostorová složitost algoritmů

7. Funkce jedné reálné proměnné, základní pojmy

Výhody a nevýhody jednotlivých reprezentací jsou shrnuty na konci kapitoly.

GRAFY A GRAFOVÉ ALGORITMY

Výroková a predikátová logika - III

CLARKEOVA-WRIGHTOVA METODA ŘEŠENÍ ÚLOHY VRP

Transkript:

OZD Organizace a zpracování dat učební tet

Datové typy Datové typy Dělení elementární strukturované = datové struktury základní (statické) základní struktury programovacího jazyka vyšší (dynamické) Datové struktury uspořádané tranzitivní (platí-li < y a y < z pak je < z), antisymetrické (platí-li < y pak neplatí y < ), irrefleivní (neplatí < ) neuspořádané částečně uspořádané Základní datové struktury Pole homogenní datová struktura, skupina dat stejného typu (i strukturovaného) jednorozměrné pole je určeno dolní mezí D a horní mezí H, platí že H D + 1 je rovno počtu prvků v poli každému prvku přísluší inde i (D i H) k prvku o indeu i se přistupuje pomocí selektoru A[i], kde A představuje název pole Obrázek 1: Jednorozměrné a dvourozměrné pole vícerozměrné pole je zobecněním pole jednorozměrného, pole o n rozměrech má n dolních mezí, n horních mezí a n indeů Záznam heterogenní datová struktura, skupina dat různého typu (i strukturovaného) každá složka je určena názvem k jednotlivým částem struktury se zpravidla přistupuje pomocí tečky a názvu Příklad: záznam Osoba 1. část Osoba.jméno 2. část Osoba.věk 3. část Osoba.ID strana 2

Základní datové struktury častým případem jsou datové struktury, jejihž prvky tvoří záznamy stejného typu pak může být jedna z částí určena pro jednoznačnou identifikaci záznamu nazýva se klíč (Osoba.ID) klíč lze využít pro vyhledávání, třídění Dynamické datové struktury Seznam odpovídá posloupnosti prvků záleží na pořadí prvku v posloupnosti, tentýž prvek se může v posloupnosti vyskytnout vícekrát základní operace se seznamy: určení, zda je prvek v seznamu obsažen přidání prvku na začátek nebo konec ubrání prvku ze začátku nebo konce přidání prvku na libovolnou pozici v seznamu odebrání prvku z libovolné pozice v seznamu určit počet prvků seznamu spojit 2 seznamy rozdělit jeden seznam na 2 speciální případy seznamu zásobník, fronta, oboustranná fronta zásobník LIFO (last in, first out) umožňuje přidání, odebrání a určení prvku pouze na konci seznamu fronta FIFO (first in, first out) umožňuje přidání prvku na konec seznamu, a odebrání a určení prvku na začátku Obrázek 2: Speciální typy seznamů - zásobník, fronta, oboustranná fronta oboustranná fronta umožňuje přidání, odebrání a určení prvku na obou koncích rychlost operací závisí na způsobu implementace seznamu 2 základní způsoby implementace: kompaktní seznam pouze pro seznamy, jejihž prvky jsou stejného typu pro implementaci použito pole L ma (maimání počet), L (aktuální délka), S[1]..S[L] (prvky seznamu) rychlé operace na konci (nezávisí na počtu prvků v poli), pomalé přidávání/ubírání z obecné pozice, dělení na 2 výhodné pro realizaci zásobníku lze optimalizovat pro frontu kromě indeu konce L držím i inde začátku Z, při odebrání ze začátku se neposouvají strana 3

Dynamické datové struktury prvky, ale jen inde.. točí se kolem dokola nevýhody časová náročnost některých operací, nutnost statické alokace paměti spojový seznam jedntolivé části seznamu jsou v paměti umístěny libovolně, jsou propojeny pomocí ukazatelů na následující položku Obrázek 3: Příklad spojového seznamu na první položku ukazuje proměnná Záhlaví typy jednosměrný seznam každá položka obsahuje ukazatel na následující položku obousměrný seznam každá položka obsahuje ukazatele na následující i předcházející položku cyklický seznam konec seznamu ukazuje na začátek výhody všechny operace jsou velice rychlé nevýhody fragmentace paměti při vynechávání položek seznamu (řeší garbage collector) při vynechání položky je třeba spojit předchůdce a následníka následníka určuje přímo vynechávaná položka, ale k předchůdci je nutno dojít procházením seznamu od začátku (řeší oboustranný spojový seznam) Kořenové stromy dynamická struktura, jejíž každý prvek může mít více následníků obecný strom (n-ární) názvosloví (syn je uzel v nižší vrstvě, bratr je uzel ve stejné vrstvě, otec ve vyšší vrstvě, kořen nejvyšší uzel) vrchol záznam, který obsahuje mj 2 ukazatele nejstaršího syna a nejstaršího z mladších bratrů (pokud neeistují speciální symbol) speciální záznam ukazující na kořen stromu 1 1 2 3 4 2 3 4 5 6 7 5 6 7 Obrázek 4: n-ární strom a jeho možná reprezentace binární strom každý vrchol má buď jednoho, dva nebo žádného syna strana 4

Dynamické datové struktury 1 2 3 5 6 7 4 8 Obrázek 5: Binární strom každý vrchol obsahuje 2 záznamy na levého a pravého syna (nebo speciální symbol neeistence syna) les skupina stromů, uspořádaná do spojového seznamu výhodné použít volné ukazatele na mladšího bratra u kořene (kořen stromu nemá bratry) 1 7 1 2 3 4 8 2 7 5 3 8 5 6 6 Obrázek 6: Les a jeho možná reprezentace 4 tento způsob implementace dovoluje pohlížet na les jako na binární strom operace je-li třeba rychle procházet strom vzhůru, je vhodné doplnit odkaz na otce přidávání uzlů je očividné doplní se ukazatel odebírání je třeba rozhodnout co udělat se syny (například odebíraného otce zastoupí první syn) Množiny popis operací: MEMBER(,M) určení, zda je členem množiny M INSERT(,M) vložení do M, pokud mají být prvky unikátní, je nejhdřív třeba provést MEMBER DELETE(,M) vyjmutí z M předpokládáme, že leží v M, pokud si nejsme jisti, je opět třeba provést MEMBER další operace předpokládájí, že prvky jsou tvořeny záznamy s klíčy, pomocí nihž můžeme záznamy porovnávat MIN(M)/MAX(M) - určení minima/maima v množině M EXTRACT-MIN(M)/EXTRACT-MAX(M) určení a vyjmutí minima/maima (jedná se o kombinaci MIN/MAX a DELETE) UNION(M,N) sjednocení množin strana 5

Dynamické datové struktury Implementace charakteristickou funkcí množina je podmonžinou základní množiny (universa) U = { 1,.., n } pole A[i], i = 1..n platí, že pokud je A[i] = true, pak i patří do dané množiny tento způsob implementace je nepoužitelný pro velká n náročnost operací MEMBER, INSERT, DELETE probíhají v konstantním čase sjednocení, průnik, MIN, MAX probíhají v lineárním čase eistují i optimalizační algoritmy pro zrychlení těchto operací Implementace seznamem rychlost operací závisí na konkrétní implementaci seznamu pokud je seznam spojový, tak jsou operace MEMBER, MIN, MAX lineární, ostatní konstantní (za předpokladu, že se jedná o disjunkntní množiny) INSERT kamkoliv, sjednocení pomocí propojení seznamů realizace průniku je velmi komplikovaná (kvadratická náročnost) Implementace uspořádaným seznamem prvky jsou seřazeny podle klíčů velmi rychloá realizace operací MIN, MAX, EXTRACT MIN/MAX kvůli vkládání do uspořádaného seznamu se zpomalí INSERT kompaktní implementací seznamu se urychlí funkce MEMBER (binárním vyhledáváním), ale zkomplikuje se vkládání a výběr Vyhledávací stromy (binární) klíče v levém podstromě jsou menší než klíče ve vrcholu klíče v pravém podstromě jsou větší než klíče ve vrcholu pro množiny o n prvcích lze použít libovolný binární strom o n vrcholech, vrcholy se ohodnotí dle definice 11 3 15 1 7 14 18 2 5 10 8 Obrázek 7: Příklad binárního vyhledávacího stromu MEMBER C, ohodnocení vrcholů dáno funkcí c, pomocná proměnná v není-li strom prázdný, v = kořen strana 6

Dynamické datové struktury a) je-li C = c(v), je v hledaný vrchol konec b) je-li C < c(v) a v nemá levého následníka konec (neúspěch) c) je-li C > c(v) a v nemá pravého následníka konec (neúspěch) d) je-li C < c(v) a v má levého následníka v = levý následník v e) je-li C > c(v) a v má pravého následníka v = pravý následník v INSERT C podobné, v situaci b nebo c přidáme C jako nového následníka (viz Obrázek 8a) MIN, MAX provádíme operaci v = levý/pravý následník v tak dlouho, dokud následník eistuje. Až následník nebude, v je etrém DELETE v nemá-li v následníky, vynecháme jej má-li v 1 následníka, v vynecháme, následníka propojíme s otcem (viz Obrázek 8b) má-li v 2 následníky, w je levý následník, položíme z = w a opakujeme z = pravý následník z tak dlouho, dokud má z pravého následníka. Pak vrchol z přeneseme na pozici v a vrchol z vynecháme (viz Obrázek 8c) 7 10 5 10 3 15 4 a) 8 1 7 14 18 7 7 2 5 8 5 10 5 8 c) 8 b) Obrázek 8: Operace s vyhledávácím stromem náročnost do stromu o výšce h se vejde 2 h 1 prvků tzn výška pro n prvků je log(n + 1) je vhodné udžovat, pak je čas závislý na log n, pokud není až n čas operací je úměrný výšce stromu problém výšky při INSERT a DELETE se strom deformuje řešení používat algoritmy pro vyvažování, spolehnout se na náhodu (při větším množství náhodných operací je náročnost 1,4 log(n)) Vyvažování binárních stromů AVL strom je binární strom takový, že po každý jeho vrchol v platí strana 7

Dynamické datové struktury buď je v koncový vrchol nebo v má jediného následníka, kterým je koncový vrchol nebo v má 2 následníky s výškami h 1 a h 2, jejihž rozdíl je menší nebo roven 1 nebo-li strom, jehož všechny vrcholy jsou vyváženy, hloubka levého a pravého podstromu se liší ma o 1 Pro každý vrchol zavedeme funkce vrcholu l(v) a p(v), l(v) je rovno výšce levého a p(v) je rovno výšce pravého následníka. Pokud daný následník neeistuje, l(v) nebo p(v) = -1 Dále označíme b(v) = l(v) p(v).. pak vrchol v nazveme vyvážený, pokud je b(v) = -1, 0 nebo 1 Vznik nevyváženého vrcholu z z y y T3 T3 T1 T2 a) T1 T2 z z y y T3 T3 s s T1 T1 T2 b) T2' T2 Obrázek 9: Vznik a odstranění nevyvážeností při operaci INSERT v AVL stromu jedná se o případy, kdy se přidáním vrcholu do stromu změní hodnota b(v) z 1 na 2 (z -1 na -2) určení vrcholu, který je třeba vyvážit: vrchol leží na cestě od kořene stromu k přidanému vrcholu a platí b() = 1, je-li nový vrchol přidán vlevo od b() = -1, je-li nový vrchol přidán vpravo od Pro ostatní vrcholy y, které leží mezi a přidaným vrcholem, musí platit b(y) = 0, protože by se: buď změnilo b(y) z 1 nebo -1 na 0 pak zůstane zachována výška stromu a není třeba vyvažovat nebo se změnilo b(y) na 2 nebo -2, pak by ale vyvážení proběhlo v y a nebylo by třeba v strana 8

Dynamické datové struktury Na obrázku lze vidět 2 možné způsoby vzniku nevyvážeností původně měly T1 T3 stejnou výšku, po přidání prvku do stromu T1 (viz Obrázek 9a) nebo T2 (viz Obrázek 9b) se porušila vyváženost vrcholu vyváženost byla obnovena změnou tvaru stromu vyvažuje se vždy nejnižší nevyvážený vrchol algoritmus INSERT C vkládáme, T strom, c je ohodnocení, pro vrchol v je hodnota b(v) v právě probíraný vrchol, kandidát na vyvažování, u, z předchůdci v, 1) je strom prázdný ano vložíme kořen, konec ne v, = kořen, u = záhlaví 2) procházení stromem (opakování operací) a) C = c(v) C již eistuje, konec algoritmu b) C < c(v) a v nemá levého následníka přidáme k v levého následníka w, b(v)++, b(w) = 0, dále bod 3 c) C < c(v) a v má levého následníka provedeme: je-li b(v) nenulové, pak =v, z=u; poté (bez ohledu na b(v)) položíme u=v, v=levý následník v d) C > c(v) a v nemá pravého následníka přidáme k v pravého následníka w, b(v)--, b(w) = 0, dále bod 3 e) C > c(v) a v má pravého následníka provedeme: je-li b(v) nenulové, pak =v, z=u; poté (bez ohledu na b(v)) položíme u=v, v=levý pravý následník v 3) aktualizace hodnot b u všech vrcholů y, které leží na cestě od do v (včetně) zvýšíme b(y) o 1, pokud se sem pokročilo z 2c, nebo snížíme b(y) o 1, pokud se sem pokročilo z 2e 4) modifikace stromu pokud je po bodu 3 hodnota b() = 2 nastává situace z 10a, b, pokud je -2, nastává zrcadlově symetrická situace. Strom je třeba upravit dle obrázků 10a, b a u vrcholů s novými následníky je třeba provést odpovídající úpravu hodnoty b z z y y T3 T3 T1 T2 T1 T2 Obrázek 10: Vznik nevyvážeností při operaci DELETE v AVL stromu Při operaci DELETE lze opět použít ilustrace z obrázku 9, ovšem s následujícími změnami: T1 a T3 (a), resp T2 a T3 (b) měly původně stejnou výšku, o 1 větší než T2 resp T1.. Ubráním v T3 se narušila vyváženost, takže ji je třeba dle obrázků obnovit, dojde k poklesu výšky stromu obecně je třeba modifikaci provádět víckekrát (na rozdíl od INSERTU) Při DELETE může nastat další situace (viz Obrázek 10). T1-T3 měly stejnou výšku, v T3 byl ubrán prvek a strom je třeba modifikovat veškeré popsané situace mají své symetrické protějšky, jejichž řešení je analogické strana 9

Dynamické datové struktury algoritmus DELETE máme strom T, vrchol ke smazání v, pro vrchol w je dána hodnota b(w) 1) v má ma 1 následníka v vynecháme dle algoritmu pro vynechání vrcholu obecného vyhledávacího binárního stromu poté probíráme předchůdce v až ke kořeni, dokud se nedostaneme ke kořeni nebo není ukončen výpočet pro každého následníka w provedeme tyto operace: a) pokud jsme do w vstoupili z levého následníka a platí b(w) >=0, pak b(w)--, a bylo-li původně b(w)=0, výpočet ukončíme b) pokud jsme do w vstoupili z pravého následníka a platí b(w) <=0, pak b(w)++, a bylo-li původně b(w)=0, výpočet ukončíme c) není-li splněno a) ani b), nastala jedna ze situací z obrázků 9 a 10, provedeme příslušné úpravy, pokud nastala situace z obrázku 10, výpočet ukončíme 2) v má 2 následníky případ převedeme na případ 1 pomocí postupu uvedeného v algoritmu pro vynechání vrcholu obecného vyhledávacího binárního stromu operace MEMBER, MIN a MAX nemění výšku stromu není třeba vyvažovat použijeme-li MEMBER, MIN, MAX, upravený INSERT a upravený DELETE, všechny operace se stromem budou k provedení vyžadovat čas závislý na logaritmu počtu prvků Halda Jednoduchá datová struktura, umožňující rychlé provádění množinových operací INSERT a EXTRACT-MIN Jedná se o binární strom v následujícím tvaru: Každý vrchol haldy, který neleží v předposlední nebo poslední řadě, má 2 následníky v předposlední řadě následují zleva doprava vrcholy se dvěma následníky, pak případně jeden s jedním následníkem a pak již bez následníků Ohodnocení libovolného vrcholu není větší než ohodnocení kteréhokoliv z jeho následníků Počet vrcholů jednoznačně určuje tvar haldy výhoda umožňuje určovat předchůdce a následníky výpočtem vrcholy haldy lze uspořádat do posloupnosti v 1 v N tak, že levý následník v i je v 2i, pravý je v (2i+1) a předchůdce v i div 2 díky tomu lze haldu implementovat jako pole, halda velmi dobře využívá paměť 5 8 6 9 10 15 11 16 14 Obrázek 11: Příklad haldy INSERT 1) vloží se nový vrchol za poslední vrchol v posledním řádku, je-li řádek plný, začne se nový 2) přidaný vrchol w se ohodnotí C strana 10

Dynamické datové struktury 3) není-li w kořen, pak je-li ohodnocení předchůdce z vrcholu w větší než ohodnocení w, pak se vrcholy prohodí, bod 3 opakujeme EXTRACT-MIN 1) vyjmeme kořen máme ihned nejmenší vrchol 2) vyjmeme nejposlednější vrchol a dáme jej na místo kořene, označíme w 3) dokud má w následníka s nižším ohodnocením, prohazujeme w s menším z méně ohodnocených následníků Haldu lze i uzpůsobit pro rychlé provádění EXTRACT-MAX definice je opačná k uvedené Reprezentace grafu Matice sousednosti nejjednodušší způsob maticové operace jsou podporovány většinou programovacích jazyků graf n je popsán čtvercovou maticí W o rozměrech n n, W[i, i] = 0 (stejný uzel 0 vzdálenost) W[i, j] = (mezi uzly i a j je hrana s ohodnocením ) W[i, j] = inf (mezi uzly není hrana) v případě malého počtu hran (rovinné grafy) plýtvání pamětí, výpočetní náročnost Reprezentace rovinných grafů každému vrcholu se přiřadí seznam sousedů (spojový seznam) L(H) H Q(H) Obrázek 12: Rovinný graf každá hrana je chápána jako dvojice opačně orientovaných hran hranu H popisuje ZAC(H), KON(H) počáteční a koncový vrchol, REV(H) = (KON(H), ZAC(H)) opačně orientovaná hrana Q(H) orientovaná hrana, začínající v témže vrcholu H, na kterou narazíme jako první při oběhu kolem ZAC(H) po směru pohybu hodinových ručiček Qinv(H) proti směru L(H), R(H) vychází z koncového vrcholu H, určené jako pokračování H co nejvíce doleva/doprava L(H) = Q(REV(H)), Q(H) = L(REV(H)) R(H) = Qinv(REV(H)), Qinv(H) = R(REV(H)) Třídění REV(H) Q2(H) slouží pro uspořádání skupiny datových typů pro urychlený přístup k informaci datový typ musí obsahovat klíč vlastnost, podle které je možné jej uspořádat strana 11

Třídění třídění uspořádání dat tak, aby jejich klíče vytvořily nerostoucí nebo neklesající posloupnost přirozené třídění je rychlejší pro částečně uspořádanou množinu stabilní třídění zachovává pořadí záznamů se stejnou hodnotou klíče (důležité při třídění podle více klíčů) základní metody Insert sort třídění přímým vkládáním třídění probíhá přímo při vkládání prvků před vložením prvku je třeba nalézt jeho pozici pomocí vhodné metody vyhledávání efektivita závisí na efektivitě vyhledávacího algoritmu (sekvenční hledání, binární hledání) přirozený a stabilní algoritmus Bubble sort třídění záměnou 2 prvků prochází se celá posloupnost, porovnávají se dva sousední prvky, pokud nevyhovují podmínce, jsou prohozeny velice jednoduchý algoritmus, pomalý (O(n 2 )) v nejhorším případě je potřeba projít celou posloupnost n 2 krát přirozený a stabilní algoritmus velice rychlý pro zjištění, zda je pole setříděné možná vylepšení zarážka, při každém průchodu sledujeme, zda došlo k záměně, pokud ne algoritmus končí shakersort třídění přetřásáním při každém průchodu měníme směr Shell sort úprava bubblesortu, neporovnávají se sousední prvky, ale prvky o vzdálenosti d, tato délka se po každém průchodu posloupností snižuje na polovinu algoritmus je nestabilní, přirozený Quicksort původní, neodvozená metoda, autor C.A.R Hoare (1962) princip v posloupnosti zvolíme číslo k, nalevo od něj dáme všechny prvky menší než k (část 1), pak necháme všechny prvky rovné k (část 2) a napravo dáme všechny prvky větší než k (část 3) poté setřídíme část 1 a část 3 vznikne uspořádaná posloupnost k setřídění použijeme opět quicksort rekurzivní volání pokračujeme, dokud nejsou podposloupnosti prázdné další varianta posloupnost dělíme pouze na 2 části v jedné části jsou prvky menší nebo rovno k, v druhé části jsou prvky větší než k nestabilní, nepřirozený algoritmus pro setříděná pole dává horší výsledky Heap sort pro třídění využívá vlastnosti hromady strana 12

Třídění neuspořádané prvky se použijí pro vytvoření hromady, pak se postupně odebírají z vrcholu výsledkem je setříděná posloupnost použití heapsortu je efektivní při větším množství prvků výsledky jsou téměř stejné pro setříděné i nesetříděné pole algoritmus je nepřirozený, nestabilní Prohledávání grafů metody, pomocí nichž lze jistými způsoby projít všechny vrcholy stromu nebo grafu, popřípadě provést v každém vrcholu nějakou operaci Prohledávání kořenových stromů kořenový strom speciální případ orientovených grafů objekty, které lze vyjádřit pomocí stromů jsou časté aritmetické vzorce, chemické vzorce (lineární popis lze snadno popsat pomocí prohledávání stromů) prohledávání do hloubky postup stromem co nejníže, až to již není možné - návrat prohledávání do šířky po vrstvách Prohledávání binárních stromů do hloubky postupný průchod všemi vrcholy, k přechodu se používají obousměrně prostupné orientované hrany na vrcholech lze provádět obecné operace OP1, OP2 a OP3 binární strom s kořenem r, pomocné proměnné v a w 1) v = r 2) neustále opakujeme 2a, 2b a 2c 2a) jestliže ve v nebyla provedena OP1, provedeme-ji, eistuje-li následník w, přejdeme do w a položíme v=w 2b) jestliže ve v byla provedena OP1, ale nebyla provedena OP2, provedeme-ji, eistuje-li pravý následník w, přejdeme do w a položíme v=w 2c) jestliže ve v byla provedena OP2, pak provedeme OP3, pokud je v=r, konec výpočtu, jinak přejdeme do předchůdce w, v=w součástí OP1, OP2 je poznámka vlevo/vpravo jsme již byli operace OP1, 2, 3 lze využít k výpisu stromu 13 + 4 18 * * 1 8 14 20 + C - F 3 7 10 19 A B D E a) b) Obrázek 13: Obrázky k procházení binárních stromů strana 13

Prohledávání grafů příklad OP1 vypíše levou závorku, OP2 vypíše vrchol, OP3 vypíše pravou závorku výsledek: ((((A) + (B) * (C)) + (((D) (E) * (F))) OP3 vypíše vrchol, OP1, 2 nic výsledek: A B + C * D E F * + lineární výpis užívající OP1 preorder, OP2 inorder, OP3 postorder použití překlad různých způsobů zápisu hiearchických struktur Prohledávání kořenového stromu do hloubky implementace pomocí zásobníku šetření pamětí místo toho, aby každý vrchol měl ukazatele i na předchůdce, tak si zásobník 'pamatuje' pouze cestu z kořene do aktuálního vrcholu 1) do zásobníku vložíme kořen r 2) dokud není zásobník prázdný, opakujeme následující operace: 2a) odebereme vrchol zásobníku v 2b) zpracujeme vrchol v 2c) do zásobníku uložíme všechny syny v Prohledávání kořenového stromu do šířky implementace pomocí fronty 1) do fronty umístíme kořen r 2) dokud není fronta prázdná, opakujeme následující operace: 2a) odebereme první prvek fronty v 2b) zpracujeme vrchol v 2c) na konec fronty uložíme všechny následníky v Prohledávání grafů systematické prohledávání neorientovaných grafů tak, aby byla každá hrana probrána právě 1 Prohledávání neorientovaného grafu máme graf G, zavedeme množiny U (dosud neprobrané hrany), N (dosud neprobrané vrcholy), D (probrané vrcholy, z nichž vedou neprobrané hrany) 1) Inicializace N = množina vrcholů grafu G, U = množina hran grafu G, D = 0 2) Test ukončení D je prázdné (v tomto bodě vždy), je- li N prázdné, algoritmus končí 3) Volba prvního vrcholu v komponentě zvolíme v z množiny N, vyjmeme jej a položíme D = {v} 4) Volba počátku probírané hrany zvolíme libovolně w z D 5) Test použitelnosti w jestliže neeistuje hrana, vycházející z w a ležící v U, vyjmeme w z D, pokud je pak D prázdné, jdeme do bodu 2, jinak do bodu 4. Pokud hrana eistuje, jdeme do bodu 6. 6) Průchod hranou zvolíme hranu h = {w, z}, která vychází z w a leží v U. Projdeme hranou h od w do z, vyjmeme ji z U a pokud je z v N, vyjmeme jej a vložíme do D. Následuje bod 4 rychlost O(n+m), kde n je počet vrcholů a m je počet hran použití množiny U zabraňuje vícenásobnému probírání hran strana 14

Prohledávání grafů způsob průchodu závisí na implementaci D: prohledávání do hloubky D je implementována jako zásobník prohledávání do šířky D je implementována jako fronta stromy a lesy prohledávání hrany (w, z) (orientované ve směru průchodu), kterými se došlo v bodě 6 do vrcholu z, který ještě nebyl dosažen, se nazývají základní základní orientované hrany vytvářejí v každé komponentě grafu strom prohledávání, v nesouvislém grafu tyto stromy tvoří les prohledávání vlastnosti: Je-li h(w, z) hrana souvislého grafu G, pak ve stromě prohledávání grafu G do hloubky je jeden z vrcholů w a z přímým nebo nepřímým následníkem toho druhého Cesta z vrcholu v do vrcholu w v souvislém grafu G, která obsahuje nejmenší počet hran, je udána orientovanou cestou z v do w ve stromu prohledávání grafu G do šířky, která začíná ve vrcholu v. Tzn tu z cest s minimálním počtem hran lze určit v čase úměrném počtu vrcholů a hran Prohledávání orientovaného grafu modifikace algoritmu pro prohledávání neorientovaného grafu U je množina orientovaných hran grafu G, u vrcholu w testujeme, zda je počátečním vrcholem některé z hran v U i orientovaný graf lze prohledávat do šířky a do hloubky Backtracking, metoda větví a mezí časté techniky při návrhu kombinatorických algoritmů obecné zadání dány množiny X 1.. X N, dále množina A, která je podmnožinou X 1.. X N, jejíž prvky se nazývají přípustná řešení, a nakonec účelová funkce F, která každému prvku A přiřazuje reálné číslo. Cílem je nalézt přípustné řešení z množiny A s minimální hodnotou F řešení se hledá jako posloupnost částečných řešení ( 1), ( 1, 2),.., ( 1,.., N) mnohdy je obtížné poznat, která částečná řešení vedou k přípustnému, tak se zahrnují všechna řešení, u kterých není rozvinutí do řešení přípustného evidentně vyloučeno jsou dány množiny A 1,.. A N = A, kde A i jsou přípustná částečná řešení, formálně se přidává A 0 obsahující prázdnou posloupnost.. strom problému kořenový strom, jehož vrcholy jsou přípustná částečná řešení, koncovými vrcholy jsou přípustná řešení z A a částečná přípustná řešení, která nelze prodlužovat základ backtrackingu prohledávání stromu do hloubky, postupné vybírání řešení s minimální hodnotou F strom problémů je veliký snažíme se nalézt částečná řešení, která jako neprespektivní nebudeme prodlužovat princip máme D (dolní) a H (horní) odhad hodnoty účelové funkce minimálního přípustného řešení takové že: pro každé přípustné řešení je D F( 1,.., N) a eistuje alespoň jedno přípustné řešení, pro něž F( 1,.., N) H pro částečná řešení lze většinou stanovit dolní odhad hodnoty účelové funkce po prodloužení F 1 ( 1) F 2 ( 1, 2).. F N ( 1,.., N) = F( 1,.., N) je-li nalezeno přípustné řešení ( 1,.., N), pak: je-li F( 1,.., N) = D lze skončit, F je optimální strana 15

Prohledávání grafů je-li F( 1,.., N) < H H lze zpřesnit (zmenšit) je-li F( 1,.., N) H, pak je neúčelné pokračovat v rozvíjení už znám lepší řešení, tohle se může jen zhoršit Úlohy řešitelné v polynomiálně omezeném čase úlohy, pro něž jsou známé algoritmy, které zpracovávají v dostatečně krátkém čase i velká vstupní data rychlost algoritmu je uspokojivá i v nepříznivém případě Cesty v grafech předpokládáme orientovaný graf, orientované hrany, orientované cesty délka cesty v grafu je rovna součtu ohodnocení všech hran této cesty délka nesouvisí s počtem hran cesty, nemusí ani znamenat skutečnou vzdálenost vzdálenost z vrcholu u do vrcholu v je délka nejkratší cesty z u do v, pokud cesta neeistuje, délka je inf vdálenost vrcholu do sebe samého je 0 základní úlohy: 1. pro dané vrcholy u, v určit vzdálenost cesty z u do v 2. pro daný vrchol u nalézt vzdálenosti z u do každého vrcholu grafu 3. pro daný vrchol v nalézt vzdálenosti z libovolného uzlu do v 4. určit vzdálenosti mezi všemi dvojicemi uzlů v grafu úlohy 2 a 3 jsou vzájemně převoditelné, řešení úlohy 1 zahrnuje i řešení úloh 2 a 3, rozdíl při určení hledané vzdálenosti lze přerušit omezující předpoklady: buď jsou délky všech cest nezáporné anebo se jedná o acyklický graf jsou-li délky všech cest rovny jedné, pak lze minimální cestu nalézt pomocí procházení do šířky, pokud je vyšší procházení do šířky nestačí Dijkstrův algoritmus algoritmus pro určení vzdáleností z daného vrcholu nezáporně hranově ohodnoceného grafu (řešení úloh 1, 2, 3) vstup: nezáporně ohodnocený orientovaný graf G a jeho vrchol u cíl: pro každý vrchol v grafu G určit vzdálenost z u do v (d v) proměnné: M množina vrcholů, pro které není určeno d v pro každý vrchol v je udán vrchol V v, který je předposledním vrcholem nejkratší cesty z u do v a neprochází vrcholy množiny M L vw přímá vzdálenost z vrcholu v do vrcholu w 1. Inicializace: je-li v = w, pak L vw = 0 je-li (v, w) hrana G, pak L vw = délka hrany (v, w) jinak L vw = inf M množina vrcholů G mimo u d u = 0, V u = u je-li v vrchol z G různý od u, položíme d v = L vw a je-li d v < inf, položíme V v = u 2. Test ukončení je-li M prázdná, konec výpočtu 3. Určení d v pro další vrchol z M vybereme vrchol s nejmenším d v, je-li jich více, pak libovolný. Pokud je d v rovno inf, strana 16

Úlohy řešitelné v polynomiálně omezeném čase konec výpočtu, jinak vyjmeme v z M 4. Aktualizace d w a V w. je-li v vrchol vybraný v bodě 3, pak pro každý vrchol w ležící v M provedeme (v případě, že platí d v + L vw < d w) příkazy V w = v, d w = d v + L vw 5. Skok do bodu 2 algoritmus pracuje v čase O(n 2 ) krok 1 čas O(n 2 ), kroky 2-5 provedeny maimálně n - 1 krát (pokaždé ubyde alespoň jeden vrchol) algoritmus lze použít i pro řešení úlohy 4 určit vzdálenosti pro každý vrchol, vhodnější jsou jiné metody: Floydův algoritmus pro matici nejkratších cest vstup: nezáporně ohodnocený orientovaný graf G s vrcholy v 1.. v N cíl: pro každou dvojici i, j určit d ij, vzdálenost z v i do v j 1. Inicializace: Pro každé i, j takové, že i je větší nebo rovno jedné, j je menší nebo rovné n, položme: pokud i=j, d ij = 0 je-li (v i, v j) hrana grafu G, pak d ij je délka hrany (v i, v j) pokud se i nerovná j a (v i, v j) není hrana grafu G, pak je d ij rovno inf 2. cyklus pro k = 1.. n 2a. pro každou dvojici i, j takovou, že i je větší nebo rovno jedné, j je menší nebo rovné n a i není rovno j, položme: d ij = min (d ij, d ik + d kj) algoritmus pracuje v čase O(n 3 ) Topologické uspořádání grafů pro obecně ohodnocený acyklický graf nelze použít Dijkstrův algoritmus mohl by dávat špatné výsledky postup vytvoříme topologické uspořádání grafu: vrcholy se seřadí do posloupnosti v 1.. v N tak, aby pro každou orientovanou hranu (v i, v j), bylo i < j algoritmus: vstup: orientovaný graf G s n vrcholy proměnné: pro každý vrchol v je definováno číslo C v počet dosud nevybraných vrcholů, z nichž vede hrana do vrcholu v M množina dosud nevybraných vrcholů, pro které je C v = 0 1. určení C v pro každý vrchol v položíme C v = 0, pro každou hranu (v, w) inkrementujeme C w o 1 2. inicializace M do M uložíme všechny vrcholy, které stále mají C v = 0 3. inicializace čítače i = 0 4. test cykličnosti pokud je M prázdná a i < n, pak výpočet končí G obsahuje cyklus a tím pádem neeistuje hledané pořadí vrcholů 5. určení dalšího vrcholu zvolíme libovolný vrchol z M, odebereme jej z M, inkrementujeme čítač o 1 a vybraný vrchol v označíme jako v i 6. test ukončení je-li i = n, výpočet končí (pořadí je určeno) 7. aktulaizace C w a M pro každou orientovanou hranu (v i, w) zmenšíme C w o 1, pokud je C w = 0, přidáme vrchol w do množiny M 8. skok na bod 4 strana 17

Úlohy řešitelné v polynomiálně omezeném čase algoritmus pracuje v čase O(n + m), n je počet uzlů, m je počet hran Hledání etremálních cest v acyklickém grafu vstup: hranově ohodnocený orientovaný graf G a jeho vrchol u cíl: ověřit acykličnost grafu G, a je-li G acyklický, určit délky nejkratších respektive nejdelších cest z vrcholu u do všech ostatních vrcholů G proměnné: pro každý vrchol číslo d v 1. provedeme topologické uspořádání podle předchozího algoritmu do posloupnosti v 1.. v N, pokud neeistuje výpočet končí 2. inicializace d u = 0 je-li (u, v i) hrana v G, pak d vi = délka (u, v i) pokud se u nerovná v i a (u, v i) není v G, pak: d vi = inf, hledáme-li nejkratší cestu d vi = -inf, hledáme-li nejdelší cestu 3. určování d v předpokládáme, že u = vp pro i = p, p+1,.., n provedeme pro každou hranu (v i, v j) začínající ve v i tyto operace: d = délka hrany (v i, v j) d vj = min(d vj, d vi + d), hledá-li se nejkratší cesta d vj = ma(d vj, d vi + d), hledá-li se nejdelší cesta algoritmus pracuje v čase O(n + m), n je počet uzlů, m je počet hran Minimální kostra grafu ohodnocení hrany grafu nazveme cenou cílem hledání minimální kostry grafu je nalézt systém hran, které navzájem propojí všechny vrcholy grafu co nejlacinějším způsobem tzn hledáme podgraf H grafu G, který má tutéž množinu vrcholů, je souvislý a má nejmenší možný součet cen svých hran S 5 13 1 12 Y 11 6 8 9 Z 2 4 U 3 X 10 7 W Obrázek 14: Minimální kostra grafu V Borůvkův-Choquetův-Kruskalův algoritmus princip: hrany grafu se uspořádají neklesajícím způsobem podle svých cen, poté se v tomto pořadí probírají a do vytvářeného grafu H se přidají ty z nich, které nezpůsobí vznik kružnice s hranami, které již v grafu H leží strana 18

Úlohy řešitelné v polynomiálně omezeném čase vstup: kladně ohodnocený souvislý neorientovaný graf G cíl: najít minimální kostru H grafu G pomocná proměnná: faktorová množina na vrcholech grafu G 1. uspořádání hran hrany G se uspořádají podle ceny neklesajícím způsobem 2. inicializace V(H) = V(G), E(H) = prázdná, faktorová množina vyjadřuje rozdělení V(H) do jednoprvkových množin 3. přidání hrany hrany G se probírají v pořadí určeném bodem 1 a pro každou hranu h = (u, v) se provedou následující operace: provedením FIND(u) a FIND(v) ve faktorové množině se určí komponenty U, V grafu H, v nichž leží vrcholy u a v a pokud se U nerovná V, přidá se h do E(H) a provede se UNION(U, V) algoritmus pracuje pro graf s n vrcholy a m hranami v čase O(m.log n). časově nejnáročnější je uspořádání hran Jarnikův-Primův algoritmus může být výhodnější pro grafy s velkým počtem hran (řádově n 2 ) provedením i rychlostí se podobá Dijkstrovu algoritmu vstup: kladně ohodnocený graf G cíl: nalézt minimální kostru H pomocné proměnné: M množina vrcholů dosud nepokrytých H V v pro každý vrchol v, proměnná je buď nedefinovaná, nebo rovna vrcholu, ke kterému byl v napojen d v v případě eistence V v je rovno délce hrany spojující v a V v 1. Inicializace Zvolíme libovolný vrchol v grafu G. Do V(H) vložíme u, E(H) = prázdná, M = V(G) bez u pro každý vrchol v z množiny M provedeme: je-li (u, v) hrana grafu G, pak V v = u, d v = ohodnocení (u, v), jinak je V v nedefinováno a d v = inf 2. Test ukončení Je-li množina M prázdná, výpočet končí 3. Určení další hrany H Zvolme prvek v množiny M, pro který je d v minimální. Přidáme v do V(H), hranu (v, V v) do E(H) a vyjmeme v z M 4. Aktualizace d w a V w Pro každý vrchol z M provedeme: je-li (v, w) hrana grafu G vycházející z vrcholu v, a její ohodnocení je menší než d w, pak položímke V w = v, d w = ohodnocení (v, w) 5. skok na bod 2 podoba s Dijkstrovým algoritmem d v není vzdálenost z v do u, ale z v do nejbližšího vrcholu grafu H (čemuž je přizpůsobeno V v) algoritmus pracuje v O(n 2 ) Obecné schéma hledání minimální kostry vstup: kladně ohodnocený graf G cíl: nalézt minimální kostru H pomocné proměnné: podgraf L grafu G neobsahující kružnice (les) 1. Inicializace V(L) = V(G), E(L) = 0 2. Test ukončení Je-li L strom, položíme H=L a výpočet končí 3. Volba komponenty Zvolme libovolně komponentu C grafu L 4. Určení nejbližší komponenty Z hran tvaru (u, v), kde u je z C a v ne, vybereme hranu s minimálním ohodnocením. strana 19

Úlohy řešitelné v polynomiálně omezeném čase Jako D označíme komponentu, ve které leží vrchol v zvolené hrany 5. Spojení komponent Hranu vybranou v bodě 4 přidáme do E(L) dojde ke spojení komponenty C, D grafu L v jednu 6. skok na bod 2 výsledek jedna z komponent L je hledaná kostra H, další komponenty jsou jednoprvkové strana 20