我有一个带有布尔值的二维矩阵,它经常更新。我想在矩阵中选择一个二维索引{x,y},找到最近的元素" true"在表中,没有经过所有元素(矩阵很大)。
例如,如果我有矩阵:
0000100
0100000
0000100
0100001
我选择一个坐标{x1, y1}
,例如{4,3},我想要返回最近的" true"的位置。值,在这种情况下是{5,3}。使用标准的毕达哥拉斯方程测量元素之间的距离:
distance = sqrt(distX * distX + distY * distY)
其中distX = x1 - x
和distY = y1 - y
。
我可以浏览矩阵中的所有元素并保留一个" true"值并选择具有最短距离结果的值,但效率极低。我可以使用什么算法来缩短搜索时间?
详细信息:矩阵大小为1920x1080,每帧大约需要25个查询。每帧都更新整个矩阵。我试图保持合理的帧速率,超过7fps就足够了。
答案 0 :(得分:1)
如果总是更新矩阵,那么就不需要建立一些辅助结构,如距离变换,Voronoy图等。
您可以执行搜索,例如从查询点传播的BFS(面包优先搜索)。与通常的BFS的唯一区别是欧几里德指标。因此,您可以按(u, v)
生成(u^2+v^2)
对,并检查(+-u,+-v),(+-v,+-u)
组合移位的对称点(u
或v
为零时为4分,否则为8分) )
答案 1 :(得分:0)
您可以使用四叉树之类的树数据结构(请参阅https://en.wikipedia.org/wiki/Quadtree)来存储值为" true"的所有位置。通过这种方式,应该可以快速迭代所有" true"给定位置附近的值。此外,如果位置的值发生变化,则可以在对数时间内更新树。