📜  不知情的搜索算法

📅  最后修改于: 2020-09-23 08:32:25             🧑  作者: Mango

不知情的搜索算法

不知情的搜索是一类以暴力方式运行的通用搜索算法。无知的搜索算法除了如何遍历树外没有其他有关状态或搜索空间的信息,因此也称为盲搜索。

以下是各种类型的无信息搜索算法:

  • 广度优先搜索
  • 深度优先搜索
  • 深度限制搜索
  • 迭代加深深度优先搜索
  • 统一成本搜索
  • 双向搜寻

1.广度优先搜索:

  • 广度优先搜索是遍历树或图的最常见搜索策略。该算法在树或图中进行广度搜索,因此称为广度优先搜索。
  • BFS算法从树的根节点开始搜索,并在移动到下一级别的节点之前扩展当前级别的所有后继节点。
  • 广度优先搜索算法是通用图搜索算法的示例。
  • 使用FIFO队列数据结构实现广度优先搜索。

优点:

  • 如果存在任何解决方案,BFS将提供解决方案。
  • 如果针对一个给定的问题有多个解决方案,那么BFS将提供最少的解决方案,所需的步骤最少。

缺点:

  • 由于树的每个级别都必须保存到内存中才能扩展下一个级别,因此需要大量内存。
  • 如果解决方案离根节点很远,那么BFS需要很多时间。

例:

在下面的树结构中,我们显示了使用BFS算法从根节点S到目标节点K遍历树的过程。BFS搜索算法在层中遍历,因此它将遵循虚线箭头所示的路径,并且遍历的路径将是:

S---> A--->B---->C--->D---->G--->H--->E---->F---->I---->K  

时间复杂度:BFS算法的时间复杂度可以通过在BFS中遍历到最浅节点的节点数来获得。d=最浅解的深度,b是每个状态下的节点。

T(b)=1+b2+b3+…….+bd=O(bd)

空间复杂度:BFS算法的空间复杂度由边界的内存大小O(bd)给出。

完整性:BFS是完整的,这意味着如果最浅的目标节点处于某个有限深度,则BFS将找到解决方案。

最优性:如果路径成本是节点深度的不变函数,则BFS最优。

2.深度优先搜索

  • 深度优先搜索是一种遍历树或图数据结构的递归算法。
  • 之所以称为深度优先搜索,是因为它从根节点开始,然后沿着每个路径到达其最大深度节点,然后再移动到下一个路径。
  • DFS将堆栈数据结构用于其实现。
  • DFS算法的过程类似于BFS算法。

注意:回溯是一种使用递归查找所有可能解的算法技术。

优点:

  • DFS仅需要在从根节点到当前节点的路径上存储节点堆栈,因此所需的内存非常少。
  • 与BFS算法相比,到达目标节点所需的时间更少(如果它在正确的路径中穿越)。

坏处:

  • 许多州可能会不断发生,并且不能保证找到解决方案。
  • DFS算法适用于深度搜索,有时可能会进入无限循环。

例:

在下面的搜索树中,我们显示了深度优先搜索的流程,其顺序如下:

根节点—>左节点—->右节点。

它将从根节点S开始搜索,然后遍历A,然后遍历B,然后遍历D和E,遍历E之后,它将回溯树,因为E没有其他后继,并且仍然找不到目标节点。回溯之后,它将遍历节点C,然后遍历G,在这里它将终止,因为它找到了目标节点。

完整性:DFS搜索算法在有限的状态空间内是完整的,因为它将扩展有限搜索树中的每个节点。

时间复杂度:DFS的时间复杂度将等于算法遍历的节点。它由下式给出:

T(n)=1+n2+n3+………+nm=O(nm)

其中,m=任何节点的最大深度,并且可以远大于d(最浅的解决方案深度)

空间复杂度:DFS算法仅需要存储从根节点开始的单个路径,因此DFS的空间复杂度等于边缘集的大小,即O(bm)。

最佳:DFS搜索算法不是最佳算法,因为它可能会生成大量步骤或到达目标节点的成本较高。

3.深度限制搜索算法:

深度限制搜索算法类似于具有预定限制的深度优先搜索。深度限制搜索可以解决深度优先搜索中无限路径的缺点。在该算法中,深度限制的节点将被视为没有进一步的后续节点。

深度限制搜索可以通过以下两种失败条件终止:

  • 标准失败值:表明问题没有解决方案。
  • 截止失败值:在给定的深度限制内,该问题没有解决方案。

优点:

深度限制搜索可提高内存效率。

缺点:

  • 深度限制搜索还具有不完整的缺点。
  • 如果问题有多个解决方案,则可能不是最佳选择。

例:

完整性:如果解超出深度限制,则DLS搜索算法已完成。

时间复杂度:DLS算法的时间复杂度为O(bℓ)。

空间复杂度:DLS算法的空间复杂度为O(b×ℓ)。

最佳:深度限制搜索可以视为DFS的一种特殊情况,即使ℓ>d,也不是最佳选择。

4.均价搜索算法:

均匀成本搜索是用于遍历加权树或图形的搜索算法。当每个边缘的可用成本不同时,该算法就会发挥作用。统一成本搜索的主要目标是找到通往目标节点的路径,该路径具有最低的累积成本。均匀成本搜索根据节点的路径成本从根节点扩展节点。它可以用于求解需要最佳成本的任何图/树。优先级队列实现统一成本搜索算法。它为最低的累计成本提供了最高的优先级。如果所有边的路径成本相同,则均匀成本搜索等效于BFS算法。

优点:

  • 统一成本搜索是最佳的,因为在每种状态下都选择成本最低的路径。

缺点:

  • 它不关心搜索涉及的步骤数,仅关心路径成本。因此,该算法可能陷入无限循环。

例:

完整性:

统一成本搜索已经完成,例如,如果有解决方案,UCS将找到它。

时间复杂度:

令C*为最优解的成本,而ε为接近目标节点的每一步。那么步数为=C*/ε+1。从状态0开始到C*/ε,这里取+1。

因此,均匀成本搜索的最坏情况下的时间复杂度为O(b1+[C*/ε])/。

空间复杂度:

空间复杂度的逻辑相同,因此,均匀成本搜索的最坏情况下的空间复杂度为O(b1+[C*/ε])。

最佳:

均匀成本搜索始终是最佳选择,因为它仅选择路径成本最低的路径。

5.迭代加深深度优先搜索:

迭代加深算法是DFS和BFS算法的组合。该搜索算法找出最佳的深度极限,并通过逐渐增加极限直到找到目标为止。

该算法执行深度优先搜索直到某个“深度限制”,并且在每次迭代之后一直增加深度限制,直到找到目标节点为止。

该搜索算法结合了广度优先搜索的快速搜索和深度优先搜索的存储效率的优点。

当搜索空间很大且目标节点的深度未知时,迭代搜索算法是有用的无信息搜索。

优点:

  • 它结合了BFS和DFS搜索算法在快速搜索和内存效率方面的优势。

缺点:

  • IDDFS的主要缺点是,它重复了上一阶段的所有工作。

例:

接下来的树形结构显示了迭代加深深度优先搜索。IDDFS算法执行各种迭代,直到找不到目标节点为止。该算法执行的迭代为:

第1次迭代->A第2次迭代->A,B,C第3次迭代——>A,B,D,E,C,F,G4第三次迭代—>A,B,D,H,I,E,C,F,K,G在第四次迭代中,算法将找到目标节点。

完整性:

如果分支因子是有限的,则该算法是完整的。

时间复杂度:

假设b是分支因子,深度是d,则最坏情况下的时间复杂度是O(bd)。

空间复杂度:

IDDFS的空间复杂度将为O(bd)。

最佳:

如果路径成本是节点深度的非递减函数,则IDDFS算法是最佳的。

6.双向搜索算法:

双向搜索算法运行两次同时搜索,一种是从初始状态称为正向搜索,另一种是从目标节点开始向后搜索,以找到目标节点。双向搜索将一个单独的搜索图替换为两个小子图,其中一个从子顶点开始搜索,另一个从目标顶点开始搜索。当这两个图彼此相交时,搜索将停止。

双向搜索可以使用BFS,DFS,DLS等搜索技术。

优点:

  • 双向搜索速度很快。
  • 双向搜索需要更少的内存

缺点:

  • 双向搜索树的实现很困难。
  • 在双向搜索中,应该事先知道目标状态。

例:

在下面的搜索树中,应用了双向搜索算法。该算法将一个图/树分成两个子图。它从节点1开始向前移动,并从目标节点16开始向后移动。

该算法在两个搜索相遇的节点9处终止。

完整性:如果我们在两个搜索中均使用BFS,则双向搜索即告完成。

时间复杂度:使用BFS进行双向搜索的时间复杂度为O(bd)。

空间复杂度:双向搜索的空间复杂度为O(bd)。

最佳:双向搜索为最佳。