Algorithm 网格中BFS的队列大小

Algorithm 网格中BFS的队列大小,algorithm,Algorithm,我想在大小为N*N的正方形网格中运行BFS。有一个起始节点。我只能上/下/左/右移动(不是对角移动)网格中可能有障碍物。 当然,我想使用队列来存储我必须访问的节点。它将被实现为大小为S(固定大小)的圆形数组。我的阵列的最小大小是多少?我不希望它溢出,即使是在最坏的情况下 类似的问题是:给定网格中的一个节点,距离起始节点K的最大节点数是多少(对于任何0

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

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

类似的问题是:给定网格中的一个节点,距离起始节点K的最大节点数是多少(对于任何0 我认为很难找到这个问题的确切答案,所以一个好的近似值就足够了

请参见此示例(最右边的图片):

这不是一个网格,但我们可以使用相同的模式制作网格(白色表示障碍物,黑色分形表示可行走节点)。我们可以看到,在距离中心节点相同的位置有很多节点(实际上,每次路径一分为二时,这个数字都是原来的两倍)。 所以我想知道这个数字会有多大,以及是否有其他配置会导致相同的情况


为了清楚起见,我的问题是:这个数字能否大于2*N,其中N是N*N方格的大小

是不是因为想知道队列的最大大小,所以想知道距离K处的单元数

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


这样就完全省去了您的问题,列表大小调整行为也不应该成为问题:如果空间不足,大多数实现都会将基础阵列的大小增加一倍,因此您不应该得到超过O(log n)的重新分配。

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

. . . * . . .
. * . * . * .
. * . * . * .
. * . * . * .
. * . . . * .
. . * * * . .
. . A * B . . 
如果我计算正确的话,从A到B的距离是30,这比2*7多得多

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


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

是的,我认为这个数字可以变大,使用第三张图片应该很容易想象出来 你提供的

假设您仅从该图左上角的四分之一开始 左上角四分之一的大小,E表示到中心单元格距离相同的端点数

现在想象一下,你想将你的网格扩展到完整的图形。这意味着你的Nnew现在是2N(即长度增加了一倍,宽度也增加了一倍)。然而,端点E的数量现在增加了四倍(即Enew=4N),如图所示

换句话说,随着N的增加,端点的数量增长得比N快得多,因此
端点的数量一定会超过2*N,如果足够大的话。

您能否在网格中多次经过同一个节点,直到必须清空队列为止?否则,在最坏的情况下,您可以运行整个网格,或N^2个位置。否则,什么是限制,因为您可能不得不停止某个时候?这是一个BFS,所以每个节点将只添加(和弹出)一次。我不能同时拥有N*N个位置。对不起,我没有真正理解这个问题。您有一个网格NxN,并且从给定点开始执行BFS。网格中已确定节点的子节点是什么?没有被视为兄弟姐妹的邻居?有什么障碍呢?在3x3的网格中,如果从网格中最左边最上面的节点开始,搜索范围如何?你能举个例子吗?你什么时候停止访问一个节点?例如,是否可以访问节点1-2-1-2-1-2?我将发布一个新的示例我不想计算两个节点之间的最大距离,而是计算某一距离处的最大节点。@user1637030,我理解这一点。但是你会问,“距离起始节点K的最大节点数是多少(对于任何0