【问题标题】:A few questions on Cuckoo Hashing关于 Cuckoo Hashing 的几个问题
【发布时间】:2011-11-15 01:17:30
【问题描述】:

我需要用 8 字节整数键构建一个快速查找表。表的构建是在初始化期间完成的,之后数据不会更新。数据项的数量低于 100K,因此我可以使用额外的空间来使哈希表稀疏。然而,数据查找必须尽可能高效。 据我了解,Cuckoo Hashing 似乎很适合这种情况。不过有几点我不是很清楚:

  1. 在这种情况下应该使用哪一组哈希函数?一些论文认为标准的“((a*x + b) mod p) mod m”函数族不是一个好的选择。此外,p 必须是素数 > UInt64.MaxValue,这使得计算函数变得困难。乘法移位 "(a*x) >> (w - log(m))" 系列也不是一个好的选择。我找不到关于使用什么功能的明确答案。

  2. “插入”操作可以触发重新散列。所以理论上插入时间在最坏的情况下是无限的(你只是继续选择一个导致重新散列的“坏”函数)。我知道,这种可能性接近于零,但我很难在生产中简单地忽略这个问题。

  3. 对于所描述的问题是否有更好的数据结构? original Cuckoo Hash paper 表明,当您有足够的额外空间(项目数量的两到三倍)时,简单的线性探测散列可以更有效。另外,在构建阶段,我可以检查是否有两个以上的键发生冲突并选择不同的散列函数(我有能力做几次并选择最好的一个)。

非常感谢您的回复。

【问题讨论】:

  • 这是用于高频交易的吗? :) 你有关于密钥分配的任何信息吗?
  • 不,它不适用于 HFT :) 我没有任何关于密钥分配的信息。由于某些现实世界的事件,人们输入了密钥。我只知道它们不是均匀分布的。
  • 啊,是的,在这种情况下,我打算给你一个具体的答案——一些高频交易的人问我关于布谷鸟哈希的问题

标签: dictionary hashtable hash


【解决方案1】:
  1. 几乎任何散列函数都可以,因为您只有 100K 个键,只需确保它至少是 2-wise 独立的(请参阅 http://www.eecs.harvard.edu/~michaelm/postscripts/soda2008b.pdf)或者只是使用快速的东西。

  2. 如果您进行详尽的搜索,插入过程将在摊销/预期 O(1) 时间内工作,因为您在一开始就这样做了,您会没事的。如果您的利用率低于 50%(即插槽数 > 2 倍键数),则插入触发重新散列的可能性很小。您可以通过使用 stash (http://www.eecs.harvard.edu/~michaelm/postscripts/esa2008full.pdf) 使其更小,并且查找仍然很小。无论如何,只要重试,直到一切正常,因为您只是在初始化时这样做。

  3. 切割两次,测量一次。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-12
  • 2011-08-24
  • 2013-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多