考虑一个2000 x 2000 2D bool数组。 100,000个元素设置为true,其余为false。
给定一个单元格(x1,y1),我们需要找到最近的单元格(x2,y2)(曼哈顿距离:abs(x1-x2)+ abs(y1-y2)),这是假的。
这样做的一种方法是:
for (int dist = 0; true; dist++)
for ((x2,y2) in all cells dist away from (x1,y1))
if (!array[x2,y2])
return (x2,y2);
在最坏的情况下,我们必须在找到免费的单元格之前迭代100,000个单元格。
是否有我们可以使用的数据结构而不是允许我们更快地执行此搜索的2D数组?
答案 0 :(得分:4)
如果数据是常量并且您有很多查询:
您可能想要使用k-d tree,并寻找最近的邻居。为每个元素插入(i,j)
,以便arr[i][j] = false
。标准的k-d树使用了欧氏距离,但我认为可以修改它以使用曼哈顿距离代替..
如果数据用于一个查询:
您至少需要Omega(n*m)
个操作来读取数据并将其插入到任何数据结构中 - 所以没有必要这样做 - 建议的解决方案将仅胜过任何数据结构的构建。
答案 1 :(得分:2)
您可能有兴趣查看Region QuadTree。这里最初整个图像被建模为根,因为图像包含全0(假设)。然后,当设置特定像素时,首先将图像分成4个象限,将不包括像素的3个象限留作叶子。剩余的象限再次细分,依此类推。直到我们有4个点离开,其中一个被设置。 此表示将有助于在搜索期间排除整个区域,并且搜索时间可以优化为O(log n)