3. Prohledávání grafů

Podobné dokumenty
Hledáme efektivní řešení úloh na grafu

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

PROHLEDÁVÁNÍ GRAFŮ. Doc. RNDr. Josef Kolář, CSc. Katedra teoretické informatiky, FIT České vysoké učení technické v Praze

Matice sousednosti NG

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

Algoritmizace prostorových úloh

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

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.

ORIENTOVANÉ GRAFY, REPREZENTACE GRAFŮ

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

Úvod do teorie grafů

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

Grafové algoritmy. Programovací techniky

Jan Březina. 7. března 2017

Vzdálenost uzlů v neorientovaném grafu

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

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

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

Grafové algoritmy. Programovací techniky

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

Kolik existuje různých stromů na pevně dané n-prvkové množině vrcholů?

Algoritmy na ohodnoceném grafu

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

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

Kapitola 11. Vzdálenost v grafech Matice sousednosti a počty sledů

ALGORITMY A DATOVÉ STRUKTURY

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

07 Základní pojmy teorie grafů

GRAFY A GRAFOVÉ ALGORITMY

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

Dijkstrův algoritmus

Konstrukce relace. Postupně konstruujeme na množině všech stavů Q relace i,

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

V každém kroku se a + b zmenší o min(a, b), tedy vždy alespoň o 1. Jestliže jsme na začátku dostali 2

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

1 Teorie grafů. Základní informace

Stromy, haldy, prioritní fronty

TEORIE GRAFŮ TEORIE GRAFŮ 1

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

TGH04 - procházky po grafech

Konvexní obal a množina

Diskrétní matematika. DiM /01, zimní semestr 2018/2019

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

bfs, dfs, fronta, zásobník

8 Přednáška z

Úloha ve stavovém prostoru SP je <s 0, C>, kde s 0 je počáteční stav C je množina požadovaných cílových stavů

opakování reprezentace grafů, dijkstra, bellman-ford, johnson

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

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

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

Základy umělé inteligence

Úvod do informatiky. Miroslav Kolařík

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

Algoritmy a datové struktury

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

Stromové rozklady. Definice 1. Stromový rozklad grafu G je dvojice (T, β) taková, že T je strom,

NP-úplnost problému SAT

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

10 Přednáška ze

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

PROGRAMOVÁNÍ. Cílem předmětu Programování je seznámit posluchače se způsoby, jak algoritmizovat základní programátorské techniky.

1. Základní grafové algoritmy

Kreslení grafů na plochy Tomáš Novotný

Přijímací zkouška - matematika

1. Základní grafové algoritmy

Ukážeme si lineární algoritmus, který pro pevné k rozhodne, zda vstupní. stromový rozklad. Poznamenejme, že je-li k součástí vstupu, pak rozhodnout

"Agent Hledač" (3. přednáška)

TGH06 - Hledání nejkratší cesty

PQ-stromy a rozpoznávání intervalových grafů v lineárním čase

TGH06 - Hledání nejkratší cesty

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

Vrcholová barevnost grafu

2. úkol MI-PAA. Jan Jůna (junajan)

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

H {{u, v} : u,v U u v }

TGH10 - Maximální toky

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

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

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

Často potřebujeme hledat mezi dvěma vrcholy grafu cestu, která je v nějakém

popel, glum & nepil 16/28

Zadání a řešení testu z matematiky a zpráva o výsledcích přijímacího řízení do magisterského navazujícího studia od jara 2017

Binární vyhledávací stromy II

7. Geometrické algoritmy (sepsal Pavel Klavík)

8 Rovinnost a kreslení grafů

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

Union-Find problém. Kapitola 1

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

13. Třídící algoritmy a násobení matic

Lineární algebra : Násobení matic a inverzní matice

Diskrétní matematika. DiM /01, zimní semestr 2018/2019

1 Linearní prostory nad komplexními čísly

TGH09 - Barvení grafů

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

1. Toky, řezy a Fordův-Fulkersonův algoritmus

Definice 9.4. Nedeterministický algoritmus se v některých krocích může libovolně rozhodnout pro některé z několika možných různých pokračování.

= je prostý orientovaný graf., formálně c ( u, v) 0. dva speciální uzly: zdrojový uzel s a cílový uzel t. Dále budeme bez

Matematika III 10. přednáška Stromy a kostry

4 Pojem grafu, ve zkratce

Lineární algebra : Násobení matic a inverzní matice

Transkript:

3. Prohledávání grafů Prohledání do šířky Breadth-First Search BFS Jde o grafový algoritmus, který postupně prochází všechny vrcholy v dané komponentě souvislosti. Algoritmus nejprve projde všechny sousedy počátečního vrcholu, poté sousedy sousedů, atd... Díky tomuto způsobu procházení se někdy též nazývá algoritmusvlny,neboťsezpočátečníhovrcholušířípomyslnávlna,kterávkaždém kroku nalezne všechny uzly, které mají od počátečního vrcholu stejnou vzdálenost. Algoritmus se tedy skvěle hodí například pro hledání nejkratší cesty mezi dvěma vrcholy v grafu. Zatím předpokládejme, že graf, se kterým pracujeme, je orientovaný. Orientovanouhranu(u,v)zudo vbudemeobvyklezkracovatjako uv.proneorientované grafy bude vše obdobné. Prasečígrafaprůchodvlnyskrzněj Popisalgoritmu:NazačátkuvložímedofrontyQpočátečnívrcholv 0.DálesivpoliZ budeme pro každý vrchol pamatovat značku, zda jsme ho již navštívili(z[v] = 1), činikoli(z[v]=0).napočátkujsouvšechnyznačkynulové,jenvrchol v 0,kterýje označen a vložen do fronty. V každém dalším kroku pak zkoumáme frontu Q: pokud není prázdná, vezmemezníprvnívrchol uapodívámesenavšechnyvrcholy v,donichžzuvede hrana. Pokud sousedi ještě nejsou označení, tak je označíme a přidáme je do fronty k následnému zpracování. Toto opakujeme, dokud není fronta prázdná. Algoritmus: 1. Q {v 0 }. 2. Z[ ] 0,Z[v 0 ] 1. 3.Dokud Q opakujeme: 4. Vyzvedneme vrchol u z Q. 5. v: uv E: 6. Je-li Z[v]=0 Z[v] 1,přidáme vdo Q. Pozorování: BFS se zastaví. 1 2011-05-24

Důkaz: Zpracováváme jen vrcholy, které byly ve frontě. Každý vrchol se dostane do fronty maximálně jednou.(každý je označen max. jednou, značky neodstraňujeme.) Lemma:BFS(v 0 )označí vprávětehdy,kdyžexistujecestazv 0 do v. Důkaz: = :Platíjakoinvariantpoceloudobuběhualgoritmu.Todokážeme indukcí dle doby běhu algoritmu: Prvníkrokindukcejetriviální,neboťcestazv 0 do v 0 existujevždy.nynísi představme, že označujeme vrchol v přes hranu uv. To znamená, že vrchol u již muselbýtoznačený.dleindukčníhopředpokladutedyexistujecestazv 0 do u,a tudížpokudktétocestě přilepíme hranu uv,dostávámesledzv 0 do v,kterýlze vždy zredukovat na cestu. = Sporem:Nechťexistujeneoznačenývrchol vdosažitelnýponějakécestě z v 0.Uvažmenejkratšícestu(v 0,v): v 0,v 1...,v k = vavezměmeminimální itakové, že v i neníoznačený.víme,že i > 0(neboť v 0 jeurčitěoznačenužnazačátku algoritmu).tudíž v i 1 jeoznačený.přioznačeníjsmehoovšempřidalidofronty, takžejsmehozfrontymuselipozdějizasevyjmout.přitomjsmeovšemmuseli objevithranu v i 1 v i aoznačitvrchol v i,cožjespor. Nynítedyvíme,žealgoritmusjesprávný,amámepředstavuotom,jakfunguje. Podíváme-li se na něj podrobněji, zjistíme, že je hodně závislý na tom, jak si budeme graf pamatovat. Zanedlouho zároveň zjistíme, že nám reprezentace grafu v paměti znatelně ovlivní časovou(i paměťovou) složitost celého algoritmu. Reprezentace grafu v paměti Mějmenějakýorientovanýgraf Gsnvrcholyamhranami.Jakhoreprezentovat? Vrcholymůžemeočíslovatod1do n.prouloženíhranmámenavýběrhned několik způsobů. Předvedeme si je na grafu z následujícího obrázku: A B C Ukázkový graf D 1. matice sousednosti MaticesousednostiprografGnanvrcholechječtvercovámaticeAorozměrech n n,taková,že A i,j popisuje,jestlizvrcholu idovrcholu jvedehrana(a i,j =1) nebonikoliv(a i,j =0). Náš graf z obrázku výše by tedy v maticové reprezentaci vypadal takto: 2 2011-05-24

A B C D A 0 1 1 0 B 0 0 0 1 C 0 0 0 1 D 1 1 0 0 S touto maticí se pracuje velmi snadno, např. všechny sousedy i-tého vrcholu zjistíme jednoduše tak, že projdeme i-tý řádek matice a najdeme všechny jedničky. Má ovšem dvě zřejmé nevýhody: časovou a paměťovou složitost. Projití sousedů jednoho vrcholu trvá vždy Θ(n), projití sousedů pro všechny vrcholy(což potřebujeme vbfs)paktrváθ(n 2 ).Velikostmaticejevždy n n,bezohledunato,jak řídký jegraf.ugrafusmnohavrcholy,alesmalýmpočtemhran,tedybudemezbytečně plýtvat místem v paměti. Tato reprezentace je tedy nevýhodná především pro třídy grafů, jako jsou stromy, které mají n 1 hran, nebo rovinné grafy, které mají nejvýše 3n 6hran. Pozorování:BFSsreprezentacímaticísousednostiběžívčase:Θ(n 2 ). Důkaz:Užjsmesiuvědomili,žekaždývrcholsedostanedofronty Qnejvýšejednou. Pro každý vrchol ve frontě potřebujeme projít jeho sousedy, což nám trvá s reprezentacímaticísousednostiθ(n).vrcholůjecelkem n,tedyčasovásložitostjeθ(n 2 ). 2. seznam sousedů V matici sousednosti jsme museli procházet jak hrany, tak nehrany, což bylo zbytečné. Bylo by tedy výhodnější pamatovat si pro každý vrchol pouze jeho sousedy. To můžeme zařídit například jedním ze dvou následujících způsobů: Uchovávejme pole indexované vrcholy tak, že v každém prvku pole je ukazatel naspojovýseznamsousedůtohotovrcholu.tedy L(v)={w:vw E(G)}. Pokud se nám nebude chtít pracovat se spojovými seznamy, můžeme využít reprezentaci pomocí dvou polí. První pole V bude opět indexované vrcholy. V druhém poli Ebudouprokaždývrcholuloženijehosousedé.Vpoli V sipamatujemepro každývrchol iindexdopole E,kdezačínajíjehosousedé,anavícdodefinujeme,že V[n+1]=m+1.Ksousedůmvrcholu isepakjiždostanemesnadno nalezneme jenapozicích V[i],...,V[i+1] 1. V A B C D 1 3 4 5 7 E B C D D A B Znázornění polí seznamu sousedů NatutoreprezentaciužstačíprostorΘ(n+m),cožužje,narozdílodpředchozího kvadratického prostoru, docela příjemné. Pozorování: BFS s reprezentací seznamem sousedů běží v čase Θ(n + m). 3 2011-05-24

Důkaz: Algoritmus zpracuje každý vrchol nejvýše jednou a stráví jím čas lineární vpočtuodchozíchhran,tedyθ(deg (v)).časovásložitostceléhoalgoritmutedy činí: Θ n+ deg (v) =Θ(n+m). v V(G) 3. orákulum Další možností reprezentace je jakési orákulum, které nám na požádání řekne (spočítá), kam vedou hrany z daného vrcholu. To se hodí například tehdy, pokud graf vznikl výpočtem a nechceme plýtvat pamětí na jeho uložení. To se hodí například uužzmíněnéhohlavolamu Lloydovaosmička. Neorientované grafy Chceme-li reprezentovat neorientovaný graf, uložíme každou hranu v obou orientacích. Výpočet vzdáleností Abychom mohli využít toho, že algoritmus prochází vrcholy grafu ve vlně, k výpočtu vzdáleností, doplníme do něj dvě pomocná pole: D[v] bude říkat, na kolik krokůjsmesedo vdostali, P[v]budeobsahovatpředchůdcevrcholu v,totižvrchol u, zekteréhojsmesedo vdostalipohraněajehož D[u]=D[v] 1. Rozšířený algoritmus: 1. Q {v 0 }. 2. Z[ ] 0,Z[v 0 ] 1. 3. D[ ],D[v 0 ] 0. 4.Dokud Q opakujeme: 5. Vyzvedneme vrchol u z Q. 6. Prokaždývrchol v,dokteréhovedehranazvrcholu u: 7. Je-li Z[v]=0: 8. Z[v] 1,D[v] D[u]+1,P[v] u 9. Přidáme vdo Q. Definice:Fázeběhualgoritmu:Vefázi F 0 jezpracovávánvrchol v 0.Vefázi F i+1 jsou zpracováványvrcholyuloženédofronty Qběhemfáze F i. Pozorování:Každývrchol vdosažitelnýzv 0 seúčastníprávějednéfáze,atoté sčíslem D[v]. Lemma:PozastaveníBFSprovšechnyvrcholydosažitelnézv 0 platí,že D[v]je rovno d(v 0,v),totižvzdálenosti(délcenejkratšícesty)zv 0 do v. Důkaz:Nejprvesiuvědomíme,žekdykolivje voznačen,vededonějzv 0 nějaký sled délky v(indukcí, stejně jako jsme před chvílí dokazovali, že BFS projde všechny dosažitelnévrcholy).protonemůžebýt D[v]menšínež d(v 0,v). Sporem dokážeme, že nemůže být ani větší. Předpokládejme, že existuje nějaký špatný vrchol v,prokterýje D[v] > d(v 0,v).Nechť Pjeněkteráznejkratšíchcest 4 2011-05-24

zv 0 dov.zmožnýchšpatnýchvrcholůsivybermetakový,jehožpjenejkratšímožná. Jelikožprovrchol v 0 jezajisté D[v 0 ]=d(v 0,v 0 )=0,musíbýt vrůznýod v 0,takže má na P nějakého předchůdce u. Pro toho ovšem je vzdálenost spočítána správně: D[u]=d(v 0,u)=d(v 0,v) 1. Uvažujmenyní,cosestalovokamžiku,kdyjsme D[u]nastavili.Tehdyjsme u uložilidofronty,počasejsmehozfrontyzasevytáhliaprozkoumalijsmevšechny vrcholy,donížvedezuhrana.tedyivrcholv,takže D[v]vtomtookamžikunemůže býtvětšínež D[u]+1=d(v 0,v),atojespor. Víme tedy, že BFS správně spočítá délky nejkratších cest do všech vrcholů grafu. Pomocí předchůdců v poli P můžeme tyto cesty dokonce snadno rekonstruovat: předposledním vrcholem na nejkratší cestě do vrcholu v musí být vrchol P[v], jeho předchůdcem P[P[v]],...,aždovrcholu v 0. Předchůdci nám tedy kódují strukturu nejkratších cest do všech vrcholů. Můžemesenanědívattakénásledovně: Definice: Strom nejkratších cest je orientovaný strom s množinou vrcholů W = {v V(G) vdosažitelnýzv 0 }ahranami {(P(v),v) v W,v v 0 }. Pozorování:Kořenemstromunejkratšíchcestjevrchol v 0,cestavtomtostromuzv 0 do v(jednoznačněurčená,jetostrom)jepakjednouznejkratšíchcestzv 0 do v v původním grafu. Komponenty souvislosti V neorientovaných grafech můžeme BFS jednoduše použít na nalezení komponentsouvislosti.jižvíme,žebfsspuštěnézvrcholu v 0 projdeprávětyvrcholy, kteréjsouzv 0 dosažitelné,cožjsouvneorientovanémgrafupřesněty,kteréleží v téže komponentě. Stačí opakovaně spouštět BFS z dosud neoznačených vrcholů, pokaždé nám označí jednu komponentu. Algoritmus: 1.Provšechnyvrcholy v V(G)opakujeme: 2. Pokud je vrchol v neoznačený: 3. Spustíme BFS(v) a přiřadíme objevené vrcholy nové komponentě. To, co jsme o BFS zjistili, můžeme shrnout do následující věty: Věta:BFS(v 0 )včaseθ(n+m)spočte: vrcholydosažitelnézv 0 vzdálenostitěchtovrcholůod v 0 stromnejkratšíchcestzv 0 Prohledávání do šířky ale není jediný algoritmus, který nějak systematicky prochází graf. Jak už název kapitoly napovídá, budeme se zabývat ještě druhým algoritmem, prohledáváním do hloubky. Podívejme se, jak bude vypadat... Prohledávání do hloubky Depth-First Search DFS Tento algoritmus neprochází graf ve vlně jako BFS, nýbrž rekurzivně. Vždy se 5 2011-05-24

zanoříconejhloubějiaždolistuapakseokusvrátíaopětsesnažízanořit.vrcholy, ve kterých už byl, ignoruje. Opět uvažme nejdříve graf orientovaný. Následně si ukážeme, že v neorientovaném grafu budou pouze malé změny. Budeme používat podobné značení jako u BFS. V poli Z si budeme pamatovat, zdajsmevrcholjižnavštívili(hodnota1),nebone(hodnota0).abysenámalgoritmus lépe analyzoval, zavedeme proměnnou T, která bude fungovat jako hodiny vkaždémkrokualgoritmusezvětšíojedničku.dopolíinaoutsibudemeukládat čas prvního a posledního průchodu vrcholem. Algoritmus: 1.Inicializace: Z[ ] 0,T 1,in[ ]?,out[ ]? 2.DFS(v): 3. Z[v] 1,in[v] T, T T+1 4. Pro w: vw E(G): 5. Pokud Z[w]=0,zavolámeDFS(w) 6. out[v] T, T T+1 Věta:DFS(v 0 )včaseθ(m+n)označíprávěvšechnyvrcholydosažitelnézv 0. Důkaz: Korektnost dokážeme stejným argumentem, jako u BFS. V analýze časové složitosti si pak opět uvědomíme, že algoritmus zavoláme na každý vrchol nejvýše jednou(pak už je označený) a zpracováním vrcholu strávíme čas lineární v počtu hran, které z něj vedou. Celkem tedy prozkoumáme každou hranu nejvýše jednou a strávíme tím konstantní čas. Vyzkoušejme si DFS na grafu z následujícího obrázku: A 1,8 2,7 B C 3,4 D 5,6 Znázornění průběhu DFS a typů hran Graf je reprezentován tak, že v každém vrcholu jsou hrany uspořádány zleva doprava.číslauvrcholůukazujíjejichinaout. Můžemesivšimnout,žekrůznýmhranámseDFSchovárůzně.Poněkterých projde, jiné vedou do už prozkoumaných vrcholů, ale někdy do takových, ze kterých jsme se ještě nevrátili, jindy do už zpracovaných. Za chvíli uvidíme, že mohou nastat čtyřirůznésituace.nejsnázesepoznávajípodlehodnotinaout. Pozorování:Chodalgoritmumůžemepopsatposloupnostízávorek:( v budeznačit vstoupilijsmedovrcholuv (anastaviliin(v)),) v budižopuštěnívrcholu(nastavení 6 2011-05-24

out(v)). Tato posloupnost bude správně uzávorkovaná, čili páry závorek se nebudou křížit. Klasifikace hran: DFS dělí hrany na následující čtyři druhy. Hrana uv je: Stromová(nanašemobrázkuplná)pokudponíDFSprošlodoneoznačeného vrcholu. Všimněte si, že stromové hrany společně tvoří stromorientovanýodkořenev 0.(Jetostrom,jelikožvznikápostupným přidáváním listů.) Tomuto stromu se říká DFS strom. Zpětná(tečkovaná) taková hrana vede do vrcholu, do kterého jsme vstoupili, ale ještě jsme ho neopustili(to je vrchol, který máme při rekurzinazásobníku).odpovídáuzávorkování( v...( u...) u...) v. Dopředná(čárkovaná) vede do vrcholu, který jsme už opustili, ale kterýjepotomkemaktuálníhovrcholu:( u...( v...) v...) u. Příčná(čerchovaná) vede do vrcholu, který jsme už opustili, ale který ve stromu neleží pod aktuálním vrcholem. Musí tedy vést do vrcholů nalevo odstromovécestyzv 0 do u.napravototižleží vrcholy, které v okamžiku opouštění u ještě nebyly prozkoumané, takže hrana uv by se stala stromovou. Příčné hrany poznáme podle uzávorkování( v...) v...( u...) u. Jiné druhy hran nemohou existovat, probrali jsme totiž všechny možnosti,vjakémvztahumohoubýtpáryzávorek( u ) u a( v ) v. Kterého typu hrana je, můžeme tedy poznat podle značky Z[v] a podle hodnot inaoutvrcholů uav. Neorientované grafy: V neorientovaných grafech(každou hranu vidíme jako dvě orientované hrany) je situace daleko jednodušší. Buďto hranu objevíme jako stromovou(a v opačném směru ji vidíme jako zpětnou), nebo ji objevíme jako zpětnou (a v opačném směru se jeví dopřednou). Příčné hrany nemohou existovat, protože k nim opačná hrana by byla příčná vedoucí zleva doprava, což víme, že nenastane. 7 2011-05-24