Meklēšana dziļumā

Vikipēdijas raksts
Pārlēkt uz: navigācija, meklēt
Meklēšana dziļumā
miniatur
Virsotņu apstaigāšanas secība
Klase Meklēšanas algoritms
Datu struktūra Grafs
Sliktākā ātrdarbība O(|V|+|E|)
Sliktākais atmiņas patēriņš O(|V|+|E|)
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ā.

Vispārēji[izmainīt šo sadaļu | labot pirmkodu]

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[izmainīt š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).

Pseidokods[izmainīt šo sadaļu | labot pirmkodu]

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[izmainīt š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 \mathcal{O}(\vert V \vert + \vert E \vert), kur  \vert V \vert ir virsotņu skaits un  \vert E \vert — šķautņu skaits.[2]

Ja grafs ir definēts kā saistību matrica, algoritmam piemīt sarežģītība \mathcal{O}(\vert V \vert ^2 ).[3]

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

Pielietojums[izmainīt šo sadaļu | labot pirmkodu]

  • Meklēšana dziļumā ir citu grafu algoritmu sastāvdaļa.
  • Ar meklēšanas dziļumā palīdzību ar kompleksitāti \mathcal{O}(\vert V \vert + \vert E \vert) iespējams noteikt grafa cikliskumu un ciklam piederīgās šķautnes.[4]
  • Neciklisku grafu ar kompleksitāti \mathcal{O}(\vert V \vert + \vert E \vert) 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ā.

Literatūra[izmainīt šo sadaļu | labot pirmkodu]

Atsauces[izmainīt šo sadaļu | labot pirmkodu]

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

Ārējās saites[izmainīt šo sadaļu | labot pirmkodu]