浅谈搜索 下
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/53127890
2017-07:浅谈搜索 下:这篇博客
时隔九个月,我们来完结暴力系列。
想想心里还是有点小伤感的。
现在来讲讲当初还没有理解现在很理解的广搜。
开场白
搜索,一种最基本,也是最重要的算法。无数高级思想都建立在搜索的基础上。当你学会搜索时,你就跨入了一个新的阶段。所以说,搜索,是每个编程人的进阶科目。
搜索,分为深搜(英文缩写dfs)和广搜(又叫宽搜,英文缩写bfs)。相比较来说,深搜较为简单,广搜更为管用。
深搜,就是有路就走,画成图片来看,就像植物的根,扎根很深,故名深搜。
广搜,我也不知道为什么叫广搜。
废话不多说,让我们在更加深入的了解搜索吧!
开始
开场白是不是很愚蠢?我也这么觉得。
bfs是什么呢?
我们举几个例子你就明白了。
- 你的眼镜掉地上了,你先摸你最近的,然后稍远一点的,再远一点,再远一点……
- 在画树状图求概率的时候,你仔细检查每一次有没有写对,第一次,第二次……
是不是很简单明了地没有明白?
在正式讲bfs以前,我们先来看一看dfs的坏处。
如果我们想要求迷宫里从起点到终点的最短路径,dfs就是把所有路径都走一遍,计算各条路径的长度。
假设你是真的在走迷宫,你要把所有路走完,那不累死!如果我们有分身术,能够派分身去走那些分支的路,而我本人就安安心心的走一条路。如果有分身到了终点,那就合体,走出去。
bfs的实现
上文的“分身”诠释是我最能诠释bfs的诠释。
那么,我们可以看出,bfs是个分层次的搜索。
我们要达到的效果是这样:
我们可以考虑用队列来存储当前的层次的结点。
我们把层次1的结点入队,在一一取出来,记为结点i,把与i直接相邻的层次2的结点入队。此时层次2在队列后面,而我们可以继续畅通无阻的取其他层次1的结点。把层次1的结点取完以后,队列里只剩层次2的结点了。以此类推。
结语
对,本篇博客很水,连个代码都没有。只是了了个心愿,哎。