Pāriet uz saturu

Meklēšana dziļumā

Vikipēdijas lapa
Meklēšana dziļumā
miniatur
Virsotņu apstaigāšanas secība
Klase Meklēšanas algoritms
Datu struktūra Grafs
Sliktākā ātrdarbība
Sliktākais atmiņas patēriņš
Optimāls jā (grafiem bez svariem)
Pilnīgs

Meklēšana dziļumā (angļu: depth-first search, DFS) ir pārlases (angļu: brute force) grafa traversēšanas un grafa virsotņu meklēšanas algoritms. Algoritma tipu sauc arī par naivo, vai neinformēto algoritmu. Atšķirībā no meklēšanas plašumā, meklēšanas dziļumā laikā katrs zars tiek izpētīts līdz galam, pirms apstrādāt jaunu zaru.[1] Šādā veidā tiek apmeklētas visas no starta virsotnes sasniedzamās virsotnes. Grafos, kuros ir nedaudzi, bet ļoti gari ceļi, iespējams izmantot arī ierobežotu meklēšanu dziļumā, kura katru iesākto ceļu apseko tikai līdz noteiktam dziļumam. Uzlabota meklēšana dziļumā ir iteratīvā meklēšana dziļumā.

Meklēšana dziļumā ir pārlases meklēšanas algoritms, kas katru uzieto zaru pārmeklē pilnībā, pirms uzsākt meklēšanu citos zaros. Kādā kārtībā tiek kārtotas virsotnes, kas ir sasniedzamas, no aktuālās virsotnes, ir atkarīgs no grafa reprezentācijas vai tā pieraksta. Saistību matricas (angļu: adjacency matrix) gadījumā, sekojošās virsotnes tiek apmeklētas to rindas kārtībā saistību matricā. Piemēra animācijā tiek pēc noklusējuma pieņemts, ka kaimiņu virsotnes tiek apmeklētas kārtībā no kreisās uz labo pusi.

Neformāls algoritms

[labot šo sadaļu | labot pirmkodu]
  1. Izvēlies sākuma virsotni.
  2. Ja virsotne ir meklētā virsotne, apstrādes beigas.
  3. Atzīmē virsotni kā apmeklētu.
  4. Saglabā kaimiņu virsotnes stekā.
  5. Kamēr steks nav tukšs, izņem kaimiņvirsotni no steka.
    • Ja virsotne vēl nav apmeklēta, rekursīvi izsauc meklēšanas algoritmu (atgriežas punktā 2).
DFS(node, goal)
{
  if (node == goal) {
    return node;
  } else
  {
    mark(node);
    stack := expand (node);
    while (stack is not empty)
    {
      node' := pop(stack);
      if (not marked(node')) {
         DFS(node', goal);
    }
  }
}

Algoritma sarežģītība

[labot šo sadaļu | labot pirmkodu]

Ja grafs definēts kā saistību saraksts (angļu: adjacency list), ļaunākajā gadījumā algoritms testē visas iespējamās šķautnes un visas iespējamās virsotnes. Šādai meklēšanai dziļumā Landau pierakstā piemīt sarežģītība , kur ir virsotņu skaits un — šķautņu skaits.[2]

Ja grafs ir definēts kā saistību matrica, algoritmam piemīt sarežģītība .[3]

Ja grafs ir bezizmēra vai algoritmā tiek izlaista pārbaude, vai virsotne jau ir tikusi apmeklēta, algoritms var neterminēt.

  • Meklēšana dziļumā ir citu grafu algoritmu sastāvdaļa.
  • Ar meklēšanas dziļumā palīdzību ar kompleksitāti iespējams noteikt grafa cikliskumu un ciklam piederīgās šķautnes.[4]
  • Neciklisku grafu ar kompleksitāti iespējams sakārtot topoloģiski.

Meklēšana dziļumā nav optimāla, ja šķautņu svari dziļumā ir monotoni augoši. Šādā gadījumā var tikt atrasts daudz garāks ceļš, nekā optimālais. Salīdzinājumam – atmiņu vairāk patērējošā meklēšana plašumā šādā gadījumā atrastu optimālo risinājumu. Abu meklēšanas algoritmu apvienojums ir iteratīvā meklēšana dziļumā.

  1. Volker Turau. Algorithmische Graphentheorie (3 izd.). München : Oldenbourg Wissenschaftsverlag, 2009. 94–98. lpp. ISBN 9783486590579.
  2. Thomas Ottmann, Peter Widmayer. Algorithmen und Datenstrukturen (5 izd.). Heidelberg : Spektrum Akademischer Verlag, 2012. 589–668. lpp. ISBN 978-3-8274-2803-5.
  3. «Graphen» (PDF; 73 kB). Arhivēts no oriģināla, laiks: 2003-05-23. Skatīts: 2012-07-25.
  4. Sven Oliver Krumke, Hartmut Noltemeier. Graphentheoretische Konzepte und Algorithmen (3 izd.). Wiesbaden : Springer Vieweg, 2012. 152−157. lpp. ISBN 978-3-8348-1849-2.

Ārējās saites

[labot šo sadaļu | labot pirmkodu]