【问题标题】:What's the best way to implement a 2D interval search in C++? [closed]在 C++ 中实现 2D 区间搜索的最佳方法是什么? [关闭]
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    如果间隔不重叠(听起来像,因为您声明一个点映射到每个轴上的单个间隔),我只需按排序顺序存储它们 max(Interval_n)

    如果它们确实重叠,您可以按 min 排序,但这只会对您有一点帮助。

    【讨论】:

      猜你喜欢
      • 2010-12-14
      • 2013-05-25
      • 2016-05-23
      • 2016-01-19
      • 2021-04-24
      • 1970-01-01
      • 2011-05-24
      • 2011-03-20
      • 1970-01-01
      相关资源
      最近更新 更多