Syvyyssuuntainen läpikäynti
Ulkoasu
| Tämän artikkelin tai sen osan kieliasua on pyydetty parannettavaksi. Voit auttaa Wikipediaa parantamalla artikkelin kieliasua. Tarkennus: Maallikolle käsittämätöntä tekstiä. Tietosanakirjan pitäisi olla yleistajuinen. |
Tietojenkäsittelytieteessä syvyyssuuntainen läpikäynti eli syvyyshaku (engl. depth-first search, DFS) on graafialgoritmi, joka etsii kaikki tietyn solmun kautta saavutettavat muut solmut. Syvyyssuuntaisella läpikäynnillä saadaan tietoa graafin rakenteesta; polunhakua varten parempi algoritmi on yleensä leveyssuuntainen läpikäynti.
Algoritmi
[muokkaa | muokkaa wikitekstiä]
Syvyyssuuntainen läpikäynti voidaan ilmaista vapaamuotoisesti seuraavasti:
- Edetään aloitussolmusta lähtien mahdollisimman pitkälle.
- Peruutetaan, kunnes löytyy haara, jota ei ole käyty läpi.
- Edetään siitä lähtien mahdollisimman pitkälle...
- Toistetaan, kunnes kaikki aloitussolmusta saavutettavat solmut ovat käyty läpi.
Jos halutaan käydä koko verkko läpi, niin lisäksi:
- Toistetaan algoritmia asettamalla yhä uudestaan aloitussolmuksi solmu, jota ei ole vielä käyty läpi.
Tietoa saadaan paljon irti seuraavalla toteutustavalla:
- Värjätään solmuja kolmella vaihtoehtoisella värillä (valkoinen, harmaa tai musta eli koskematon, edetty tai kokonaan läpikäyty).
- Lyödään solmuihin ”aikaleima”, ennen kuin solmuun edetään tai siitä peruutetaan pois.
- Tallennetaan polut merkitsemällä jokaiselle solmulle edeltäjä.
Syvyyssuuntainen läpikäynti on helpointa toteuttaa rekursiivisesti:
- Merkitään käsiteltävä solmu harmaalla värillä ja aikaleimalla.
- Kasvatetaan aikaa.
- Toistetaan algoritmi jokaiselle vierussolmulle.
- Nyt solmu käyty kokonaan läpikäyty.
- Värjätään käsiteltävä solmu mustaksi ja kasvatetaan aikaa.
Toteutus pseudokoodilla
[muokkaa | muokkaa wikitekstiä]aika: globaali muuttuja, joka kertoo montako kertaa yhteensä on edetty tai peruutettu
record solmu
viereiset: solmusta on yhteys näihin solmuihin
väri: VALKOINEN, HARMAA tai MUSTA (koskematon, edetty tai kokonaan läpikäyty)
edeltäjä: edellinen solmu edetyllä polulla
löydetty: aika, jolloin solmuun edettiin
läpikäyty: aika, jolloin solmu oli kokonaan läpikäyty ja siitä peruutettiin pois
end record
record verkko
solmut: kaikki verkon solmut
end record
function dfs(G: verkko)
for each v in G.solmut
v.väri := VALKOINEN
v.edeltäjä := null
aika := 0
for each v in G.solmut
if v.väri = VALKOINEN
vieraile(v)
function vieraile(u: solmu)
u.väri := HARMAA
aika := aika + 1
u.löydetty := aika
for each v in u.viereiset
if v.väri = VALKOINEN
v.edeltäjä := u
vieraile(v)
u.väri := MUSTA
aika := aika + 1
u.läpikäyty := aika
Lähteet
[muokkaa | muokkaa wikitekstiä]- Thomas Cormen, Charles Leiserson, Ronald Rivest ja Clifford Stein: ”22.3 Depth-first search”, Introduction to Algorithms – 2nd ed. s. 540–547. MIT Press ja McGraw-Hill, 2001. ISBN 0-262-03293-7
- Matti Luukkainen ja Matti Nykänen: 58131: Tietorakenteet: ”7.3.2 Syvyyssuuntainen läpikäynti” 8. tammikuuta 2007. Helsingin yliopisto. Arkistoitu 13.6.2007. Viitattu 5. huhtikuuta 2007.
Kirjallisuutta
[muokkaa | muokkaa wikitekstiä]- Ruohonen, Keijo: Graafiteoria. (Opintomoniste 136) Tampere: TTKK, 1990. ISBN 951-721-530-4