Учебники

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

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

  • Разделяй и властвуй
  • Поиск в глубину
  • Поиск в ширину
  • Best-First Search

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

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

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

  • Разделить — исходная проблема делится на подзадачи.

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

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

Разделить — исходная проблема делится на подзадачи.

ЗавоеватьПодзадачи решаются рекурсивно.

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

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

ПСЕВДОКОД

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, mid1)
   else
   
      return BinarySearch(a, b, mid+1, high)

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

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

Этапы поиска в глубину

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

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

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

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

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

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

ПСЕВДОКОД

Пусть v будет вершина, с которой начинается поиск в графе 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) — это алгоритм поиска в дереве или структуре данных неориентированного графа. Здесь мы начинаем с узла, а затем посещаем все смежные узлы на одном уровне, а затем переходим на соседний узел-преемник на следующем уровне. Это также называется поиском по уровням .

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

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

ПСЕВДОКОД

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

Best-First Search

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