IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

1. diel - Úvod do teórie grafov

Čože ?? Matematika ??
Počkajte, som programátor, toto nepotrebujem.
.<> graf - Grafové algoritmy

Chápem, že nudněji asi článok začínať nemôže. Skúsim vás však presvedčiť, že matematika je nielen celkom rozumný štandard, ale aj veľmi praktická zručnosť. Prečo zrovna grafy? Grafy sú totiž veľmi mocný nástroj, ako vyjadrovať nejaké vzťahy, ukladať dáta či prehľadávať stavový priestor. Na začiatok aspoň niektoré príklady využitia grafov:

  • Hľadanie najkratšej cesty
  • Usporiadanie adresárov v Linuxe
  • Určovanie maximálneho objemu dát, ktorý pretečie sietí
  • Farbenie politickej mapy sveta
  • Ukladanie objektov do stromovej štruktúry
  • a ďalšie ...

Graf

Čo je to vlastne graf? Ak máte v hlave lineárne a kvadratické funkcie, tak na ne (pre tentokrát samozrejme) zabudnite. Naše grafy vyzerajú úplne inak.

Definícia

Definícia pre normálnych ľudí: Majme nejaký graf, ktorý je tvorený pomocou bodiek a čiar. Bodky sú vrcholy grafu a čiary sú jeho hrany. Hrana musí byť zakončená vrcholom z každej strany, inak to nie je hrana.

Ak máte radi matematiku, definície vyššie vo formálnejšom štýle by bola: Majme graf G = (V, E), kde (V, E) je usporiadaná dvojica prvkov takých, že V je množina vrcholov grafu G a E je množina hrán, ktoré spájajú vrcholy z V.

Ak nie ste oboznámení s matematickým postupom, tak len drobná vysvetlivka. Táto definícia v podstate hovorí, že graf je pre nás dôležitý skrze to, že poznáme vrcholy a hrany. Všimnime si, že je (väčšinou) jedno, ako tento graf nakreslíme. To je veľmi dôležité, v počítači nemusíme mať súradnice bodov či nič podobné, stačí nám mať uložený zoznam vrcholov a hrán.

Dva grafy nižšie sú v podstate identické (tzv. Izomorfné). Keď sa pozorne pozriete, graf má päť vrcholov az každého vedú dve hrany. Přeskládáním prvého dostanete druhý:

izomorfné grafy - Grafové algoritmy

Čo môže byť vo vrcholoch a čo v hranách? To je na vás, grafy slúži vám, nie vy im.

Príklad č.1 - Rybičky

Ste riaditeľom obrovské firmy na dodávanie rybičiek v republike. Máte v počítači mapu najväčších miest. Medzi nimi povedú hrany, značiaci vaše logistické cesty. Každý vrchol (mesto) bude obsahovať počet obyvateľov, počet podnikov a veľkosť skladovacieho priestoru. Každá hrana obsahuje informácie o dĺžke cesty, pravdepodobnosti zápchy a mená vodičov, ktorí tieto cesty jazdia.

Príklad č.2 - Úradník

Ste vládny úradník a chcete si naplánovať dodanie všetkých hlasovacích lístkov čo najefektívnejšie. Vzhľadom na možné problémy s korupciou všetky lístkami tlačíte pri sebe v kancelárii. Prídu si ich vyzdvihnúť ozbrojené sily, ktoré ich budú prevážať na menšie a menšie úrady, až sa dostanú na obvodné políciu, ktorá je zanesie do schránky. Máte teda orientovaný graf, kde v hranách môžete uložiť informáciu o maximálnom množstve lístkov, ktoré sa zmestí do auta a počet vojakov strážiace konvoj. Vo vrcholoch môžu byť otváracej doby jednotlivých úradov a počet úradníkov.

Typy grafov

Teraz keď vieme, čo je to graf, pozrieme sa na najdôležitejšie typy grafov.

Cesta

Cesta je postupnosť vrcholov a hrán, kde existuje iba jeden spôsob, ako sa dostať z vrcholu V do vrcholu U:

Graf – Cesta - Grafové algoritmy

Čiže je to vždy cik-cak dvojica vrchol, hrana, vrchol, hrana ... Je to veľmi jednoduchá štruktúra, nič moc k videniu, pohnite!

Kružnice

Kružnice už je oveľa zaujímavejšie. Môžeme ju definovať ako cestu, ktorej koncové vrcholy spojíme do jedného:

Graf – Kružnica - Grafové algoritmy

Tak napríklad si nakreslite trojuholník. To je nádherná kružnice. Vyjdete z vrcholu raz hranou a vrátite sa druhou. Samozrejme väčšinou máme v grafe väčšej kružnice, ale to na kráse tohto matematického vtipy nič nemení.

Strom

Strom je absolútne kľúčové štruktúra, ktorej sa budeme venovať podrobnejšie. Môžeme ho zadefinovať ako súvislý graf bez kružníc čiže graf, kde medzi každými dvoma vrcholmi existuje cesta. Je to tiež graf, kde existuje jeden koreň (anglicky root), ktorý nemá žiadneho predka a môže obsahovať potomkov. Posledný vrchol, ktorý nemá žiadneho potomka, sa označuje pojmom list (anglicky leaf).

Napríklad štruktúra adresárov na Linuxe má presne takýto model. Máme koreň /, z ktorého potom vychádzajú adresára bin/, etc/, tmp/ a ďalšie ...

To vyzerá napr. Takto:

path - Grafové algoritmy

Tu uvádzam strom vývoja jazykov z latinčiny. O dôvod navyše učiť sa stromy. A latinčinu :)

Strom vývoja jazykov z latinčiny - Grafové algoritmy

Strom má však oveľa viac využitie. Je to dobrá dátová štruktúra. Druhov stromov je naozaj celá rada a všetky spĺňajú jeho definícii + niečo naviac. B-stromy, B + -stromy, červeno-čierne stromy, binárne stromy, haldy atď ...

No a to je k stromu všeobecne všetko. Prekvapení? Tie najjednoduchšie nápady môžu byť aj elegantné i geniálny.

Úplný graf

Úplný graf na n vrcholoch je graf, v ktorom je každý vrchol prepojený so všetkými ostatnými.

napr .:

úplný graf - Grafové algoritmy

Podgraf

Podgraf grafu G je opäť graf, ktorý získame odobratím hrán alebo vrcholov. Prázdna množina, tj. Graf s 0 vrcholmi je podgraf ľubovoľného grafu.

podgraf - Grafové algoritmy

Bipartitný grafy

Párny graf Gn,m je graf, ktorý môžeme rozdeliť na dve časti. Každá z týchto častí obsahuje len hrany do druhej, tj. Neexistuje hrana, ktorá by spájala dva vrcholy v jednej časti (partie).

párny graf - Grafové algoritmy

Ďalšie delenie

Grafy môžeme deliť aj nasledujúcimi spôsobmi.

Orientovaný vs. neorientovaný graf

Orientovaný graf je graf, kde máme pridanou informáciu o tom, odkiaľ kam hrana vedie. Predstavte si mesto. Ak urobíte graf ulíc pre chodcov, tak určite bude graf neorientovaný. Chodec si môže ísť tam aj späť, ako sa mu zapáči. Ak urobíte graf ulíc pre vodičov áut, v meste je iste veľa jednosmeriek, a dokonca aj cesty je v podstate jednosmerná.

Orientovaný a neorientovaný graf - Grafové algoritmy

Spojitý vs. prerušovaný

Ako názov napovedá, jedná sa o to, či z každého vrcholu existuje cesta do iného. Ak áno, graf je spojitý. Spojité grafy sa dobre ukladajú do počítača, s prerušovaným je už o máličko väčšiu réžia.

Reprezentácia grafov

Teraz, keď už máme nejakú predstavu, ako graf vyzerá a čo robí, ponúka sa posledná otázka, ako ho uložiť do núl a jednotiek v počítači. Na to nie je jednoznačná odpoveď. Záleží na type grafu a čo s nimi chcete robiť. Ukážeme si dve najčastejšie reprezentácie grafu. Odporúčam sa pozrieť do priložených zdrojových kódov, kde priamo ukazujem konkrétne typy grafov a ich reprezentáciu.

Matice súslednosti

Pre Neorientované grafy budeme mať symetrickú maticu, kde Aij = 1 ak Vi susedí s Vj a 0 ak nie. Pre orientované grafy to bude nesymetrické. To, že susedí Vi s Vj neznamená, že susedí Vj s Vi. Teda to, že viete, ako sa dostať z X do Y po jednosmerke neznamená, že to viete aj naspäť.

matica súslednosti - Grafové algoritmy

Reprezentácie v poli

Jednoduché typy grafov, napr. Binárne stromy, tj. Kde každý uzol má práve 2 potomkov okrem listov, sa dajú efektívne uložiť v obyčajnom poli. Viete, že vrchol na pozícii i má potomkov na pozíciu 2i + 1 a 2i + 2. Tu máme príklad binárneho stromu, konkrétne haldy. Halda je dátová štruktúra, kde predok stromu je vždy menší ako potomok (koreň je minimum).

Reprezentácia v poli - Grafové algoritmy

To je pre začiatok všetko. Samozrejme to nie je vyčerpávajúci popis všetkých možností. Hlavné je si uvedomiť jedno. Grafy nám dávajú nástroj, ako skladať dáta k sebe, nie povinnosť je trhať kamkoľvek môžeme. Striedmosť je hlavný cností programátora. Tak nech vám stromčeky kvitnú :)

strom - Grafové algoritmy

 

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 698x (3.71 kB)

 

Všetky články v sekcii
Grafové algoritmy
Preskočiť článok
(neodporúčame)
Náhodný priechod grafom, priechod do hĺbky a do šírky
Článok pre vás napísal Ondřej Michálek
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje teoretické informatice. Ve svých volných chvílích nepohrdne šálkem dobrého čaje, kaligrafickým brkem a foukací harmonice.
Aktivity