常见的搜索算法(深搜和广搜为主)

首先,我们必须要明白,搜索算法不同与一般的算法,可以说是相当重要。

大多数男生同胞爱玩LOL,当我们的鼠标点击地图上的某一位置时,英雄就会走向鼠标点击的位置,这些都是由高效的搜索算法所引导。说不定,看过本篇文章后,你再玩LOL,就会预判敌方走位了(输了别找我啊)。

常见的搜索算法

1:枚举算法

所谓的枚举算法就是一一列举出所有的情况,如果符合条件就进行相应的操作,这种算法效率显然不高,适用于基数少的情形。

2:深度优先搜索(DFS)

如算法名称那样, 深度优先搜索所遵循的搜索策略是尽可能“深”地搜索树。它的基本思想是:为了求得问题的解,先选择某一种可能情况向前(子结点)探索,在探索过程中,一旦发现原来的选择不符合要求,就回溯至父亲结点重新选择另一结点,继续向前探索,如此反复进行,直至求得最优解。深度优先搜索的实现方式可以采用 递归或者来实现。由此可见,把通常问题转化为树的问题是至关重要的一步,完成了树的转换基本完成了问题求解。
(1)减少节点数,思想:尽可能减少生成的节点数
(2)定制回溯边界,思想:定制回溯边界条件,剪掉不可能得到最优解的子树
在很多情况下,我们已经找到了一组比较好的解。但是计算机仍然会义无返顾地去搜索比它更“劣”的其他解,搜索到后也只能回溯。为了避免出现这种情况,我们需要灵活地去定制回溯搜索的边界。
在 深度优先搜索的过程当中,往往有很多走不通的“死路”。假如我们把这些“死路”排除在外,不是可以节省很多的时间吗?打一个比方,前面有一个路径,别人已经提示:“这是死路,肯定不通”,而你的程序仍然很“执着”地要继续朝这个方向走,走到头来才发现,别人的提示是正确的。这样,浪费了很多的时间。针对这种情况,我们可以把“死路”给标记一下不走,就可以得到更高的搜索效率(引用自某度)。

谈一下我的理解,其实DFS就像走迷宫一样,当我们走到某个分岔口,由于不知道到底哪个是出口,所以我们只能随便选择一条路(编程时一般是按顺序从第一个开始遍历),当我们又碰到一个分岔口时,我们需要再进行选择,如果碰到死胡同,这时就需要我们原路返回到上一个分岔口,然后选择另一条路,如此往复,直到走出迷宫。
常见的搜索算法(深搜和广搜为主)_第1张图片通过此图来加深了解,比方说 8 是出口,1是出发点,2 , 5 , 6 , 9 是第一处分岔口, 假如我们选择 2 , 然后 3 , 4成为第二个分岔口,我们随便选择 3 ,发现是死胡同,然后返回上一个分岔口 2 ,再选择 4 , 结果又是死胡同,我们又返回 2 ,发现 2 没有别的路了, 然后返回 1 , 再走别的路, 直到走到 8 .
3.广度优先搜索(BFS)
类似树的按层遍历,其过程为:首先访问初始点Vi,并将其标记为已访问过,接着访问Vi的所有未被访问过可到达的邻接点Vi1、Vi2……Vit,并均标记为已访问过,然后再按照Vi1、Vi2……Vit的次序,访问每一个顶点的所有未被访问过的邻接点,并均标记为已访问过,依此类推,直到图中所有和初始点Vi有路径相通的顶点都被访问过为止(引用自某度)。
我所理解到的广度优先搜索都是基于一个一维数组就可以实现,每当我们在讨论一个节点时,它的子节点(也就是上面的分叉点)被插在数组的后面(不是当前所讨论值的后面),我们可以通过一个变量,如index++来实现。







你可能感兴趣的:(简单数据结构)