DIMA - Teorie grafů



Stromy

Teorie

Jedním ze základních typů grafů jsou takzvané stromy. Jedná se o souvislé grafy bez kružnic. I přes svou „zdánlivou“ jednoduchost mají stromy bohatou strukturu a mnoho aplikací, například v datových strukturách.

Definice stromu

Strom je souvislý graf, neobsahující kružnici (≈ acyklický souvislý graf).

Strom obsahující pouze jeden vrchol, nazýváme triviálním stromem. Strom, který obsahuje alespoň dva vrcholy, nazveme netriviálním stromem.

Pozn.: Strom označujeme písmenem T, z anglického slova tree.

Definice listu / vnitřního vrcholu

Nechť T=(V,E) je netriviální strom. Vrchol vV stupně 1 nazýváme listem stromu T. Vrchol uV stupně většího než jedna nazýváme vnitřním vrcholem stromu T.

Věta (o listu):

Každý netriviální strom obsahuje list.

Věta (o listech):

Každý netriviální strom T má alespoň dva vrcholy stupně 1 (listy).

Důkaz:

Nechť vrcholy v0,v1,v2,...,vk jsou vrcholy nějaké nejdelší cesty PT. Délka cesty P je k. (Využíváme předpoklad, že T je konečný graf.) Pak tvrdíme, že degTv0=degTvk=1, v opačném případě by existovala:

  • hrana {vi,vs}, i∈{0,k}, vsP, s∈{1,2,...,k-1}, což by vedlo k existenci kružnice, a to by byl spor s tím, že T je strom
  • hrana {vi,vs}, i∈{0,k}, vsP, což by vedlo k existenci cesty =P∪{vi,vs} délky k+1, a to by byl spor s nejdelší cestou P
  • degTvi=0, i∈{0,k}, pak T obsahuje izolovaný vrchol a není souvislý, což je spor s tím, že T je strom.

V každém případě dojdeme ke sporu, proto degTv0=degTvk=1.∎

Pro stromy platí následovní tvrzení:

Tvrzení (o odebrání listu ze stromu):

Nechť T=(V,E) je strom, degv=1∧vV(T). Pak T-v je opět strom.

Důkaz (E.Milková:Problém minimální kostry):

Zřejmě graf T'=T-v neobsahuje kružnici. Zbývá dokázat, že graf T' je souvislý graf. Nechť x,y jsou dva libovolné vrcholy stromu T různé od vrcholu v a nechť Px,y je cesta z vrcholu x do vrcholu y ve stromu T. Cesta Px,y neobsahuje vrchol v, neboť cesta může obsahovat nejvýše dva vrcholy stupně jedna (koncové vrcholy cesty) a těmi by mohly být pouze vrcholy x a y. Cesta Px,y je tak celá obsažena i v grafu T' a graf T' je tudíž souvislý.

Postupným odtrháváním listů dostáváme z původního stromu stále menší a menší stromy, až nakonec obdržíme triviální strom.∎

Tvrzení (o přidaní hrany s vrcholem):

Přidáme-li k libovolnému vrcholu v stromu T=(V,E) hranu s vrcholem, dostaneme opět strom.

Důkaz (E.Milková:Problém minimální kostry):

Přidáním jednoho vrcholu a jedné hrany ke grafu nemůžeme zřejmě kružnici vytvořit. Zbývá dokázat, že graf T'=(V∪{w}, E∪{v,w}) získaný ze stromu T přidáním hrany {v,w}, vV, wV, bude souvislý. To však zřejmě plyne ze skutečnosti, že pro každé dva vrcholy x a y grafu T' různé od vrcholu w existuje cesta z x do y v grafu T' totožná s cestou z x do y ve stromu T. A cestu v grafu T' z libovolného vrcholu x do vrcholu w dostaneme prodloužením cesty z vrcholu x do vrcholu v ve stromu T o hranu {v,w}. A naopak cestu z vrcholu w do libovolného vrcholu xgrafu T' získáme připojením cesty z vrcholu v do vrcholu x ve stromu T k hraně {w,v}.

Vrchol w je zřejmě stupně 1, list nově vytvořeného stromu.∎

Příklad

Zjistěte, zda posloupnost (1,1,1,1,1,1,1,1,1,1,2,2,3,5) může být skóre stromu.

  1. Nejdřív zjistíme, zda to může být skóre grafu (použijeme větu o skóre, viz. Základní terminologie):
    D=(1,1,1,1,1,1,1,1,1,1,2,2,3,5)
    D´=(1,1,1,1,1,1,1,1,0,0,1,1,2) → D´=(0,0,1,1,1,1,1,1,1,1,1,1,2)
    D´´=(0,0,1,1,1,1,1,1,1,1,0,0) → D´´=(0,0,0,0,1,1,1,1,1,1,1,1) … je to skóre grafu, jde o graf se 4 izolovanými vrcholy a 4 hrany
  2. Teď zjistíme, zda to může být strom, použijeme vztah pro vrcholy a hrany m = n - 1:

    Zjistíme počet vrcholů a hran ze skóre: n=14 , m=11. Počet hran zjistíme ze vztahu v V deg G v = 2 m

    Aby to byl strom, musí platit: 11 = 14 - 1, tento vztah neplatí, proto to nemůže být skóre stromů.

Definice opadaného podstromu:

Nechť T=(V,E) je strom. Graf, který dostaneme ze stromu T odebráním všech listů stromu T, nazýváme opadaný podstrom stromu T.

Definice opadávání stromu:

Nechť T=(V,E) je strom. Nechť T1 je opadaný podstrom stromu T, T2  opadaný podstrom stromu T1,...,T´=Tk opadaný podstrom stromu Tk-1. Pak říkáme, že graf  vznikl postupným opadáváním stromu T.

Definice centra a bicentra:

Nechť T=(V,E) je strom a nechť graf =(V´,E´), 1≤||≤2, vznikl postupným opadáváním stromu T. Má-li graf  pouze jeden vrchol, nazýváme tento vrchol centrum stromu T, má-li graf  dva vrcholy, pak říkáme, že tyto dva vrcholy tvoří bicentrum stromu T.

Příklad

Určete v grafu centrum/bicentrum.

strom

Provedeme opadávání stromu, tj. budeme postupně odebírat listy stromu až zůstane jeden nebo dva vrcholy.

bikořen

Vrcholy d a h jsou bicentrum grafu.

Tvrzení o odebrání a přidaní vrcholu zviditelňují vztah mezi počtem vrcholů a počtem hran ve stromu.

Tvrzení:

Pro každý obyčejný graf G=(V,E) platí: Jestliže G je strom, pak |V|=|E|+1.

Je tomu ale také naopak? Tj. zajímá nás, zda platí obrácené tvrzení.

Opačné tvrzení neplatí, viz následující graf:

Graf

Další, čeho si můžeme při prohlížení obrázků stromů všimnout, je to, že každá hrana stromu je most. Není to tak překvapivý závěr, když si uvědomíme, že strom je graf bez kružnic.

Příklad

Nechť graf G je souvislý graf, který má 12 vrcholů stupně 1, tři vrcholy stupně 2 a čtyři vrcholy stupně 5. Určete a zdůvodněte, zda graf G je či není strom.

Napíšeme si skóre grefu. To tedy je - (1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,5,5,5,5). Z uvedeného vyplývá, že graf má 19 vrcholů a 19 hran. Podle tvrzení: |V|=|E|+1 by ale strom měl mít o jeden vrchol více, než hran, což zde neplatí. Z tohoto důvodu se nejedná o strom.

Tvrzení:

Pro každý obyčejný graf G=(V,E) platí: Jestliže G je strom, pak každá jeho hrana je most.

Důkaz:

Dukaz sporem: ∃G =(V,E): G je strom, a zároveň existuje alespoň jedna hrana, která není most.

Existuje alespoň jedna hrana, která není most. Označme hranu e=(x,y) ⇒(definice mostu)⇒ G-e má stejný počet komponent jako G (komponenta, která obsahuje e je po odebrání hrany e opět souvislá) ⇒(definice souvislosti)⇒ v G-e existuje cesta mezi vrcholy x a y, označme ji Pxy, pak ePxy je kružnice v G a dostáváme spor s tím, že G je strom (strom je graf souvislý bez kružnic). Negace neplatí, platí původní tvrzení.∎

Opět se nabízí otázka, zda platí i obrácené tvrzení, tj. zda graf, jehož každá hrana je most, je stromem. Pro zápornou odpověď se stačí podívat na následujíécí obrázek (všechny hrany jsou mosty a graf není strom):

Les

Výše uvedené poznatky plus několik dalších zformulujme do následující věty.

Věta (o ekvivalentních podmínkách):

Nechť T je grafn vrcholy a m hranami. Následující tvrzení jsou ekvivalentní:

  1. T je strom,
  2. mezi libovolnými dvěma vrcholy grafu T existuje právě jedna cesta ( matem. zápis ∀x,yV ∃!Px,y),
  3. T je souvislý graf a m=n-1,
  4. T je souvislý a každá jeho hrana je most,
  5. T neobsahuje kružnici a m=n-1,
  6. T neobsahuje kružnici a když libovolné 2 nesousední vrcholy v T spojíme hranou, získaný graf T má pravě jednu kružnici.

Důkaz:

vykonáme postupným ověřováním implikací: (1)⇔(2), (1)⇔(3), (1)⇔(4), (1)⇔(5), (1)⇔(6)

  • (1)⇒(2) - T je strom ⇒ ∀x,yV ∃!Px,y(∼ mezi libovolnými dvěma vrcholy grafu T existuje právě jedna cesta).

    Pro důkaz sporem předpokládejme, že platí: T je strom a zároveň existuje dvojice vrcholů mezi kterými buď cesta neexistuje, což však je spor s předpokladem, že strom je souvislý graf nebo mezi nimi existuje více cest, viz obrázek, což však je spor s předpokladem, že strom je graf bez kružnic.

    strom

  • (2)⇒(1) - ∀x,yV ∃!Px,yT je strom

    Z předpokladu ihned plyne, že T je souvislý graf.

    Pro důkaz druhé vlastnosti stromu, tedy toho, že v T neexistuje kružnice, budeme pro spor předpokládat, že platí: ∀x,yV ∃!Px,y a zároveň v grafu T alespoň jedna kružnice existuje. Označme C=(v0,e1,v1,...,vk-1,ek,v0) kružnici v T. Pak ale posloupnost (v0,e1,v1) a posloupnost (v0,ek,vk-1,...,v1) tvoří dvě cesty z vrcholu v0 do vrcholu v1, což je spor s předpokladem, že mezi každou dvojicí vrcholů, tedy i mezi v0 a v1, existuje právě jedna cesta.

  • (1)⇒(3) - T je strom ⇒ T je souvislý a platí vztah m=n-1

    Souvislost grafu T plyne přímo z předpokladu (T je strom).

    Platnost vztahu m=n-1 dokážeme MI (podle počtu vrcholů):

    1. Pro strom s 1 vrcholem (= triviální strom) platí: n=1, m=0 ... 0=1-1...vztah platí

      Pro strom s 2 vrcholy (= 1 hrana) platí: n=2, m=1 ... 1=2-1...vztah platí

    2. IP: Předpokládejme, že tvrzení je pravdivé pro stromy s méně než n vrcholy. Uvažujme nějakou hranu e={u,v}∈E(T). Tato hrana, podle předpokladu, tvoří jedinou cestu mezi vrcholy u a v, jinak by v stromu existovala kružnice. Teda v T-e není žádna cesta mezi u a v. Graf T má právě dvě komponenty, nechť jsou to T1 a T2. Nechť n1,m1 je počet vrcholů a hran v T1 a n2,m2 je počet vrcholů, hrán v T2. Pak máme:

      n=n1+n2

      m=m1+m2+1

      Protože n1<nn2<n, podle indukčního předpokladu máme:

      m1=n1-1∧m2=n2-1

      Pak m=m1+m2+1=n1-1+n2-1+1=n1+n2-1=n-1

  • (3)⇒(1) - T je souvislý a platí vztah m=n-1 ⇒ T je strom

    T je souvislý. K tomu, aby byl T strom, potřebujeme ještě dokázat, že T neobsahuje kružnici.

    Uděláme to sporem. Označme T0=T. A předpokládejme, že T0 obsahuje kružnici. Nechť T1=T0-e1, kde e1 je kružnicová hrana. Z předpokladu máme, že T0 je souvislý a podle tvrzení: Nechť graf G je souvislý a nechť obsahuje kružnici C. Pak graf G-e, kde e je libovolná hrana kružnice C, je také souvislý, je také T1 souvislý, T1n vrcholů a m-1 hran.

    Když T1 obsahuje kružnici a e2 je kružnicová hrana. Pak T2=T1-e2 je opět souvislý graf a má n vrcholů a m-2 hran. Tento postup opakujeme, až dokud nedostaneme graf Tp, který neobsahuje kružnici, je souvislý a má n vrcholů a m-p hran. Podle definice je Tp strom a podle předchozího tvrzení (1)⇒(3) platí: počet hran se rovná počet vrcholů mínus 1.

    > m-p=n-1

    Pro spor jsme předpokládali existenci kružnice, což znamená p≥1. Ale to se dostáváme do sporu s předpokladem, že m=n-1. Proto musí platit p=0, což znamená, že T neobsahuje kružnici. A podle definice je T strom.

  • (1)⇒(4) - T je strom ⇒ T je souvislý a každá jeho hrana je most

    Souvislost grafu T plyne přímo z předpokladu (T je strom).

    Pro důkaz druhé části tvrzení, tedy toho, že každá hrana T je most, předpokládejme pro spor, že graf T je strom a zároveňT existuje hrana e={v,w}, která není mostem. Jestliže hrana e není mostem, je zřejmé (viz definice mostu), že i graf T=e je souvislý a tudíž v něm existuje mezi vrcholy v,w cesta P. Cesta P je cestou mezi vrcholy v,w i v grafu T a spolu s hranou e tvoří v T kružnici, což je spor s předpokladem, že T je strom.

  • (4)⇒(1) - T je souvislý a každá jeho hrana je mostT je strom.

    K důkazu toho, že souvislý graf T, jehož každá hrana je most, je strom, potřebujeme pouze ukázat, že v grafu T neexistuje kružnice. Pro spor předpokládejme, že v T kružnice existuje. Pak ale vyjmutím libovolné hrany e ležící na této kružnici dostáváme dle tvrzení (Nechť graf G je souvislý a nechť obsahuje kružnici C. Pak graf G-e, kde e je libovolná hrana kružnice C, je také souvislý.) opět souvislý graf, což je spor s předpokladem, že hrana e je most.

  • (1)⇒(5) - T je strom ⇒ T neobsahuje kružnicim=n-1

    T neobsahuje kružnici plyne z definice stromu: strom je souvislý a neobsahuje kružnice.

    Vztah m=n-1 dokážeme MI (podle počtu vrcholu)

    1. n=1 ⇒ T je triviální strom ⇒ m=0∧0=1-1 ... platí

      n=2 ⇒ T je hrana ⇒ m=1∧1=2-1 ... platí

    2. Předpokládejme, že tvrzení je pravdivé pro stromy s méně než n vrcholů. Uvažujme nějakou hranu e={u,v}∈E(T). Tato hrana, podle předpokladu, tvoří jedinou cestu mezi vrcholy u a v, jinak by v stromu existovala kružnice. Teda v T-e není žádna cesta mezi u a v. Graf T má právě dvě komponenty, nechť jsou to T1 a T2. Nechť n1,m1 je počet vrcholů, hrán v T1 a n2,m2 je počet vrcholů, hrán v T2. Pak máme

      n=n1+n2

      m=m1+m2+1.

      Protože n1<nn2<n, podle indukčního předpokladu máme:

      m1=n1-1∧m2=n2-1

      Teda m=m1+m2+1=n1-1+n2-1+1=n1+n2-1=nspan>-1.

  • (5)⇒(1) - T neobsahuje kružnicim=n-1 ⇒ je strom

    K důkazu, že T je strom, ještě potřebujeme dokázat souvislost. Sporem:

    Nechť T není souvislý a T1,T2,...,Tp je p komponent grafu T s ni vrcholy a mi hranami v Ti, pro i=1,...,p. Potom m=m1+m2+...+mp a n=n1+n2+...+np.

    Každá komponenta Ti je bez kružnic (podle předpokladu), tedy je strom. Podle (3) máme mi=ni-1 pro všechny 1≤i≤p. Pak dostáváme

    m = i = 1 p m i = i = 1 p ( n i 1 ) = n p

    Dostáváme spor s předpokladem, že m=n-1, proto musí platit p=1. Tedy T má jedinou komponentu, tj. je souvislý. Protože T je souvislý a je bez kružnic, podle definice stromu, je T strom.

  • (1)⇒(6) - T je strom ⇒ T neobsahuje kružnici a každý graf vniklý z grafu T přidáním hrany, která spojuje libovolné dva vrcholy grafu T, které nejsou sousední, již kružnici obsahuje

    Neexistence kružnice v grafu T plyne přímo z předpokladu (T je strom). Nechť x,y jsou dva libovolné vrcholy stromu T, které nejsou sousední. Ze souvislosti stromu T víme, že z vrcholu y do vrcholu x existuje cesta, označme ji P. Přidáním hrany {x,y} ke stromu T dostáváme graf, který již kružnici obsahuje, kružnici (x,y,P).

  • (6)⇒(1) - T neobsahuje kružnici a každý graf vniklý z grafu T přidáním hrany, která spojuje libovolné dva vrcholy grafu T, které nejsou sousední, již kružnici obsahuje ⇒ T je strom

    K důkazu toho, že graf T je strom, potřebujeme pouze dokázat, že graf T je souvislý. Uvažujme pro spor, že kdyby graf T nebyl souvislý, existovaly by v něm alespoň dvě komponenty, označme je K1 a K2. Přidáním libovolné hrany {x,y}, kde xK1 a yK2, ke grafu T by nevznikl graf obsahující kružnici, neboť hrana {x,y} by byla zřejmě most. Ale to by byl spor s předpokladem.∎

Definice lesa:

Les je acyklický graf (graf, který neobsahuje kružnici).

les

Strom je komponenta lesa.

Tvrzení (vztah mezi vrcholy a hranami v lese):

Nechť G=(V,E) je les, který obsahuje k komponent, k≥1. Potom platí vztah:

|V|=|E|+k

Důkaz (E.Milková:Problém minimální kostry):

Označme Ti=(Vi,Ei), i=1,2,...,k, komponenty lesa G. Protože každá komponenta je strom, platí |Vi|=|Ei|+1, i=1,2,...,k. Odtud:

v = i = 1 k v i = i = 1 k ( E i + 1 ) = i = 1 k E i + k = E + k

Příklad

Kolik hran má les obsahující 7 vrcholů a 3 komponenty?

Podle předchozího tvrzení jednoduše spočítáme: 7 = |E| + 3 ⇒ |E| = 7 - 3 = 4. Les má tedy čtyři hrany.

Definice – kořenový strom/kořen stromu:

Dvojici (T,r), kde T=(V,E) je strom a rV pevně zvolený vrchol, nazýváme kořenový strom a vrchol r kořen stromu (T,r).

Kořenové stromy kreslíme do roviny do jednotlivých „vrstev“.

strom strom
strom T kořenový strom (T,c)

Následující názvosloví užívané pro kořenové stromy zcela přirozeně souvisí právě s tímto nakreslením do „vrstev“.

Definice - předchůdce/následník

Nechť (T,r) je kořenový strom. Jestliže vrchol x leží na cestě z kořene r do vrcholu y, pak říkáme, že x je předchůdce y a y je následník x. Jestliže navíc jsou x a y sousední vrcholy, nazýváme x přímým předchůdcem y a y přímým následníkem x.

Pokud chceme zdůraznit, že vrchol x je předchůdce vrcholu y, ale zároveň není jeho přímý předchůdce, řekneme, že x je nepřímý předchůdce y. Totéž platí pro pojem nepřímý následník.

Definice – vrstva, hloubka stromu

Nechť (T,r) je kořenový strom, v jeho libovolný vrchol a k délka cesty z kořene r do vrcholu v. Pak říkáme, že vrchol v leží v k-té vrstvě stromu (T,r) nebo též ve vrstvě číslo k. Hloubka stromu (T,r) je rovna největšímu číslu z čísel vrstev, ve kterých leží listy stromu (T,r).

Kořen r stromu (T,r) leží v nulté vrstvě, jeho přímý následníci v první vrstvě, atd. Kořen r je předchůdcem všech vrcholů stromu (T,r) a všechny vrcholy jsou následníky kořene r.

Příklad

Určete hloubku stromu z následujícího obrázku:

hloubka stromu

Jeliokož má strom tři vrstvy, je jeho hloubka 3.

Definice podstromu:

Nechť (T,r) je kořenový strom. Pak podgraf (T',v) stromu (T,r) obsahující vrchol v a všechny následníky vrcholu v, nazýváme podstrom stromu (T,r) s kořenem v.

Definice – binární strom, levý/pravý syn

Kořenový strom (T,r) nazýváme binární strom, jestliže každý vrchol stromu (T,r) má nejvýše dva přímé následníky, které nazýváme levý a pravý syn.

Definice - vrcholově ohodnocený binární strom

Binární strom, jehož každý vrchol je ohodnocen reálným číslem, nazýváme vrcholově ohodnocený binární strom.

Definice - binární vyhledávací strom

Vrcholově ohodnocený binární strom, ve kterém pro každý vrchol v platí, že ohodnocení vrcholů ležících v podstromu určeném levým (resp. pravým) synem vrcholu v není větší (resp. menší) než ohodnocení vrcholu v, nazýváme binární vyhledávací strom.

Příklad

Na obrázku níže určete, který graf je binární vyhledávací strom a který ne.

BVS příklad

  1. je binární vyhledávací strom
  2. není binární vyhledávací strom, protože vrchol 6 by musel být levý syn vrcholu 7
  3. je binární vyhledávací strom
  4. není binární vyhledávací strom, protože vrchol 6 by opět musel být levý syn vrcholu 7

Binární vyhledávací strom se využívá jako datová struktura, která umožňuje rychlé provádění operací MEMBER, INSERT, DELETE, MIN a MAX.

MEMBER – „zjištění, zda daný prvek leží nebo neleží v BVS - binárním vyhledávacím stromu“

MEMBER C, ohodnocení vrcholů dáno funkcí c, pomocná proměnná v není-li strom prázdný, v = kořen:

  1. je-li C=c(v), je v hledaný vrchol – konec
  2. je-li C<c(v) a v nemá levého následníka – konec (neúspěch)
  3. je-li C>c(v) a v nemá pravého následníka – konec (neúspěch)
  4. je-li C<c(v) a v má levého následníka – v = levý následník v
  5. je-li C>c(v) a v má pravého následníka – v = pravý následník v

INSERT – „vložení daného prvku do BVS“ (když chceme, aby byl BVS unikátní, je potřebné nejdřív provést operaci MEMBER)

INSERT C

podobné, v situaci b. nebo c. přidáme C jako nového následníka

Příklad

Uložte čísla 22,5,11,7,30,14,25,33,2,38,60 postupným prováděním operace INSERT do binárního vyhledávacího stromu.

insert

DELETE – „odstranění daného prvku z BVS“ (když nevíme, zda se prvek v BVS nachází, provedeme nejdřív operaci MEMBER)

MIN/MAX – „určení min/max v BVS“

MIN, MAX

provádíme operaci v = levý/pravý následník v tak dlouho, dokud následník existuje. Až následník nebude, v je extrém.

DELETE - odstranění uzlu

Zde nastává několik případů ke zvážení.

  • Odstranění listu: Odstranění uzlu bez potomků se jednoduše provede odstraněním uzlu ze stromu.
  • Odstranění uzlu s jedním potomkem: Provede se nahrazením uzlu uzlem potomka.
  • Odstranění uzlu se dvěma potomky: Nechť se odstraněný uzel nazývá N. Pak je hodnota uzlu N nahrazena nejbližší vyšší (nejlevější uzel pravého podstromu), nebo nižší hodnotou (nejpravější uzel levého podstromu). Takový uzel má nanejvýš jednoho potomka, lze jej tedy ze stromu vyjmout podle jednoho z předchozích pravidel. Obě možnosti ilustruje následující obrázek, kdy je ze stromu odstraněn uzel s klíčem 7. (V dobré implementaci je doporučeno obě varianty střídat, jinak dochází k narušení rovnováhy.)

odstranění uzlu

odstranění uzlu se dvěma potomky

Na následujícím obrázku můžeme vidět odstranění kořene:

odstranění kořene

odstraněšní kořene

Definice haldy:

Halda je vrcholově ohodnocený binární strom s pevně danou strukturou, jehož vrcholy jsou ohodnoceny celými čísly tak, že ohodnocení libovolného vrcholu není větší než ohodnocení kteréhokoliv z jeho následníků. Struktura haldy je pevně dána, je charakterizována následovně: každý vrchol haldy, který neleží v předposlední nebo poslední vrstvě, má dva následníky, v předposlední vrstvě následují zleva doprava nejprve vrcholy se dvěma následníky, pak případný vrchol mající jen levého následníka a pak vrcholy bez následníků.

halda

Halda se využívá jako datová struktura, která umožňuje rychlé provádění operací INSERT a EXTRACT - MIN.

Přidání vrcholu do haldy

Vrchol do haldy přidáme na její první volnou pozici. Tím ale můžeme narušit pravidlo, že v každém vrcholu je nižší číslo než v jeho potomcích. Musíme tedy vše pořádně zkontrolovat.

Odebírání kořene z haldy

Halda nám do kořene natlačí vždy nejnižší hodnotu. Co se nám bude při třídění velmi dobře hodit, je zbavení se této nejnižší hodnoty a získání druhé nejnižší atd. To uděláme jednoduše – prostě kořen vyhodíme a haldu jednoduše opravíme, aby to byla zase platná halda. Tak se nám následující minimální hodnota dostane do kořene. Pokud toto provedeme N krát, dostaneme postupně setříděnou posloupnost čísel, tedy to, co jsme chtěli.

Jak na to? Nejmenší prvek nemůžeme jen tak vyhodit, musíme na jeho místo něco dát. Protože budeme chtít haldu zkrátit, ideální by bylo dát tam poslední prvek. Na první místo tedy dáme poslední prvek haldy a haldu hned zkrátíme. Tím se nám ale mohla porušit opět pravidla, což musíme napravit.

Začneme tedy v kořeni, a pokud je kořen větší než některý ze dvou následovníků, vyměníme jej za toho menšího (aby ten druhý byl větší než jeho nový následovník a nerozbilo se nám tohle). Takto pokračujeme, dokud nedojdeme na nejnižší úroveň.

Řešený příklad

1. Přidejte vrchol s číslem 6 do haldy

halda

Krok 1

přidání vrcholu
Přidali jsme vrchol na první volnou pozici v poslední hladině. Tím se nám ale porušilo pravidlo, že předchůdce je menší než následovník. Prohodíme hodnotu v nově přidaném vrcholu a v jeho předchůdci.

Krok 2

přidání vrcholu
Vrcholy 6 a 16 jsme tedy prohodili. Nemohlo se nám rozbít pravidlo u druhého následovníka zeleného vrcholu (vrchol 39), ten byl větší než původní hodnota 16 a je tedy větší než nová hodnota 6, v zeleném vrcholu se hodnota zmenšila. Porušilo se nám ale pravidlo s předchůdcem zeleného vrcholu, 13 je větší než 6.

Krok 3

přidání vrcholu
Abychom to napravili, opět prohodíme, tentokrát vrcholy 13 a 6. Protože 6 je větší než 1, nic se nám nepokazilo a můžeme skončit.

Krok 4

hotovo
Takto vypadá halda po přidání nového vrcholu.

2. Odstraňte kořen z haldy

halda

Krok 1

odebrání
Místo kořene tedy dáme poslední prvek a haldu zkrátíme. Tím se nám ale porušila nerovnost, 16 je větší než 6.

Krok 2

odebrání
Prohodíme tedy 6 a 16, čímž ale máme problém o hladinu níž, protože 13 < 16.

Krok 3

hotovo
Opět tedy provedeme prohození a už je vše v pořádku.

3. Nechť graf G je obyčejný souvislý graf, který má 10 vrcholů stupně jedna, čtyři vrcholy stupně dva a čtyři vrcholy stupně čtyři. Určete a zdůvodněte, zda graf G je nebo není strom.

Krok 1

Zjistíme, zda je to skóre:
D=(1,1,1,1,1,1,1,1,1,1,2,2,2,2,4,4,4,4)
D´=(1,1,1,1,1,1,1,1,1,1,2,2,2,1,3,3,3) → D´=(1,1,1,1,1,1,1,1,1,1,1,2,2,2,3,3,3)
D´´=(1,1,1,1,1,1,1,1,1,1,1,2,2,1,2,2) … je to skóre, jde o graf, který obsahuje 6 hran a kružnici se 4 vrcholy.

Krok 2

Zjistíme, zda to může být strom: m = n - 1, n = 20, m = 17? 17 ≠ 20 - 1, není to skóre stromu.

Úlohy k řešení

1. Les má 2009 vrcholů a celkem 4 souvislé komponenty. Kolik má hran?

Výsledek

2005

2. Dokažte následující větu. Použijte důkaz sporem:

G=(V,E): Jestliže každá hrana v G je most, pak v G neexistuje kružnice.

Výsledek

Negace věty: ∃G=(V,E): Každá hrana v G je most a zároveň v G existuje kružnice.

Pokud každá hrana v grafu je most, pak je to buď strom nebo les. Les se skládá ze stromů. V definice stromu se říká, že je to graf, který neobsahuje kružnici.

Negace věty neplatí, platí tedy původní věta.

Poznámka: Zde by se dal použít i důkaz přímo.

3. Vyvraťte tvrzení:

G=(V,E): G je souvislý⇒každý vrchol grafu G leží na kružnici.

Výsledek

Pokusíme se dokázat obměněnou větu: ∀G=(V,E): Alespoň jeden vrchol grafu G neleží na kružnici⇒G není souvislý.

To není pravda, protože žádný vrchol ve stromu neleží na kružnici a přesto je to souvislý graf. Jelikož neplatí obměněná věta, neplatí ani věta původní.

4. Vyvraťte tvrzení:

G=(V,E): každá hrana grafu G je most ⇒ G je strom

Výsledek

Negace: ∃G=(V,E): každá hrana grafu G je most ⇒ G není strom

Graf

Každá hrana grafu je most a přitom to není strom, protože to není souvislý graf. Platí negace, neplatí původní tvrzení.

5. Rozhodněte, zda posloupnost (1,1,1,1,2,3,3,4) může být skóre stromu. Své rozhodnutí zdůvodněte.

Výsledek

Podle skóre má graf osm vrcholů a osm hran. Nemůže to tedy být skóre grafu, protože pro strom platí: m = n - 1.

6. Určete dva stromy, které mají 7 vrcholů, mají stejné skóre, a přesto nejsou izomorfní.

Výsledek

Stromy

Skóre mají oba grafy (1,1,1,1,2,3,3) a nejsou izomorfní. V druhém grafu jsou vrcholy 3-3 sousední, v prvním ne.

Zde jsou další grafy:

GrafGraf

7. Kolik hran a kolik komponent má les, jehož skóre je (1,1,1,1,1,1,1,1,2,3,3,4)?

Výsledek

Pro les platí následující vztah: m = n - k, k je počet komponent, n=12, m=(1+1+1+1+1+1+1+1+2+3+3+4)/2=10.

10 = 12 - kk = 2. Graf má deset hran a dvě komponenty.

8. Dokažte sporem větu: Jestliže graf G je strom, pak graf G není hamiltonovský. (Nejprve správně zformulujte tvrzení pro důkaz sporem!)

Výsledek

Důkaz sporem:

Negace: ∃G = (V,E): G je strom, a zároveň je hamiltonovský.
G je hamiltonovský ⇒ G obsahuje hamiltonovskou kružnici, což je spor s tím, že G je strom (strom – souvislý graf bez kružnic). Neplatí negace, platí původní tvrzení.

Zdroje textů

  1. DIMA - diskrétní matematika, http://oliva.uhk.cz
  2. Milková, E.. Problém minimální kostry grafu, Hradec Králové: Gaudeamus, 2001
  3. Hliněný, Petr. Diskrétní Matematika (456-533 DIM), 2006
  4. Kovář, Petr. DISKRÉTNÍ MATEMATIKA a ÚVOD DO TEORIE GRAFŮ ( příklady k procvičení ), 2012