Алгоритм параллельного поиска

Поиск - одна из фундаментальных операций в информатике. Он используется во всех приложениях, где нам нужно определить, находится ли элемент в данном списке или нет. В этой главе мы обсудим следующие алгоритмы поиска -

  • Разделяй и властвуй
  • Поиск в глубину
  • Поиск в ширину
  • Поиск лучшего первого

Разделяй и властвуй

В подходе «разделяй и властвуй» проблема делится на несколько небольших подзадач. Затем подзадачи рекурсивно решаются и объединяются, чтобы получить решение исходной проблемы.

Подход «разделяй и властвуй» включает следующие шаги на каждом уровне:

  • Divide - Исходная проблема разделена на подзадачи.

  • Conquer - Подзадачи решаются рекурсивно.

  • Combine - Решения подзадач объединяются, чтобы получить решение исходной проблемы.

Бинарный поиск - это пример алгоритма «разделяй и властвуй».

Псевдокод

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)

Поиск в глубину

Поиск в глубину (или DFS) - это алгоритм поиска в дереве или структуре данных неориентированного графа. Здесь концепция состоит в том, чтобы начать с начального узла, известного какrootи пройти как можно дальше в той же ветви. Если мы получаем узел без узла-преемника, мы возвращаемся и продолжаем работу с вершиной, которую еще предстоит посетить.

Шаги поиска в глубину

  • Рассмотрим узел (корень), который ранее не посещался, и отметим его посещенным.

  • Посетите первый соседний узел-преемник и отметьте его посещенным.

  • Если все узлы-преемники рассматриваемого узла уже посещены или у него больше нет узла-преемника, вернитесь к его родительскому узлу.

Псевдокод

Позволять v - вершина, с которой начинается поиск в 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()

Поиск в ширину

Поиск в ширину (или BFS) - это алгоритм поиска в дереве или структуре данных неориентированного графа. Здесь мы начинаем с узла, затем посещаем все соседние узлы на том же уровне, а затем переходим к соседнему узлу-преемнику на следующем уровне. Это также известно какlevel-by-level search.

Шаги поиска в ширину

  • Начните с корневого узла, отметьте его посещенным.
  • Поскольку корневой узел не имеет узла на том же уровне, перейдите на следующий уровень.
  • Посетите все соседние узлы и отметьте их посещенными.
  • Перейдите на следующий уровень и посетите все непосещенные соседние узлы.
  • Продолжайте этот процесс, пока не будут посещены все узлы.

Псевдокод

Позволять v - вершина, с которой начинается поиск в 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()

Поиск лучшего первого

Поиск лучшего первого - это алгоритм, который просматривает граф, чтобы достичь цели по кратчайшему пути. В отличие от BFS и DFS, поиск Best-First следует функции оценки, чтобы определить, какой узел наиболее подходит для следующего перехода.

Шаги поиска лучшего первого

  • Начните с корневого узла, отметьте его посещенным.
  • Найдите следующий подходящий узел и отметьте его посещенным.
  • Перейдите на следующий уровень, найдите соответствующий узел и отметьте его посещенным.
  • Продолжайте этот процесс, пока цель не будет достигнута.

Псевдокод

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