在C++中实现 2D 间隔搜索的最佳方法是什么?
What's the best way to implement a 2D interval search in C++?
假设我有一个二维的间隔网格。x轴上的一组间隔,y轴上的一组间隔。现在我要确定新对象在x轴和y轴上的间隔是2。假设一个新对象有两个数字,一个是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::sort
和std::lower_bound
,你只需要再看一遍,如果性能测试显示它是一个瓶颈。
…如果你每两秒钟就能批量生产500个……对它们也进行排序(两次:一次在x上,然后在y上),然后使用每个项目的下界按排序顺序搜索,以减少搜索下一个项目的项目数量……不过,现在我们讨论的是一种优化方法,只有在确定存在性能问题后才应该尝试。
对于与平面的每个矩形区域相关联的数据:创建一个指向该数据的二维指针数组,由您从std::lower_bound
获得的x和y索引索引。访问二维数组的期望复杂度:常数。
如果间隔不重叠(听起来是这样,因为您声明一个点映射到每个轴上的单个间隔),我只需将它们按排序顺序存储max(Interval_n) <min(Interval_n+1)允许有效的二进制查找。>
如果它们重叠,你可以按最小值排序,但这只对你有一点帮助。
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 在C++中向零方向近似的最佳方法
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 检测win32服务创建和删除的最佳方法
- 在C++中样板"冷/never_inline"错误处理技术的最佳方法是什么?
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 将线程中的数据存储到全局容器的最佳方法?
- 将一系列整数放入类的最佳方法是什么?
- 在派生类中使用基类的私有成员变量的最佳方法
- 在 C++ 中将非指定类型作为参数传递的最佳方法?
- Qt - QVector 和模型视图 - 从列表视图获取自定义类的最佳方法是什么?
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- 比较两个节点坐标的最佳方法是什么?
- 在nodejs中使用本机代码的最佳方法是什么?
- 将 pybind11 绑定标记为已弃用的最佳方法
- C++:将向量传递到构造函数以创建成员变量的最佳方法?
- C++中变量混叠的最佳方法
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?