我有一个大的数组(> 10 ^ 5个条目)的3D坐标r =(x,y,z),其中x,y和z是浮点数。这是搜索数组中给定坐标r'并给出数组索引的最有效方法。注意,r'可能没有给出与r相同的精度;比方说,如果数组存储坐标(1.5,0.5,0.0)并且r'给出为(1.49999,0.49999,0.0),则算法应该正确地选择坐标。我正在用C开发代码。
为此目的如何使用哈希表的O(1)搜索功能?由于准确性相关的问题,将坐标转换为字符串是不可能的。是否有任何特定的数据结构可以帮助O(1)算法?
由于
OnRoadCoder
答案 0 :(得分:4)
检查已在某些RDBMS上实现的R-trees,如SQLite,以及(我认为)Postgres
答案 1 :(得分:4)
为了在您描述时进行“模糊”搜索(因此您可以支持轻微的不准确性),您将不得不牺牲O(1)算法。
话虽如此,有一些非常好的算法。 Space partitioning(例如使用Octree或KD-Tree)是一种常见的热门选择。
答案 2 :(得分:0)
如果值的范围有限,请选择所需的精度。现在,密钥(1,2,3)将指向曼哈顿距离3 * d(d = 0.5? - 取决于细节)的所有点的链接列表(或更高级的数据结构)(1, 2,3)。您最了解您的应用程序,因此您可以更好地选择d。优化方法取决于数据的分布方式。
<强> 编辑: 强>
这里的弱点是 - 如果你有很多点集中在一个多维数据集中,那么使用关于保证O(1)的哈希表几乎没有办法......更像是O(n):)
某种基于树的数据结构可以保证O(log n)。
答案 3 :(得分:0)
你所问的听起来像是Nearest Neighbour Search。一种方法可能是编写kd-tree(或任何基于空间分区的技术)并使用它来查找最近的查询点。但是你也可以选择基于hash的方法,它基本上是Ipthnc的答案所描述的,但是试图避免退化情况的不良表现。