网格中BFS队列的大小

时间:2012-11-18 18:16:43

标签: algorithm

我想在大小为N * N的正方形网格中运行BFS。有一个起始节点。我只能上/下/左/右移动(不是对角线)。 网格中可能存在障碍。

当然我想使用队列来存储我必须访问的节点。它将实现为大小为S(固定大小)的圆形阵列。我的阵列的最小尺寸是多少?即使在最糟糕的情况下,我也不希望它溢出。

类似的问题是:给定网格中的节点,距离起始节点的距离K的最大节点数是多少(对于任何0

我认为很难找到这个问题的确切答案,所以很好的近似就足够了。

见这个例子(最右边的图片):

enter image description here

这不是网格,但我们可以使用相同的模式制作网格(白色代表障碍物,黑色分形是可行走的节点)。我们可以看到, 的节点距中心节点的距离相同(实际上,每当路径分成两个时,这个数字就会翻倍)。 所以我想知道这个数字有多大,以及是否有其他配置产生相同的情况。

为了说清楚我的问题是:这个数字能否比2 * N更大,其中N是N * N方格的大小。

3 个答案:

答案 0 :(得分:0)

您是否想知道距离K处的单元格数量,因为您想知道队列的最大大小?

如果是这样,为什么不使用基于列表的循环缓冲区(或者,使用数组并在缓冲区满后自己重新分配更大的数据)?

这完全忽略了你的问题,列表大小调整行为应该不是问题:如果底层数组的空间不足,大多数实现都会增加一倍,所以你不应该超过O(log n)无论如何重新分配。

答案 1 :(得分:0)

如果我正确理解您的问题,节点与起始节点的最大距离可能是> 2*N因为存在障碍:

. . . * . . .
. * . * . * .
. * . * . * .
. * . * . * .
. * . . . * .
. . * * * . .
. . A * B . . 

如果我计算正确,从A到B的距离是30,这远远超过2 * 7.

如果不是障碍物,很容易计算条纹的最大尺寸,这将是边缘K(或其与网格重叠的部分)的简单菱形,因此最大尺寸为2*N

如上例所示,障碍物可以增加两个节点之间最短路径的长度。他们可以增加最大可能的边缘尺寸吗?我不能很快想出他们所做的一个例子,我怀疑他们做不到,但我也想不出快速证据。

答案 2 :(得分:0)

是的,我认为这个数字可以变得更大,并且使用第三张图像可以非常容易地进行可视化 你提供。

想象一下,你只从该数字的左上角开始。这将N定义为 左上角四分之一的大小,E作为与中心单元具有相同距离的终点数。

现在想象您想要将网格扩展到完整的数字。这意味着你的Nnew现在是2N(即长度加倍,宽度也是如此)。但是,端点E的数量现在翻了四倍(即Enew = 4N),如图所示。

换句话说,随着N的增加,端点的数量增长比N快得多,因此 对于足够大的N,端点的数量必然超过2 * N.