c++ - 在 C++ 中实现二维区间搜索的最佳方法是什么?

标签 c++ dictionary intervals multimap

<分区>

假设我有一个二维间隔网格。一组沿 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 个。

最佳答案

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

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

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

关于c++ - 在 C++ 中实现二维区间搜索的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38087252/

相关文章:

Python:优化区间之间的成对重叠

Android AlarmManager 在长时间后停止触发

c++ - 带有 gtest(C++) 的 CMakeLists C 程序

html - map 区域 onclick - 防止边框突出显示

python - 将字典循环Python转换为Json

c++ - std::map - C++ 需要所有声明的类型说明符

javascript - 检测用户是否单击了弹出窗口中的元素

c# - 如何在本地修改纹理?

c++ - 如何通过将每个命令分配给线程来在 C++ 中同时执行 linux 系统命令?

c++ - 部分更改 C++ 库同时保持库的其余部分完整的最佳实践