dýpt-fyrst leitun (dfs)
DESCRIPTION
Dýpt-fyrst leitun (DFS). Greining reiknirita vor 2002. Yfirlit. Almennt um net DFS leitun DFS: Skapalón Tímasetningar, flokkun hnúta/stika Tengdir þættir Tvítengdir þættir. Dæmi um net. Tölvunet, nærnet, víðnet, Internet Vensl xRy (x,y) E Rafrás Forgangur verkefna - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: Dýpt-fyrst leitun (DFS)](https://reader036.vdocuments.site/reader036/viewer/2022081503/56813098550346895d9677f9/html5/thumbnails/1.jpg)
Dýpt-fyrst leitun (DFS)
Greining reiknirita
vor 2002
![Page 2: Dýpt-fyrst leitun (DFS)](https://reader036.vdocuments.site/reader036/viewer/2022081503/56813098550346895d9677f9/html5/thumbnails/2.jpg)
Yfirlit
• Almennt um net
• DFS leitun
• DFS: Skapalón
• Tímasetningar, flokkun hnúta/stika
• Tengdir þættir
• Tvítengdir þættir
![Page 3: Dýpt-fyrst leitun (DFS)](https://reader036.vdocuments.site/reader036/viewer/2022081503/56813098550346895d9677f9/html5/thumbnails/3.jpg)
Dæmi um net
• Tölvunet, nærnet, víðnet, Internet
• Vensl xRy (x,y) E
• Rafrás
• Forgangur verkefna
• Stöður í skák
• Flug milli staða og tímalengd
• Tengslanet
![Page 4: Dýpt-fyrst leitun (DFS)](https://reader036.vdocuments.site/reader036/viewer/2022081503/56813098550346895d9677f9/html5/thumbnails/4.jpg)
Net birtast á ýmsan hátt
![Page 5: Dýpt-fyrst leitun (DFS)](https://reader036.vdocuments.site/reader036/viewer/2022081503/56813098550346895d9677f9/html5/thumbnails/5.jpg)
Ýmis net
• 12-flötungur • Möskvi
![Page 6: Dýpt-fyrst leitun (DFS)](https://reader036.vdocuments.site/reader036/viewer/2022081503/56813098550346895d9677f9/html5/thumbnails/6.jpg)
Gjafasendingar meðal meðlima ættbálks nokkurs í Afríku
![Page 7: Dýpt-fyrst leitun (DFS)](https://reader036.vdocuments.site/reader036/viewer/2022081503/56813098550346895d9677f9/html5/thumbnails/7.jpg)
Vensl tölvukerfa/mála/tölva
![Page 8: Dýpt-fyrst leitun (DFS)](https://reader036.vdocuments.site/reader036/viewer/2022081503/56813098550346895d9677f9/html5/thumbnails/8.jpg)
Kortalitun
• Kortagerðamenn til forna sáu að 4 litir virðast alltaf duga.
![Page 9: Dýpt-fyrst leitun (DFS)](https://reader036.vdocuments.site/reader036/viewer/2022081503/56813098550346895d9677f9/html5/thumbnails/9.jpg)
Ritháttur
• Hnútur (node, vertex)
• Leggur, stika (edge)
• Leið (path)
• Rás (cycle)
• Þáttur (connected component)
![Page 10: Dýpt-fyrst leitun (DFS)](https://reader036.vdocuments.site/reader036/viewer/2022081503/56813098550346895d9677f9/html5/thumbnails/10.jpg)
Dýpt-fyrst leitun
• Aðferð til að komast í gegnum völundarhús án minnis.
• Förum eins langt og við komumst, án þess að fara á sama stað tvisvar.– Þegar það er ekki hægt lengum, bökkum við.
![Page 11: Dýpt-fyrst leitun (DFS)](https://reader036.vdocuments.site/reader036/viewer/2022081503/56813098550346895d9677f9/html5/thumbnails/11.jpg)
B
D
G
EC
F
A
![Page 12: Dýpt-fyrst leitun (DFS)](https://reader036.vdocuments.site/reader036/viewer/2022081503/56813098550346895d9677f9/html5/thumbnails/12.jpg)
Hnútar litaðir Hvít-Grá-Svart
• Hvítur: Ekki enn heimsóttur
• Grár: Heimsóttur, en ekki kvaddur– Á stafla
• Svartur: Heimsóttur og kvaddur
Tímapúls fyrir hverja heimsókn og kveðju
• Komutími og kveðjutími hnúts
![Page 13: Dýpt-fyrst leitun (DFS)](https://reader036.vdocuments.site/reader036/viewer/2022081503/56813098550346895d9677f9/html5/thumbnails/13.jpg)
int dfs(node v)1. litur[v] = grár; aðrirgrannar = grannar[v]2. <Forvinnsla á hnút v>3. for each neighbor w of v do4. if (litur[w] == hvítur)5. <Byrjunarvinnsla með tréstiku vw>6. int w_skil = dfs(w, ...)7. <Endavinnsla á tréstiku vw (m w_skil)>8. else9. <Vinnsla með fram/bak/kross-stiku vw>10.<Eftirvinnsla á hnút v (þ.m.t. útreikningur á skil)>11.litur[v] = svartur; return skil
DFS skapalón
![Page 14: Dýpt-fyrst leitun (DFS)](https://reader036.vdocuments.site/reader036/viewer/2022081503/56813098550346895d9677f9/html5/thumbnails/14.jpg)
int dfsSweep(G)
1. <Núllstillum fylki litur með gildinu hvítur>
2. fyrir hvern hnút v í G gerðu
3. if (litur[v] == hvítur)
4. int vSkilagildi = dfs(v)
5. <Meðhöndla vSkilagildi>
6. Return skil
![Page 15: Dýpt-fyrst leitun (DFS)](https://reader036.vdocuments.site/reader036/viewer/2022081503/56813098550346895d9677f9/html5/thumbnails/15.jpg)
int dfs(IntList[] grannar, int[] litur, int v, ...)1. litur[v] = grár; aðrirgrannar = grannar[v]2. <Forvinnsla á hnút v>3. while (aðrirgrannar != nil)4. w = first(aðrirgrannar);5. if (litur[w] == hvítur)6. <Byrjunarvinnsla með tréstiku vw>7. int w_skilagildi = dfs(grannar, litur, w,...)8. <Endavinnsla á tréstiku vw (sem notar w_skilagildi)>9. else10. <Vinnsla með fram/bak/kross-stiku vw>11. aðrirgrannar = rest(aðrirgrannar)12. <Eftirvinnsla á hnút v (þ.m.t. útreikningur á skilagildi)>13. litur[v] = svartur; return skilagildi
![Page 16: Dýpt-fyrst leitun (DFS)](https://reader036.vdocuments.site/reader036/viewer/2022081503/56813098550346895d9677f9/html5/thumbnails/16.jpg)
Tímaflækja• Aðgerðir í dfsSweep() kosta O(n)• Kallað er á dfs(v) einu sinni fyrir hvern hnút
– v er hvítur í byrjun, og strax litaður grár– Þarmeð eru aðgerðir 1-3 og 12-13
• Aðgerðir 4-11 framkvæmdar O(m) sinnum– Einu sinni fyrir hvern granna hnúts v
– vV d(v) = 2m
• Samtals O(n+m)
![Page 17: Dýpt-fyrst leitun (DFS)](https://reader036.vdocuments.site/reader036/viewer/2022081503/56813098550346895d9677f9/html5/thumbnails/17.jpg)
Kafli: Tengdir þættir
• Fyrsta spurning varðandi net er kannski“Er netið samhangandi?”“Er hægt að komast frá hvaða hnút sem er í hvaða annan hnút sem er?”
• Þegar svarið er nei, þá viljum við finna þá hluta netsins sem eru samhangandi; slíkir hlutar kallast tengdir þættir (connected components)
![Page 18: Dýpt-fyrst leitun (DFS)](https://reader036.vdocuments.site/reader036/viewer/2022081503/56813098550346895d9677f9/html5/thumbnails/18.jpg)
int TengdirÞættir(IntList grannar, int n, int[] þáttur)
int[]litur=new int[n+1]; int v, þáttno;
<Núllstillum litur með gildinu hvítur>
þáttno=1
for (int v=1; v <= n; v++)
if (litur[v] == hvítur)
ccDFS(grannar, litur, v, þáttno, þáttur)
þáttno++
return
![Page 19: Dýpt-fyrst leitun (DFS)](https://reader036.vdocuments.site/reader036/viewer/2022081503/56813098550346895d9677f9/html5/thumbnails/19.jpg)
void ccDFS(IntList[] grannar, int[] litur, int v, int þáttnúmer, int[] þáttur)
1. litur[v] = grár; aðrirgrannar = grannar[v]2. <Forvinnsla á hnút v>: þáttur[v] = þáttnúmer3. while (aðrirgrannar != nil)4. w = first(aðrirgrannar);5. if (litur[w] == hvítur)6. <Byrjunarvinnsla með tréstiku vw>
7. ccDFS(grannar, litur, w, þáttnúmer, þáttur)8. <Endavinnsla á tréstiku vw>9. else10. <Vinnsla með fram/bak/kross-stiku vw>
11. aðrirgrannar = rest(aðrirgrannar)12. <Eftirvinnsla á hnút v>
13. litur[v] = svartur; return
![Page 20: Dýpt-fyrst leitun (DFS)](https://reader036.vdocuments.site/reader036/viewer/2022081503/56813098550346895d9677f9/html5/thumbnails/20.jpg)
4 6
2
5
3
8
1
78
![Page 21: Dýpt-fyrst leitun (DFS)](https://reader036.vdocuments.site/reader036/viewer/2022081503/56813098550346895d9677f9/html5/thumbnails/21.jpg)
boolean órásaðDFS(IntList[] grannar, int[] litur, int v)1. litur[v] = grár; aðrirgrannar = grannar[v]; 2. rás = FALSE3. while (aðrirgrannar != nil)4. w = first(aðrirgrannar);5. if (litur[w] == hvítur)6. órásaðDFS(grannar, litur, w)7. else if (litur[w] == grár)8. rás = TRUE9. aðrirgrannar = rest(aðrirgrannar)10.litur[v] = svartur; return rás
![Page 22: Dýpt-fyrst leitun (DFS)](https://reader036.vdocuments.site/reader036/viewer/2022081503/56813098550346895d9677f9/html5/thumbnails/22.jpg)
void topoDFS(IntList[] grannar, int[] litur, int v)1. litur[v] = grár; aðrirgrannar = grannar[v]2. while (aðrirgrannar != nil)3. w = first(aðrirgrannar);4. if (litur[w] == hvítur)5. topoDFS(grannar, litur, w)6. aðrirgrannar = rest(aðrirgrannar)
7. topoNo++; topo[v] = topoNo8. litur[v] = svartur; return
Global: int topoNo = 0; int[] topo;
Úttak: Topsort röðun á hnútum í DAG, gefið í topo[v].
![Page 23: Dýpt-fyrst leitun (DFS)](https://reader036.vdocuments.site/reader036/viewer/2022081503/56813098550346895d9677f9/html5/thumbnails/23.jpg)
dfs(node v)litur[v] = grár;tími++; komutími[v] = timefor each neighbor w of v do if (litur[w] == hvítur) foreldri[w] = v // Foreldrastika í DFStré dfs(w)tími++; brottfarartími[v] = timelitur[v] = svartur; return
Tímasetningar í DFS
![Page 24: Dýpt-fyrst leitun (DFS)](https://reader036.vdocuments.site/reader036/viewer/2022081503/56813098550346895d9677f9/html5/thumbnails/24.jpg)
B
D
G
EC
F
A
1
2
3/4
5/6
/7
8/9
/10
11
12/13
/14
![Page 25: Dýpt-fyrst leitun (DFS)](https://reader036.vdocuments.site/reader036/viewer/2022081503/56813098550346895d9677f9/html5/thumbnails/25.jpg)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
A
B
C
D
E
F
G
H
Líftímar hnúta
![Page 26: Dýpt-fyrst leitun (DFS)](https://reader036.vdocuments.site/reader036/viewer/2022081503/56813098550346895d9677f9/html5/thumbnails/26.jpg)
Líftímar hnúta
• Líftími[v] = [komutími[v], brottfarartími[v]]
• Ef v er forfaðir w, þá er inniheldur líftími[v] líftíma w.
• Ef hvorugur er forfaðir hins, þá skarast líftímarnir ekki.
![Page 27: Dýpt-fyrst leitun (DFS)](https://reader036.vdocuments.site/reader036/viewer/2022081503/56813098550346895d9677f9/html5/thumbnails/27.jpg)
Flokkun stika
vw er....
• bakstika, ef litur[w] == grár
• tréstika, ef litur[w] == hvítur,
• framstika, ef líftími[w] líftími[v]
• krossstika, ef líftími w var fyrir komutíma v
![Page 28: Dýpt-fyrst leitun (DFS)](https://reader036.vdocuments.site/reader036/viewer/2022081503/56813098550346895d9677f9/html5/thumbnails/28.jpg)
Kafli: Skurðhnútar
![Page 29: Dýpt-fyrst leitun (DFS)](https://reader036.vdocuments.site/reader036/viewer/2022081503/56813098550346895d9677f9/html5/thumbnails/29.jpg)
4 6
2
5
3
1
78
![Page 30: Dýpt-fyrst leitun (DFS)](https://reader036.vdocuments.site/reader036/viewer/2022081503/56813098550346895d9677f9/html5/thumbnails/30.jpg)
4 6
2
5
3
1
78
Skurðhnútar (articulation points)
![Page 31: Dýpt-fyrst leitun (DFS)](https://reader036.vdocuments.site/reader036/viewer/2022081503/56813098550346895d9677f9/html5/thumbnails/31.jpg)
4 6
2
5
3
1
78
Tvítengdir þættir (biconnected components)
![Page 32: Dýpt-fyrst leitun (DFS)](https://reader036.vdocuments.site/reader036/viewer/2022081503/56813098550346895d9677f9/html5/thumbnails/32.jpg)
4 6
2
5
3
1
78
Tvítengdir þættir (biconnected components)
![Page 33: Dýpt-fyrst leitun (DFS)](https://reader036.vdocuments.site/reader036/viewer/2022081503/56813098550346895d9677f9/html5/thumbnails/33.jpg)
• Ef v er skurðhnútur, þá fara allar leiðir frá öðrum endanum yfir á hinn endann í gegnum v
• Skoðum undirtré v í DFS-trénu:• Engar leiðir liggja frá niðjum v til forfeðra v.• Engar stikur liggja frá niðjum v til forfeðra v.• = Engar bakstikur frá niðjum v ná upp fyrir v.
• Höldum utan um:• Hversu hátt í trénu má komast frá viðkomandi hnút• Metum sem lægstann komutíma
![Page 34: Dýpt-fyrst leitun (DFS)](https://reader036.vdocuments.site/reader036/viewer/2022081503/56813098550346895d9677f9/html5/thumbnails/34.jpg)
Int tvítengtDFS(v) // Skilar hæsta hnút sem v kemst ílitur[v] = grár;tími++; komutími[v] = timefor each neighbor w of v do if (w hefur ekki verið heimsóttur)
wbak = tvítengtDFS(w) if (wbak >= komutími[v])
{Skila nýjum tvítengdum þætti með hluttrémeð rótina w og aðlægar stikur, fyrir
utanþað sem þegar hefur verið skilað.}
bak = min(bak, wbak) else if (vw er bakstika) bak = min(komutími[w], bak)litur[v] = svartur; return bak
![Page 35: Dýpt-fyrst leitun (DFS)](https://reader036.vdocuments.site/reader036/viewer/2022081503/56813098550346895d9677f9/html5/thumbnails/35.jpg)
Int tvítengtDFS(v) // Skilar hæsta hnút sem v kemst ílitur[v] = grár; tími++; bak = komutími[v] = timefor each neighbor w of v do if (litur[w] == hvítur)
push(stikuStafli, vw) wbak = tvítengtDFS(w) if (wbak >= komutími[v])
Skilum nýjum tvítengdum þætti, með þvíað poppa af stikuStafla til og með vw
bak = min(bak, wbak) else if (litur[w]=grár and w <> foreldri(v))
push(stikuStafli, vw) bak = min(komutími[w], bak)litur[v] = svartur; return bak