Grafalgoritmer Flashcards

1
Q

Når kan vi bruker dybde-først søk (DFS)?

A

For å traversere en graf, og for å finne spenntre for uvektede grafer.

DFS er også skjelettet til Hopcroft-Tarjan algoritmen.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Når kan vi bruker bredde-først søk (BFS)?

A

For å traversere en graf, og for å finne spenntre for uvektede grafer.
Kan også brukes for å finne korteste stier i uvektet graf.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Når kan vi bruker Topologisk sortering?

A

For rettede, asykliske grafer (DAG) til å beskriver avhengigheter mellom nodene.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Når kan vi bruke Prims algoritme og hva er kjernen til algoritmen?

A

For å finne det minimale spenntre av en vektet graf.
- Grådig valg av noder

Benytter et tomt tree og en heap med oversikt over nodene og den billigste kantene.

Heap: for hver node u, Q.add(((u, None), D[u]))
- Alle noder u initialiseres med D[u] = uendelig,

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Når kan vi bruke Kruskals algortime og hva kjernen til algoritmen?

A

For å finne det minimale spenntre av en vektet graf.

  • Grådig valg av kanter.
  • Ofte raskest på tynne grafer, og om kantene er sortert etter vekt.

Bruker et tomt tree, en heap og clustere for oversikt over forskjellige “trær”.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Når kan vi bruke Borûvkas algoritme og hva kjernen til algoritmen?

A

For å finne det minimale spenntre av en vektet graf.
- Grådig valg av kanter, parallelliserbar

Starter med å la hver node være sin egen komponent i et tre T, og deretter knytter sammen komponenter ved å finne den billigste kanten helt til det bare er en komponent igjen i T.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Når kan vi bruke Djikstra og hva er kjernen til algoritmen?

A

Brukes for å finne korteste stier i vektede, rettede grafer, når kantene kun har positiv vekt.

Ideen er en BFS som tar høyde for kantenes vekt.
Vi bruker en prioritetskø/heap istedenfor en FIFO kø, som holder noder som elementer, og bruker en “estimert avstand” D til sammenligning.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Når kan vi bruke Bellman-Ford og hva er kjernen til algoritmen?

A

Brukes for å finne korteste stier i vektede, rettede grafer hvor kanter har både positive og negativ vekt.
Eller for å finne negative sykler i grafer.

Oppdaterer estimert avstand D for alle noder |V| - 1 ganger.
- Hvis det finnes en node hvor estimert avstand fortsatt blir mindre etter dette, inneholder grafen en negativ sykel.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Når kan vi bruke Hopcroft-Tarjan og hva er kjernen til algoritmen?

A

For å sjekke om en biconnected (2-sammenhengende) graf inneholder separasjonsnoder.

Bruker DFS til å lage et spenntre hvor vi:

  • Indekserer rekkefølgen nodene blir besøkt
  • Markerer discovery edges i treet (kanter som fører til nye noder).
  • Markerer back edges (kanter som fører tilbake til allerede besøkte noder).

Deretter finner vi separasjonsnoder ut fra indeks og low-nummer til nodene.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Hva er poenget med sterkt sammenhengende komponenter og hva er ideen for algoritmen?

A

Brukes for å finne de maksimale sterkt sammenhengende komponentene i en retted graf.

Vi bruker DFS, og ideen er at de sterkt sammenhengende komponentene i grafen forblir uendret hvis vi reverserer alle kantene.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Hvordan kan vi implementere dybde-først søk (DFS)?

A

Benytter en stack og en besøkt-liste:
- Plasserer noder på stacken og plukker dem av når det ikke finnes en kant til en ubesøkt node.

  • Alle noder listes i besøkt-listen når de blir palssert på stacken.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Hvordan kan vi implementere bredde-først søk (BFS)?

A

Benytter en kø og en besøkt-liste:

  • En første node blir plasser på køen, og satt som besøkt.
  • Så blir den poppet av køen og så skriver vi alle naboene til denne noden inn på køen og setter som besøkt.
  • Deretter poper vi neste node, og legger til de nabo nodene som ikke er besøkt inn på køen.
  • Fortsetter til køen er tom.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Hvordan kan vi implementere topologisk sortering?

A

Benytter en stack.
- Finner først alle noder med inngrad lik 0, og legger dem på stacken.

Så lenge stacken ikke er tom:

  • pop en node av stacken.
  • legg til noden i resultatliste.
  • for hver nabo, sett inngraden til naboen lik inngrad - 1 (slik at graden reduseres for hver nabo som fjernes).
  • om inngraden da er lik 0, legg til nabo på stacken.
  • en teller i inkrementerer hver gang noe blir poppet fra S, om i > n avslutt og returner resultat.
  • om i <= n og stacken er tom, da er det noder som er avhngig av hverandre, altså en sykel.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Hvordan kan vi implementere Prims algoritme?

A

Benytter et tomt tree, og en heap med oversikt over nodene og den billigste kanten.

Lager treet ved å starte i en vilkårlig node, og så legge til den kanten knyttet til noden som har lavest verdi. Deretter velges kanten med lavest verdi som er knyttet til én av nodene som nå er en del av treet. Dette fortsetter til alle nodene er blitt en del av treet.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Hvordan kan vi implementere Kruskals algoritme?

A

Bruker et tomt tree, en heap og clustere for oversikt over forskjellige “trær”.

Kruskals algoritme lager treet ved å finne de minste kantene i grafen en etter en, og lage en skog av trær. Deretter settes disse trærne gradvis sammen til ett tre, som blir det minimale spenntreet. Først finnes kanten i grafen med lavest vekt. Denne kanten legges til et tre. Deretter ser algoritmen etter den neste laveste kantvekten. Er ingen av nodene til denne kanten med i noe tre, så lages et nytt tre. Er én av nodene knyttet til et tre, så legges kanten til i det eksisterende treet. Er begge nodene knyttet til hver sitt tre settes de to trærne sammen. Er begge nodene knyttet til samme tre ignoreres kanten. Sånn fortsetter det til vi har ett tre.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Hvordan kan vi implementere Borûvkas algoritme?

A

Benytter et tomt tre, og knytter sammen komponenter ved å finne den billigste kanten.

  • Alle noder legges til i det tomme treet som sin egen komponent.
  • Finn så billigste kant som går ut fra hver komponent (noen vil ha samme kant).
  • Slå sammen komponentene etter disse kantene.
  • Gjør det samme igjen helt til det kun er en komponent.
17
Q

Hvordan kan vi implementere Djikstra?

A

Ideen er en BFS som tar høyde for kantenes vekt.
Vi bruker en prioritetskø (heap) istedenfor en FIFO kø, som holder noder som elementer, og bruker en “estimert avstand” D til sammenligning.
- D inneholder den korteste veien vi har funnet så langt.
- input node s, får D[s] = 0
- Hver gang vi fjernet et element u fra prioritetskøen, ser vi på naboene v til u og ser om vi har funnet en kortere vei til v, og oppdaterer evt. D[v]

Vi starter med å intialisere D[u] = uendelig for hver node.
Vi poper en node v av heapen, sjekker om den nye veien til alle naboer av v er mindre enn den som er i D, om så, oppdaterer vi D[nabo] til nye vekten og oppdaterer verdien for naboen i heapen (slik at den får korrekt prioritet).

v = heap.pop()
for hver kant (v,t)
- om D[v] + w((v, t)) < D[t]
-- D[t] = D[v] + w(v,t)
-- oppdater verdi for t i heapen til D[t]
18
Q

Hvordan kan vi implementere Bellman-Ford?

A

Oppdaterer estimert avstand D for alle noder |V| - 1 ganger.

- Hvis det finnes en node hvor estimert avstand fortsatt blir mindre etter dette, inneholder grafen en negativ sykel.

19
Q

Hvordan kan vi implementere Hopcroft-Tarjan?

A

Bruker DFS til å lage et spenntre

  • Indekserer rekkefølgen nodene blir besøkt
  • Discovery edges i treet er kanter som fører til nye noder.
  • Back edges er kanter som fører tilbake til allerede besøkte noder.

Deretter finner vi separasjonsnoder ut fra indeks og low-nummer til nodene.

…. trenger litt mer info på denne …

20
Q

Hvordan defineres en separasjonsnode ifht. Hopcroft-Tarjan algoritmen?

A

En node u er en separasjonsnode hvis

  1. u er rot i T og har mer enn ett barn, eller
  2. u ikke er roten, og har et barn v, slik at ingen etterkommere av v (inkludert v selv) har en back-edge til en forgjenger av u.

2 (formelt):
u er en sparasjonsnode hvis det finnes en kant u,v i T, slik at index(u) <= low(v)

21
Q

Hvordan defineres low-nummer ifht. Hopcroft-Tarjan algoritmen?

A

Low-nummer til en node er definert som indeksen til den noden med lavest indeks som kan nås ved å følge:

  1. 0 eller flere kanter (discovery edges) (i spenntreet T av graf G) etterfulgt av
  2. 0 eller 1 back-edge.
22
Q

Hvordan kan vi implementere en algoritme for å finne sterkt sammenhengende komponenter?

A

For å finne de maksimale sterkt sammenhengende komponentene i en retted graf kan vi bruke DFS.

Ideen er at de sterkt sammenhengende komponentene i grafen forblir uendret hvis vi reverserer alle kantene.

  • Vi kjører to DFS, en på grafen og en på den reverserte grafen.
  • I første DFS pusher vi noder på en stack når de er ferdig behandlet.
  • I andre DFS begynner vi på toppen av stacken.

.. mer info ..