深度优先搜索&&广度优先搜索

深度优先搜索dfs:


  深度优先搜索算法(Depth First Search),是图论中的经典算法。
  深度优先搜索的核心是栈
  为了实现深度优先搜索,首先选择一个起始顶点并需要遵守三个规则:
非递归的情况:
1. 如果可能,访问一个邻接的未访问顶点,标记它,并把它放入栈中。
2. 当不能执行规则1时,如果栈不空,就从栈中弹出一个顶点。
3. 如果不能执行规则1和规则2,就完成了整个搜索过程。
同样也可以利用递归实现!!!

  深度优先搜索就是在搜索树的每一层始终先只扩展一个子节点,不断地向纵深前进直到不能再前进(到达叶子节点或受到深度限制)时,才从当前节点返回到上一级节点,沿另一方向又继续前进。这种方法的搜索树是从树根开始一枝一枝逐渐形成的。
  深度优先搜索亦称为纵向搜索。由于一个有解的问题树可能含有无穷分枝,深度优先搜索如果误入无穷分枝(即深度无限),则不可能找到目标节点。所以,深度优先搜索策略是不完备的。另外,应用此策略得到的解不一定是最佳解(最短路径)。
  为了提高效率,需要做的就是剪枝。除去没有用的搜索分支。有可行性剪枝和最优剪枝两种。对于很多问题,可以把搜索与动态规划(DP,dynamic program)、完备匹配(匈牙利算法)等高效算法结合。


备注:
1、为什么说某一个算法是不完备的?
该问题待完善!
算法执行的基础告诉我们,总有算法解决不了的问题,总有计算机解决不了的问题,总有人解决不了的问题,总有永远解决不了的问题。这就是算法的不完备性。
2、完备匹配

待完善


广度度优先搜索bfs;

  广度优先搜索的核心是队列
  在深度优先搜索中,算法表现得好像要尽快地远离起始点似的。相反,在广度优先搜索中,算法好像要尽可能地靠近起始点。它首先访问起始顶点的所有邻接点,然后再访问较远的区域。它是用队列来实现的。


  下面图中的数字显示了广度优先搜索顶点被访问的顺序。
实现广度优先搜索,也要遵守三个规则:

  1. 访问下一个未来访问的邻接点,这个顶点必须是当前顶点的邻接点,标记它,并把它插入到队列中。
  2. 如果因为已经没有未访问顶点而不能执行规则1时,那么从队列头取一个顶点,并使其成为当前顶点。
  3. 如果因为队列为空而不能执行规则2,则搜索结束。

猜你喜欢

转载自blog.csdn.net/weixin_39540045/article/details/80517126