我正在寻找有关在以下情况下使用的适当数据结构的建议 我为例如的键定义了最小值和最大值。
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> >
之外,我还能使用什么替代方法来加快搜索过程?
答案 0 :(得分:1)
std::vector
本身(或std::binary_search
进行排序)的线性搜索在现代硬件上的表现出众。连续的内存布局非常适合缓存层次结构和预取器。 std::vector
通常击败了基于节点的容器,这些容器必须在整个内存中追逐指针(即使像BigO这样的东西会告诉你它会失去很多空间)。但是,您必须始终针对自己的特定用例对不同的解决方案进行基准测试,以便确定。
答案 1 :(得分:1)
您可以将所有记录放入std::vector
中,然后使用std::map<key, vector-index>
。这称为创建索引表。
对于少量数据,线性搜索与使用索引表是没有区别的(实际上可能更快)。
在互联网上搜索“第一范式”,以优化数据。