BFS的辅助队列最小安全长度
2016-11-15 21:58
246 查看
本文仅对于搜索迷宫等完全矩形图的BFS搜索操作适用。
由于BFS搜索操作有一个o-c表(open-closed表)来判断是否搜索过,因此,这就预言了BFS所需要的QUENE的长度必然小于图中的实际节点总数(完全矩形图的节点总数恒不大于R*C)。基于QUENE的FIFO原理,对于一个标准图,我们可以很容易地证明:当S点,即起始点在图中间时,所需的QUENE的长度一般大于当S点位于图的边缘时的QUENE长度需求量。
再根据BFS的扩散模式,可以得知,当障碍物越少时,QUENE的需求长度越大,如下表a-1与a-2
a-1
a-2
模拟一个队列,可以得出,a-1图的队列长度远大于a-2图。
为了满足最坏情况,姑且令S位于((R+1)/2,(C+1)/2),即图的中心,且图上无任何障碍。
Cmax=2(min(R,C)-max(R,C)%2) (不完善)
该C 实质上是以S为中心的菱形的有效周长,当R==C时,该公式成立。
然而当R!=C时,如下图,
B-2 可以看成是B-1的所有节点进行过一次BFS操作后的状态,但是,显然B-2的队列内节点数比B-1内的节点数多2。
因此,我们定义σ(R,C) = { 0 , R!=C ||
max(R,C)%2 == 0 ;
{ 1 , R==C && max(R,C)%2 == 1 .
可得出结论:
Cmax=2(min(R,C)-σ(R,C) )
然而QUENE最小长度为Cmax时,可能会溢出,如下图所示:
很容易可以得知,C - 2 所需的QUENE 长度比公式计算出的要大
1!!!很可能会数据溢出!
经分析,当较小边,min(R,C)为偶数时,无图C所示的情况发生。
因此,我们定义 θ(BFS) = { 0 , BFS 有限扩散方向与 min(R,C)相同
{ 1 , BFS
有限扩散方向与 min(R,C)不同
再定义一个函数 ξ(BFS,R,C)
= θ(BFS) * ( min(R,C) % 2 )
记Nmax为实际的QUENE需求量(最小的,且不会溢出的队列长度)。
则:
Nmax=Cmax
+ ξ(BFS,R,C)
代入上列的各函数,展开得到:
Nmax=2[b](
min(R,C)-σ(R,C)[/b] [b])[/b]
+ θ(BFS) * ( min(R,C) % 2 )
并且,显然我们可以同理得到,对于任意状态的BFS,队列的最小长度是搜索达到最广程度时的状态数量(用循环数组维护)。
由于BFS搜索操作有一个o-c表(open-closed表)来判断是否搜索过,因此,这就预言了BFS所需要的QUENE的长度必然小于图中的实际节点总数(完全矩形图的节点总数恒不大于R*C)。基于QUENE的FIFO原理,对于一个标准图,我们可以很容易地证明:当S点,即起始点在图中间时,所需的QUENE的长度一般大于当S点位于图的边缘时的QUENE长度需求量。
再根据BFS的扩散模式,可以得知,当障碍物越少时,QUENE的需求长度越大,如下表a-1与a-2
4 | 3 | 2 | 3 | 4 |
3 | 2 | 1 | 2 | 3 |
# | # | S | 1 | 2 |
3 | 2 | 1 | 2 | 3 |
4 | 3 | 2 | 3 | 4 |
10 | 11 | 12 | # | 4 |
9 | 10 | # | 2 | 3 |
8 | # | S | 1 | 2 |
7 | 6 | # | 2 | 3 |
6 | 5 | 4 | 3 | 4 |
模拟一个队列,可以得出,a-1图的队列长度远大于a-2图。
为了满足最坏情况,姑且令S位于((R+1)/2,(C+1)/2),即图的中心,且图上无任何障碍。
Cmax=2(min(R,C)-max(R,C)%2) (不完善)
该C 实质上是以S为中心的菱形的有效周长,当R==C时,该公式成立。
然而当R!=C时,如下图,
B-2 可以看成是B-1的所有节点进行过一次BFS操作后的状态,但是,显然B-2的队列内节点数比B-1内的节点数多2。
因此,我们定义σ(R,C) = { 0 , R!=C ||
max(R,C)%2 == 0 ;
{ 1 , R==C && max(R,C)%2 == 1 .
可得出结论:
Cmax=2(min(R,C)-σ(R,C) )
然而QUENE最小长度为Cmax时,可能会溢出,如下图所示:
很容易可以得知,C - 2 所需的QUENE 长度比公式计算出的要大
1!!!很可能会数据溢出!
经分析,当较小边,min(R,C)为偶数时,无图C所示的情况发生。
因此,我们定义 θ(BFS) = { 0 , BFS 有限扩散方向与 min(R,C)相同
{ 1 , BFS
有限扩散方向与 min(R,C)不同
再定义一个函数 ξ(BFS,R,C)
= θ(BFS) * ( min(R,C) % 2 )
记Nmax为实际的QUENE需求量(最小的,且不会溢出的队列长度)。
则:
Nmax=Cmax
+ ξ(BFS,R,C)
代入上列的各函数,展开得到:
Nmax=2[b](
min(R,C)-σ(R,C)[/b] [b])[/b]
+ θ(BFS) * ( min(R,C) % 2 )
并且,显然我们可以同理得到,对于任意状态的BFS,队列的最小长度是搜索达到最广程度时的状态数量(用循环数组维护)。
相关文章推荐
- poj-3026--Borg Maze(最小生成树(kruskal算法)+bfs(队列)
- 【HDU3530】【单调队列(双)】Subsequence 【长度为n的数列,求最长子区间的长度,使得区间的最大值与最小值的差满足一个范围】
- NYOJ 58 最小步数(bfs)
- hdu1430 魔板(双向bfs+输出路径+字典序最小)
- 有趣的题目系列一:实现具有最大值、最小值、中间值的栈和队列
- 为什么operator>>(istream&, string&)能够安全地读入长度未知的字符串?
- php 监控redis队列的长度,在队列堆积的时候实现微信报警
- Bus Pass ZOJ 2913 BFS 最大中取最小的
- 安全算法:3DES密钥长度
- 局域网安全11 cisco辅助协议
- 一道java的基础题:一个线程安全的后进先出队列
- 长度,最小值和最大值
- 关于Ip首部最大长度(60)和最小长度(20)的计算
- 以太网数据帧(802.3)最大与最小长度
- 多线程安全无锁消息队列
- POJ 3984 迷宫问题 手写队列+BFS路径输出
- [转载]分词研究中的最小描述长度(Minimum description length)方法
- JS获取数组最大值、最小值及长度的方法
- hdu 1242 Rescue(优先队列 && 广搜BFS)
- n个最小和(优先队列)