Upload
chiquita-arama
View
45
Download
0
Embed Size (px)
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 Presentation
Citation preview
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
• Stöður í skák
• Flug milli staða og tímalengd
• Tengslanet
Net birtast á ýmsan hátt
Ýmis net
• 12-flötungur • Möskvi
Gjafasendingar meðal meðlima ættbálks nokkurs í Afríku
Vensl tölvukerfa/mála/tölva
Kortalitun
• Kortagerðamenn til forna sáu að 4 litir virðast alltaf duga.
Ritháttur
• Hnútur (node, vertex)
• Leggur, stika (edge)
• Leið (path)
• Rás (cycle)
• Þáttur (connected component)
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ð.
B
D
G
EC
F
A
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
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
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
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
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)
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)
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
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
4 6
2
5
3
8
1
78
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
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].
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
B
D
G
EC
F
A
1
2
3/4
5/6
/7
8/9
/10
11
12/13
/14
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
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.
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
Kafli: Skurðhnútar
4 6
2
5
3
1
78
4 6
2
5
3
1
78
Skurðhnútar (articulation points)
4 6
2
5
3
1
78
Tvítengdir þættir (biconnected components)
4 6
2
5
3
1
78
Tvítengdir þættir (biconnected components)
• 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
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
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