【发布时间】:2016-06-28 22:22:30
【问题描述】:
假设我有一个 2D 间隔网格。一组沿 x 轴和沿 y 轴相同的间隔。现在我必须确定新对象在 x 轴和 y 轴上属于哪个区间。假设一个新对象有数字,一个是 x 坐标,另一个是 y 坐标。通过确定对象适合的 x 和 y 区间,我想检索一些存储的数据。
我想到了 std::map<IntervalX, IntervalY, DataToStore> map 或 std::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 个。
【问题讨论】:
-
“间隔”是什么意思?间隔(间隔)什么和什么?时间间隔?
-
二维值的有序存储听起来有点像quadtree
-
你有多少个“间隔”?有多少“对象”?您的“最佳”指标是什么?
-
现在我们知道它是一个平铺平面:一个简单的解决方案是两个排序数组 - 一个用于 X 轴间隔,一个用于 Y 轴间隔。然后使用
std::lower_bound进行两次搜索。每次搜索的预期复杂度log n。很难做得更好,而且这段代码非常简单,并且非常依赖已经测试过的std::sort和std::lower_bound,如果性能测试表明它是一个瓶颈,你只需要再次查看它。 -
而且...如果您每 2 秒批量获得这 500 个...也对它们进行排序(两次:一次在 x 上,然后在 y 上)然后使用下限按排序顺序搜索每个项目都减少了为下一个项目搜索的项目数量......虽然实际上,现在我们正在讨论一种优化,只有在您确定存在性能问题后才能尝试。
标签: c++ dictionary intervals multimap