用于快速搜索的二进制数据结构

Posted

技术标签:

【中文标题】用于快速搜索的二进制数据结构【英文标题】:Binary data structure for fast searching 【发布时间】:2011-10-27 08:34:21 【问题描述】:

我正在寻找一种能够实现非常快速搜索的二进制数据结构(树、列表)。我只会在程序的开头/结尾添加/删除项目,一次。所以它将是固定大小的,因此我并不关心插入/删除速度。基本上我正在寻找的是一种提供快速搜索且不占用太多内存的结构。

谢谢

【问题讨论】:

您的数据的性质是什么?可以排序吗?它的大小是多少,内存限制是多少? Haspemulator,它大约有五个指针,我猜它可以排序,因为每条数据都有一个唯一的指针。它会有很多节点,平均大约 50 个。 @myrkos,所以你需要搜索 50 个整数,还是搜索 50 个包含 5 个指针的结构实例? 【参考方案1】:

最快的往往是 trii/trie。我实现的速度比 std::unordered_map 快 3 到 15 倍,除非您使用大量元素,否则它们往往会使用更多内存。

【讨论】:

【参考方案2】:

所以键可以是一个简单的类型,值是一个由五个指针组成的小结构。

只有 50 个元素,它开始变得足够小,以至于 Big-O 理论性能可能会被算法或结构的固定时间开销所掩盖或至少可以衡量。

例如一个数组,线性搜索的向量通常在少于十个元素的情况下是最快的,因为它的结构简单且内存紧。

我会包装容器并按时间在其上运行真实数据。从 STL 的向量开始,转到标准 STL 映射,升级到 unordered_map,甚至可以尝试 Google 的密集或稀疏哈希映射: http://google-sparsehash.googlecode.com/svn/trunk/doc/performance.html

【讨论】:

【参考方案3】:

一个不容忽视的容器是排序的 std::vector。

它肯定会在内存消耗上获胜,特别是如果您可以预先保留正确的数量。

【讨论】:

+1。使用lower_bound 在已排序的向量中查找元素基本上模拟了set 的搜索行为,但vector 的内存效率更高,因此查找可能也会更快,因为内存局部性. 只需确保进行二进制搜索以查找您的数据,如果您不必在运行时更改数据,这是一个很好的答案,对于一个小的(50ish)集合。跨度> 【参考方案4】:

在 Boost C++ 库 here 中查找无序集。与红黑树不同,红黑树的搜索时间为 O(log n),无序集基于散列,平均为您提供 O(1) 的搜索性能。

【讨论】:

【参考方案5】:

std::map 和哈希映射是不错的选择。他们也有构造函数来简化一次性施工。

哈希映射将关键数据放入返回数组索引的函数中。这可能比std::map 慢,但只有分析才能说明问题。

我的首选是std::map,因为它通常被实现为一种二叉树。

【讨论】:

【参考方案6】:

Red-Black tree 是一种高效(尽管有点混乱)的算法。

在内部,c++ 标准库使用红黑树来实现std::map - 参见this question

【讨论】:

以上是关于用于快速搜索的二进制数据结构的主要内容,如果未能解决你的问题,请参考以下文章

教材快速浏览

OI已学知识点总结

Elasticsearch之数据压缩算法

用于检查二进制数组是不是可以旋转到元素总和不超过 1 的快速算法

PCL学习总结KdTree搜索

如何在数据库索引中使用二进制搜索