Algorytm wyszukiwania równoległego

Wyszukiwanie jest jedną z podstawowych operacji w informatyce. Jest używany we wszystkich aplikacjach, w których musimy sprawdzić, czy element znajduje się na podanej liście, czy nie. W tym rozdziale omówimy następujące algorytmy wyszukiwania -

  • Dziel i rządź
  • Przeszukiwanie w głąb
  • Przeszukiwanie wszerz
  • Najlepsze pierwsze wyszukiwanie

Dziel i rządź

W podejściu dziel i rządź problem jest podzielony na kilka małych podproblemów. Następnie podproblemy są rozwiązywane rekurencyjnie i łączone w celu uzyskania rozwiązania pierwotnego problemu.

Podejście „dziel i rządź” obejmuje następujące kroki na każdym poziomie:

  • Divide - Pierwotny problem jest podzielony na podproblemy.

  • Conquer - Podproblemy są rozwiązywane rekurencyjnie.

  • Combine - Rozwiązania podproblemów są łączone, aby uzyskać rozwiązanie pierwotnego problemu.

Wyszukiwanie binarne jest przykładem algorytmu dziel i zwyciężaj.

Pseudo kod

Binarysearch(a, b, low, high)

if low < high then
   return NOT FOUND
else
   mid ← (low+high) / 2
   if b = key(mid) then
      return key(mid)
   else if b < key(mid) then
      return BinarySearch(a, b, low, mid−1)
   else
   
      return BinarySearch(a, b, mid+1, high)

Przeszukiwanie w głąb

Przeszukiwanie w głębi (lub DFS) to algorytm przeszukiwania struktury danych w drzewie lub nieukierunkowanym wykresie. Tutaj koncepcja polega na rozpoczęciu od węzła początkowego znanego jakorooti przejść tak daleko, jak to możliwe, w tej samej gałęzi. Jeśli otrzymamy węzeł bez kolejnego węzła, wrócimy i przejdziemy do wierzchołka, który jeszcze nie został odwiedzony.

Kroki wyszukiwania w głąb

  • Rozważ węzeł (root), który nie był wcześniej odwiedzany i oznacz go jako odwiedzony.

  • Odwiedź pierwszy sąsiedni węzeł i oznacz go jako odwiedzony.

  • Jeśli wszystkie kolejne węzły rozważanego węzła są już odwiedzone lub nie ma on już kolejnego węzła, wróć do węzła nadrzędnego.

Pseudo kod

Pozwolić v być wierzchołkiem, w którym rozpoczyna się wyszukiwanie w Graph G.

DFS(G,v)

   Stack S := {};
	
   for each vertex u, set visited[u] := false;
   push S, v;
   while (S is not empty) do
     u := pop S;
	  
      if (not visited[u]) then
         visited[u] := true;
         for each unvisited neighbour w of u
            push S, w;
      end if
		
   end while
   
END DFS()

Przeszukiwanie wszerz

Breadth-First Search (lub BFS) to algorytm przeszukiwania struktury danych w drzewie lub nieukierunkowanym wykresie. Tutaj zaczynamy od węzła, a następnie odwiedzamy wszystkie sąsiednie węzły na tym samym poziomie, a następnie przechodzimy do sąsiedniego węzła następcy na następnym poziomie. Jest to również znane jakolevel-by-level search.

Kroki przeszukiwania wszerz

  • Zacznij od węzła głównego, oznacz go jako odwiedzony.
  • Ponieważ węzeł główny nie ma węzła na tym samym poziomie, przejdź do następnego poziomu.
  • Odwiedź wszystkie sąsiednie węzły i oznacz je jako odwiedzone.
  • Przejdź do następnego poziomu i odwiedź wszystkie nieodwiedzone sąsiednie węzły.
  • Kontynuuj ten proces, aż zostaną odwiedzone wszystkie węzły.

Pseudo kod

Pozwolić v być wierzchołkiem, w którym rozpoczyna się wyszukiwanie w Graph G.

BFS(G,v)

   Queue Q := {};
	
   for each vertex u, set visited[u] := false;
   insert Q, v;
   while (Q is not empty) do
      u := delete Q;
		
      if (not visited[u]) then
         visited[u] := true;
         for each unvisited neighbor w of u
            insert Q, w;
      end if
		
   end while
   
END BFS()

Najlepsze pierwsze wyszukiwanie

Najlepsze pierwsze wyszukiwanie to algorytm, który przechodzi przez wykres, aby dotrzeć do celu na możliwie najkrótszej ścieżce. W przeciwieństwie do BFS i DFS, Best-First Search stosuje funkcję oceny w celu określenia, który węzeł jest najbardziej odpowiedni do przejścia dalej.

Kroki wyszukiwania w pierwszej kolejności

  • Zacznij od węzła głównego, oznacz go jako odwiedzony.
  • Znajdź następny odpowiedni węzeł i oznacz go jako odwiedzony.
  • Przejdź do następnego poziomu i znajdź odpowiedni węzeł i oznacz go jako odwiedzony.
  • Kontynuuj ten proces, aż cel zostanie osiągnięty.

Pseudo kod

BFS( m )

   Insert( m.StartNode )
   Until PriorityQueue is empty
      c ← PriorityQueue.DeleteMin
      If c is the goal
      Exit
   Else
   
      Foreach neighbor n of c
         If n "Unvisited"
            Mark n "Visited"
            Insert( n )
      Mark c "Examined"
      
End procedure