【发布时间】:2011-11-15 01:17:30
【问题描述】:
我需要用 8 字节整数键构建一个快速查找表。表的构建是在初始化期间完成的,之后数据不会更新。数据项的数量低于 100K,因此我可以使用额外的空间来使哈希表稀疏。然而,数据查找必须尽可能高效。 据我了解,Cuckoo Hashing 似乎很适合这种情况。不过有几点我不是很清楚:
在这种情况下应该使用哪一组哈希函数?一些论文认为标准的“((a*x + b) mod p) mod m”函数族不是一个好的选择。此外,p 必须是素数 > UInt64.MaxValue,这使得计算函数变得困难。乘法移位 "(a*x) >> (w - log(m))" 系列也不是一个好的选择。我找不到关于使用什么功能的明确答案。
“插入”操作可以触发重新散列。所以理论上插入时间在最坏的情况下是无限的(你只是继续选择一个导致重新散列的“坏”函数)。我知道,这种可能性接近于零,但我很难在生产中简单地忽略这个问题。
对于所描述的问题是否有更好的数据结构? original Cuckoo Hash paper 表明,当您有足够的额外空间(项目数量的两到三倍)时,简单的线性探测散列可以更有效。另外,在构建阶段,我可以检查是否有两个以上的键发生冲突并选择不同的散列函数(我有能力做几次并选择最好的一个)。
非常感谢您的回复。
【问题讨论】:
-
这是用于高频交易的吗? :) 你有关于密钥分配的任何信息吗?
-
不,它不适用于 HFT :) 我没有任何关于密钥分配的信息。由于某些现实世界的事件,人们输入了密钥。我只知道它们不是均匀分布的。
-
啊,是的,在这种情况下,我打算给你一个具体的答案——一些高频交易的人问我关于布谷鸟哈希的问题
标签: dictionary hashtable hash