📜  并行搜索算法

📅  最后修改于: 2020-12-13 15:16:32             🧑  作者: Mango


搜索是计算机科学中的基本操作之一。它用于需要查找元素是否在给定列表中的所有应用程序中。在本章中,我们将讨论以下搜索算法-

  • 分而治之
  • 深度优先搜索
  • 广度优先搜索
  • 最佳优先搜索

分而治之

在分而治之的方法中,问题分为几个小子问题。然后,将子问题递归求解并组合起来,以解决原始问题。

分而治之的方法在每个级别涉及以下步骤-

  • 划分-原始问题分为子问题。

  • 征服-子问题递归解决。

  • 合并-将子问题的解决方案合并以获得原始问题的解决方案。

二进制搜索是分而治之算法的一个示例。

伪码

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)是一种用于搜索树或无向图数据结构的算法。这里的概念是从称为的起始节点开始,并在同一分支中尽可能地遍历。如果得到的节点没有后继节点,则返回并继续处理尚未访问的顶点。

深度优先搜索的步骤

  • 考虑先前未访问过的节点(根),并将其标记为已访问。

  • 访问第一个相邻的后继节点并将其标记为已访问。

  • 如果所考虑节点的所有后继节点都已被访问,或者它不再具有后继节点,则返回其父节点。

伪码

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()

最佳优先搜索

最佳优先搜索是一种遍历图形以最短路径到达目标的算法。与BFS和DFS不同,Best-First Search遵循评估函数来确定哪个节点最适合下一个遍历。

最佳优先搜索步骤

  • 从根节点开始,将其标记为已访问。
  • 找到下一个适当的节点并将其标记为已访问。
  • 转到下一层,找到适当的节点并将其标记为已访问。
  • 继续此过程,直到达到目标。

伪码

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