Algorithm “查找最近的”;“真的”;二维布尔矩阵中的元素?

Algorithm “查找最近的”;“真的”;二维布尔矩阵中的元素?,algorithm,matrix,language-agnostic,boolean,closest-points,Algorithm,Matrix,Language Agnostic,Boolean,Closest Points,我有一个带有布尔值的2D矩阵,更新频率很高。我想在矩阵中选择一个2D索引{x,y},并在表中找到最近的元素,该元素为“true”,而不需要遍历所有元素(矩阵是巨大的) 例如,如果我有矩阵: 0000100 0100000 0000100 0100001 我选择一个坐标{x1,y1}比如{4,3},我想返回最接近的“真”值的位置,在本例中是{5,3}。使用标准毕达哥拉斯方程测量元素之间的距离: distance=sqrt(distX*distX+distY*distY)其中distX=x1-x和

我有一个带有布尔值的2D矩阵,更新频率很高。我想在矩阵中选择一个2D索引{x,y},并在表中找到最近的元素,该元素为“true”,而不需要遍历所有元素(矩阵是巨大的)

例如,如果我有矩阵:

0000100
0100000
0000100
0100001
我选择一个坐标
{x1,y1}
比如{4,3},我想返回最接近的“真”值的位置,在本例中是{5,3}。使用标准毕达哥拉斯方程测量元素之间的距离:

distance=sqrt(distX*distX+distY*distY)
其中
distX=x1-x
distY=y1-y

我可以遍历矩阵中的所有元素,并保留一个“真”值列表,然后选择距离结果最短的一个,但效率极低。我可以使用什么算法来减少搜索时间


详细信息:矩阵大小为1920x1080,每帧大约进行25次查询。每一帧都会更新整个矩阵。我正在努力保持一个合理的帧速率,超过7fps就足够了

如果矩阵总是被更新,那么就不需要构建一些辅助结构,如距离变换、Voronoy图等


您可以像从查询点传播的BFS(面包优先搜索)一样执行搜索。与通常BFS的唯一区别是欧几里德度量。因此,您可以生成按
(u^2+v^2)
排序的
(u,v)
对,并检查按
(+-u,+-v),(+-v,+-u)
组合移位的对称点(当
u
v
为零时为四个点,否则为八个点)

您可以使用类似于四叉树的树(请参阅)的树数据结构来存储所有带值的位置“true”。通过这种方式,应该可以快速迭代所有“true”“给定位置附近的值。此外,如果位置值发生变化,则可以在对数时间内更新树。

对于许多查询,矩阵是否为常数?否,它总是在更新。@MathUsumm但矩阵的最大大小和查询总数是多少?1920x1080,以合理的帧速率处理(即每秒多次).所以矩阵对于大约25个查询保持不变,然后整个矩阵发生变化?我也没有看到任何其他好的方法。但我认为,如果查询的数量很大,矩阵也很大,那么这就不够快了。欧几里德距离让这变得很困难。使用曼哈顿距离(distance=abs(distX)+abs(distY))有意义吗?