Meklēšana dziļumā

Meklēšana dziļumā (, DFS) ir pārlases () 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. Šā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 
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 () 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 

 Izvēlies sākuma virsotni.
 Ja virsotne ir meklētā virsotne, apstrādes beigas. 
 Atzīmē virsotni kā apmeklētu. 
 Saglabā kaimiņu virsotnes stekā.
 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 

 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 

Ja grafs definēts kā saistību saraksts (), ļ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.

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

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

 Pielietojums 

 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. 
 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ā.

 Literatūra 
 Stuart Russell, Peter Norvig : Artificial Intelligence: A Modern Approach, 2. Auflage, 2002, Prentice Hall. (angļu val.)
 Sven Oliver Krumke, Hartmuts Noltemeiers : Graphentheoretische Konzepte und Algorithmen. Springer Vieweg, 3. Auflage, 2012,  (vācu val.)

 Atsauces 

 Ārējās saites 
 Meklēšanas dziļumā piemērs 

Kategorija:Meklēšanas algoritmi
Kategorija:Grafu algoritmi