我想在大小为N * N的正方形网格中运行BFS。有一个起始节点。我只能上/下/左/右移动(不是对角线)。 网格中可能存在障碍。
当然我想使用队列来存储我必须访问的节点。它将实现为大小为S(固定大小)的圆形阵列。我的阵列的最小尺寸是多少?即使在最糟糕的情况下,我也不希望它溢出。
类似的问题是:给定网格中的节点,距离起始节点的距离K的最大节点数是多少(对于任何0 我认为很难找到这个问题的确切答案,所以很好的近似就足够了。 见这个例子(最右边的图片): 这不是网格,但我们可以使用相同的模式制作网格(白色代表障碍物,黑色分形是可行走的节点)。我们可以看到, 的节点距中心节点的距离相同(实际上,每当路径分成两个时,这个数字就会翻倍)。
所以我想知道这个数字有多大,以及是否有其他配置产生相同的情况。 为了说清楚我的问题是:这个数字能否比2 * N更大,其中N是N * N方格的大小。
答案 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.