📅  最后修改于: 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