高效搜索的数据结构

时间:2019-04-25 15:44:17

标签: c++ data-structures c++17

我正在寻找有关在以下情况下使用的适当数据结构的建议 我为例如的键定义了最小值和最大值。

Key          Min Value                Max Value

key1          0 .5                    4.5
key2          1                       9
key3          0.75                    1.5

我必须将每个值细分为更多子存储桶,以使最小值和最大值之间的差不能超过1,并且每个存储桶最小值将增加0.5。

例如key1将进一步细分

Key               Bucket   Min Value                Max Value
key1             B1       0.5                      1.5
key1             B2       1                        2
key1             B3       1.5                      2.5
key1             B4       2                        3
key1             B5       2.5                      3.5
key1             B6       3                        4
key1             B7       3.5                      4.5

一旦创建了这些存储桶(只有一次),我就需要查找给定键和值的合格存储桶。

例如key1和2.2的合格存储桶是B3和B4。

当前,我将所有存储桶存储在std::map<Key, std::vector<Buckets> >

其中存储桶是具有存储桶名称,最小值和最大值作为变量的结构。

除了std::map<Key, std::vector<Buckets> >之外,我还能使用什么替代方法来加快搜索过程?

2 个答案:

答案 0 :(得分:1)

std::vector本身(或std::binary_search进行排序)的线性搜索在现代硬件上的表现出众。连续的内存布局非常适合缓存层次结构和预取器。 std::vector通常击败了基于节点的容器,这些容器必须在整个内存中追逐指针(即使像BigO这样的东西会告诉你它会失去很多空间)。但是,您必须始终针对自己的特定用例对不同的解决方案进行基准测试,以便确定。

答案 1 :(得分:1)

您可以将所有记录放入std::vector中,然后使用std::map<key, vector-index>。这称为创建索引表。

对于少量数据,线性搜索与使用索引表是没有区别的(实际上可能更快)。

在互联网上搜索“第一范式”,以优化数据。