您的位置:首页 > 其它

【原创】浅谈搜索(下-bfs)

2017-07-15 17:38 363 查看

浅谈搜索 下

2016-09:浅谈搜索 上:http://blog.csdn.net/c20182030/article/details/52682475

2016-10:浅谈搜索 中:http://blog.csdn.net/c20182030/article/details/52796321

2016-11:枚举枚上天,暴力出奇迹:http://blog.csdn.net/c20182030/article/details/5312789
dce4
0

2017-07:浅谈搜索 下:这篇博客

时隔九个月,我们来完结暴力系列。

想想心里还是有点小伤感的。

现在来讲讲当初还没有理解现在很理解的广搜。

开场白

搜索,一种最基本,也是最重要的算法。无数高级思想都建立在搜索的基础上。当你学会搜索时,你就跨入了一个新的阶段。所以说,搜索,是每个编程人的进阶科目。

搜索,分为深搜(英文缩写dfs)和广搜(又叫宽搜,英文缩写bfs)。相比较来说,深搜较为简单,广搜更为管用。

深搜,就是有路就走,画成图片来看,就像植物的根,扎根很深,故名深搜。

广搜,我也不知道为什么叫广搜。

废话不多说,让我们在更加深入的了解搜索吧!

开始

开场白是不是很愚蠢?我也这么觉得。

bfs是什么呢?

我们举几个例子你就明白了。

你的眼镜掉地上了,你先摸你最近的,然后稍远一点的,再远一点,再远一点……

在画树状图求概率的时候,你仔细检查每一次有没有写对,第一次,第二次……

是不是很简单明了地没有明白?

在正式讲bfs以前,我们先来看一看dfs的坏处。

如果我们想要求迷宫里从起点到终点的最短路径,dfs就是把所有路径都走一遍,计算各条路径的长度。

假设你是真的在走迷宫,你要把所有路走完,那不累死!如果我们有分身术,能够派分身去走那些分支的路,而我本人就安安心心的走一条路。如果有分身到了终点,那就合体,走出去。

bfs的实现

上文的“分身”诠释是我最能诠释bfs的诠释。

那么,我们可以看出,bfs是个分层次的搜索。

我们要达到的效果是这样:



我们可以考虑用队列来存储当前的层次的结点。

naive-队列

队列

naive-优先队列

优先队列

我们把层次1的结点入队,在一一取出来,记为结点i,把与i直接相邻的层次2的结点入队。此时层次2在队列后面,而我们可以继续畅通无阻的取其他层次1的结点。把层次1的结点取完以后,队列里只剩层次2的结点了。以此类推。

结语

对,本篇博客很水,连个代码都没有。只是了了个心愿,哎。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: