我需要在数据结构中存储以下值,
id x y z
0 0.1 0.1 0.1
1 0.2 0.1 0.6
2 0.01 0.3 0.1
.....
现在我需要匹配x,y,z double值并获得相应的id(int)值。我可能需要存储大约400000个值。我应该使用哪些数据结构进行有效搜索? C ++是否附带任何支持我的要求的内置结构。
答案 0 :(得分:2)
如果您对NN搜索不感兴趣,可以使用std::unordered_set
。但是,您需要定义自己的哈希函数。
这是一个(可能很可怕)的例子:
struct entry
{
int id;
double x, y, z;
// constructor if needed, etc...
};
struct entry_hasher
{
size_t operator()(const entry &e) const
{
std::hash<double> h;
return h(e.x) ^ (h(e.y) << 1) ^ (h(e.z) << 2);
}
};
std::unordered_set<entry, entry_hasher> entries;
否则,标准不提供能够进行几何查询的容器(例如NN)。
答案 1 :(得分:1)
如果您只需要进行精确搜索,那么哈希表(unordered_map)将是一个不错的选择。将密钥设为tuple或结构,值为int id。
如果你需要进行区间搜索(例如找到最接近x的元素)并且你总是按顺序从x,y,z搜索,那么你需要一个有序的数据结构。有序树(map)应该可以工作。使用三级嵌套map
,这样您就可以通过基本上mymap[x][y][z]
执行搜索,并使用您想要应用的任何间隔规则。
如果你需要一个更复杂的搜索,你可以从任何元素开始或搜索你只知道后两个元素,那么你需要一个多维有序数据结构,它可以用来分割维度世界空间用于对数搜索。一些示例是octtree或k-d tree。据我所知,没有octtree / k-d树的标准库实现。此类数据结构有许多变体,例如,您可以使用跳过列表而不是树。
答案 2 :(得分:1)
这可能对您来说是个坏消息,但我认为最适合您的目的是k-d tree,并且它没有在标准库中实现。
此数据结构允许您搜索最近邻居到多维空间中的任何给定点(在您的情况下为3d空间)。这将保证在处理浮点键时最有可能发生的舍入错误的容忍度。
但是,此DS非常受欢迎,我相信您将能够找到它的在线实现。
答案 3 :(得分:1)
您可以使用 OcTree (http://en.wikipedia.org/wiki/Octree)。它比基于二叉树的std中的任何容器更快更方便。您也不必担心索引或散列函数。但是它需要更多的内存。它甚至可以用于NN(最近邻居)搜索。另一种选择是 Kd-tree (http://en.wikipedia.org/wiki/K-d_tree)。两者都不是性病的一部分。 KdTree比OcTree需要更少的内存,有时甚至更快。您应该能够使用google找到OcTree或KdTree的优秀C ++实现。