搜索学习总结 - 关于深搜和广搜的故事

搜索的意义

搜索这个算法的意义在于,比如猹身边的一些例子:自动导航机器人,通过人工置入或者人为协助机器人构建的地图,然后在地图上标点让机器人自动走到目标点。肯定不能让机器人自己随机乱走,然后在不知道多长时间以后终于碰到目标点之后停止行动,这样做很显然意义不大,重要的是没有实际性价值,因为你甚至不能保证机器人一定能找到目标位置,因为如果方向和移动距离都是随机的,少量的距离和障碍物就足以让机器人 “永远” 也找不到它的目标点,其实机器人能够通过条件做出特殊的反应就是机器人 “智能” 的表现。那么说我们人类如果要去一个已知的地方通常都会有一个 “方向” 并且想要走 “最近” 的路,因此 “搜索” 不仅要找到 “出发点” 到 “目标点” 的路径,还要尽可能的缩小移动距离。

这就是猹理解的搜索的简单的意义~

广度搜索

广搜能够快捷的找到目标点,而且找到就停止的特性也能保证找到目标点所用的时间是最短时间;

缺点是不能储存经过的路径,不能找到多条解(或多个最优解);

因此广搜适合在数据量较大且不需要记录搜索过程的情况,尤其是数据量很大的时候,使用广搜能够极大的节省时间。

广搜思路

(以简单的迷宫问题为例)就是先制作一个队列,然后先从后面把第一个节点(出发点)的信息(坐标)放进去,之后从队列的前面读取 “最前面” 的节点的信息,然后把周围符合条件的点(能走的点)的信息从队列的后端放进队列里面去,然后继续读取队首信息并将符合条件的周围的点从后端入队,直到找到出口点为止。

程序流程

  1. 先从后端入队一个初始点数据
  2. 循环开始
    1. 从前端将队首出队
    2. 根据出队数据将周围符合条件的节点信息入队
    3. 如果找到符合条件的节点停止循环,否则继续弹出队首继续判断
  3. 输出需要的信息(路径长度,最终节点信息等)或进行最后的数据处理

深度搜索

深搜能够将所有的可能和不可能的结果都列举出来,并逐个判断,能够将所有的结果和多个最优结果都找到,也可以将搜索过程进行储存;

缺点是在数据较多的时候会消耗大量的递归运算、判断的时间;

因此深搜适合在数据量较小,需要多组搜索结果以及需要记录搜索路径的情况。

深搜思路

深搜通常使用递归,就是一个函数,里面首先是一个 “if” 判断结束条件,然后如果满足结束条件就储存或者打印数据并 “return” ,如果没有到结束的条件,就循环所有的点,选一个点标记一个点然后选下一个点,如果下一个点的所有情况都列举完了,就返回上一个点的选择,即:先取消标记,之后由于在循环里,因此又会继续添加下一个能选的点。

ps:举个栗子~全排列就是深搜,找第一个数,找到以后标记第一个数的位置,然后调用自己(递归)找第二个数,由于之前选过的数都被标记了因此不能选了,只能选没有标记过的数,找到之后继续递归找下一个数,直到所有数都标记过了,输出选过的数,之后取消标记之后返回上一级,由于上一级在循环中,因此该位点的标记虽然取消了,但依然会选择之后的点,然后就能达到全排列的效果。

程序流程

  1. 输入第一个节点的数据
  2. 递归查找 “除了已经找过的节点” 的符合条件的节点信息
  3. 在达到指定 “深度” 或是找到 “符合条件” 的节点之后,进行一定的操作(如储存一组信息或者输出该组信息数据)并返回上一级递归

结论

这里只是对深搜和广搜进行一个概括性的理解和叙述,并没有特别的专业性的讲解,目的是为了说明两种算法的优劣和构建思路。

具体化的讲解请关注下一期关于[搜索]的博客文章,在详细讲解更新之后我会及时更新本篇文章的~

发布了17 篇原创文章 · 获赞 22 · 访问量 4476

猜你喜欢

转载自blog.csdn.net/qq_37504214/article/details/90635351
今日推荐