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

时间:2016-06-28 22:22:31

标签: c++ dictionary intervals multimap

假设我有一个2D网格间隔。沿x轴的一组间隔和沿y轴的相同间隔。现在我必须确定一个新对象属于两个x轴和y轴的间隔。假设一个新对象必须是数字,一个是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个。

2 个答案:

答案 0 :(得分:1)

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

并且......如果你每2秒批量获得500个......也可以对它们进行排序(两次:一次在x上然后在y上)然后使用每个项目的下限按排序顺序搜索以减少搜索下一个项目的项目数量......但实际上,我们现在讨论的是一种只有在确定性能问题后才能尝试的优化。

关于与平面的每个矩形区域相关联的数据:创建指向该数据的二维指针数组,使用从std::lower_bound返回的x和y索引编制索引。访问二维数组的预期复杂性:常数。

答案 1 :(得分:0)

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

如果它们重叠,你可以按分钟排序,但这只会对你有所帮助。