35
Dýpt-fyrst leitun (DFS) Greining reiknirita vor 2002

Dýpt-fyrst leitun (DFS)

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

Page 1: Dýpt-fyrst leitun (DFS)

Dýpt-fyrst leitun (DFS)

Greining reiknirita

vor 2002

Page 2: Dýpt-fyrst leitun (DFS)

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)

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)

Net birtast á ýmsan hátt

Page 5: Dýpt-fyrst leitun (DFS)

Ýmis net

• 12-flötungur • Möskvi

Page 6: Dýpt-fyrst leitun (DFS)

Gjafasendingar meðal meðlima ættbálks nokkurs í Afríku

Page 7: Dýpt-fyrst leitun (DFS)

Vensl tölvukerfa/mála/tölva

Page 8: Dýpt-fyrst leitun (DFS)

Kortalitun

• Kortagerðamenn til forna sáu að 4 litir virðast alltaf duga.

Page 9: Dýpt-fyrst leitun (DFS)

Ritháttur

• Hnútur (node, vertex)

• Leggur, stika (edge)

• Leið (path)

• Rás (cycle)

• Þáttur (connected component)

Page 10: Dýpt-fyrst leitun (DFS)

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)

B

D

G

EC

F

A

Page 12: Dýpt-fyrst leitun (DFS)

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)

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)

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)

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)

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)

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)

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)

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)

4 6

2

5

3

8

1

78

Page 21: Dýpt-fyrst leitun (DFS)

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)

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)

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)

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)

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)

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)

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)

Kafli: Skurðhnútar

Page 29: Dýpt-fyrst leitun (DFS)

4 6

2

5

3

1

78

Page 30: Dýpt-fyrst leitun (DFS)

4 6

2

5

3

1

78

Skurðhnútar (articulation points)

Page 31: Dýpt-fyrst leitun (DFS)

4 6

2

5

3

1

78

Tvítengdir þættir (biconnected components)

Page 32: Dýpt-fyrst leitun (DFS)

4 6

2

5

3

1

78

Tvítengdir þættir (biconnected components)

Page 33: Dýpt-fyrst leitun (DFS)

• 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)

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)

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