Hash 静态、大型、核心外字典的快速成员算法是什么

Hash 静态、大型、核心外字典的快速成员算法是什么,hash,dictionary,static,tree,Hash,Dictionary,Static,Tree,我有一个静态字典,其中包含数百万个键,这些键引用了存储在核心之外的稀疏数据结构中的值。键的数量只是值数量的一小部分,比如说10%。密钥大小通常为64位。键按线性顺序排列,查询通常由按此顺序排列的键组成。数据压缩是一个因素,但对数据大小影响最大的是值,而不是键。密钥压缩有帮助,但并不重要。如果可能的话,查询时间应该是恒定的,并且应该是快速的,因为用户正在和数据交互 考虑到这些条件,我想知道一种查询字典的有效方法,以确定字典中是否包含特定的键。查询速度是重中之重,构建时间不是那么关键 目前,我正在研

我有一个静态字典,其中包含数百万个键,这些键引用了存储在核心之外的稀疏数据结构中的值。键的数量只是值数量的一小部分,比如说10%。密钥大小通常为64位。键按线性顺序排列,查询通常由按此顺序排列的键组成。数据压缩是一个因素,但对数据大小影响最大的是值,而不是键。密钥压缩有帮助,但并不重要。如果可能的话,查询时间应该是恒定的,并且应该是快速的,因为用户正在和数据交互

考虑到这些条件,我想知道一种查询字典的有效方法,以确定字典中是否包含特定的键。查询速度是重中之重,构建时间不是那么关键

目前,我正在研究与外部存储相关的缓存无关的b+树和保序最小完美散列

在这一点上,CHD或其他形式的散列似乎是一个候选。由于密钥是以近似线性顺序查询的,因此保留顺序的散列似乎可以避免缓存未命中,但我没有足够的知识来说明CHD是否可以保留密钥的顺序。恒定时间查询也是可取的。搜索是O(1),但键空间上的查询时间上限也是未知的

树木似乎不那么吸引人。虽然有一些缓存无关和特定于缓存的方法,但我认为大部分工作都是针对动态字典上的范围查询,而不是恒定时间成员查询。处理器和内存通常不喜欢分支

有很多问题都是这样问的,但是这个案例(希望)以一种可能对其他人有用的方式限制了这个问题

如有任何反馈,将不胜感激,
谢谢

我建议你尝试使用bloom filter
bloom filter是一种概率数据结构:它告诉我们元素肯定不在集合中,或者可能在集合中
谢谢Ilya-这看起来是一个很好的开始原型的方法。我正在深入研究CHD是否可以保持顺序:似乎sparsehash组最近不是很活跃,但从我在www上收集到的信息来看,它很受欢迎,并且有一个CHD实现。伊利亚-请随时提交答案。只是为了回馈。。如果内存/速度权衡很有吸引力,那么这也值得一看: