在C++中实现 2D 间隔搜索的最佳方法是什么?

What's the best way to implement a 2D interval search in C++?

本文关键字:最佳 方法 是什么 搜索 C++ 实现 2D      更新时间:2023-10-16

假设我有一个二维的间隔网格。x轴上的一组间隔,y轴上的一组间隔。现在我要确定新对象在x轴和y轴上的间隔是2。假设一个新对象有两个数字,一个是x坐标,另一个是y坐标。通过确定对象在x和y中的适合区间,我想检索一些存储的数据。

我想到了std::map<IntervalX, IntervalY, DataToStore> mapstd::multimap<IntervalX, IntervalY, DataToStore> map之类的东西。关于如何实现这一点的任何建议,以便检索间隔对的存储数据非常高效/快速,而不是在O(n²)中。

编辑:

间隔由两个浮点值决定。例如:沿x轴的间隔[0.5,3.0]。因此,0.5包含在这个区间内,3.0不包含在这个区间内,而是包含在x正方向的下一个区间内。

区间不相交,不重叠,也不嵌套。区间的并集是直线的某一完整段。我把平面平铺成一组矩形,我想知道这个点落在哪个矩形区域。

例如:沿着x轴从0到10开始的间隔大小为0.5,沿着y轴从2到15开始的间隔大小为1.0。给定点P(x=0.7,y=3.0)落在哪个区间?它是x轴上的间隔2 y轴上的间隔2。现在需要检索为该间隔对存储的数据。

在我的用例中,我将沿着每个轴有大约10000个间隔,并且确定对象的间隔必须很快,因为我必须每2秒查找大约500个(或多或少)。

现在我们知道它是一个平铺平面:一个简单的解决方案是两个排序数组-一个用于x轴间隔,一个用于y轴间隔。然后使用std::lower_bound进行两次搜索。每次搜索的期望复杂度log n。很难做得更好,这段代码将是如此简单,依赖于已经测试过的std::sortstd::lower_bound,你只需要再看一遍,如果性能测试显示它是一个瓶颈。

…如果你每两秒钟就能批量生产500个……对它们也进行排序(两次:一次在x上,然后在y上),然后使用每个项目的下界按排序顺序搜索,以减少搜索下一个项目的项目数量……不过,现在我们讨论的是一种优化方法,只有在确定存在性能问题后才应该尝试。

对于与平面的每个矩形区域相关联的数据:创建一个指向该数据的二维指针数组,由您从std::lower_bound获得的x和y索引索引。访问二维数组的期望复杂度:常数。

如果间隔不重叠(听起来是这样,因为您声明一个点映射到每个轴上的单个间隔),我只需将它们按排序顺序存储max(Interval_n) <min(Interval_n+1)允许有效的二进制查找。>

如果它们重叠,你可以按最小值排序,但这只对你有一点帮助。