数据容器获取大数据范围

时间:2015-02-23 10:05:25

标签: c++ algorithm containers

我有一个超过100000点的3D对象,这些点有一个id和x,y,z位置值。我需要找到特定x范围的点id,其中y和z值是静态的。

例如 -

 ---- --- --- --- 
| Id | x | y | z |
|----|---|---|---|
|    |   |   |   |

如果我需要找到(x,y,z)之间的点id

  • p1-0.1,0.23,0.78
  • p2 - 123.0,0.23,0.78

我应该使用什么样的数据容器来有效地实现这一目标?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

因为2坐标总是静态的,你可以为每个坐标做一个简单的排序数组,或者平衡BST(或skip list / B+ tree / ...)如果你还需要支持有效的添加/删除。 (想一想,跳过列表可能更容易实现,只需找到范围内的第一个点,并迭代直到你超出范围)。

这将需要O(logN)进行查询(如果您需要实际点O(logN+k),其中k是点),并O(NlogN)初始化。

所以,算法将是:

  1. 识别非静态点
  2. 有效搜索"最低"指向范围
  3. 有效搜索"最大"指向范围
  4. 返回它们之间的所有点。
  5. 2 + 3的复杂度为O(logN),其中4为O(k),其中k为返回的点数(如果您需要实际点,则无法避免;不具体的聚合)。