研究!rsc公司

关于编程的想法和链接,通过

RSS公司

旋转哈希
发布于2008年3月12日星期三。

很久以前,在散列表(又称分散存储文件)之前是一种基本的数据类型,如整数,程序员必须手工实现它们。(如今,手动执行哈希表很少出现在像本科生这样的历史重演之外算法类和C程序。)当时,关于如何处理散列冲突存在激烈的争论。

有一个选项称为直接链接,它使每个表槽都成为链接列表头,然后将散列到该插槽的所有条目保存在链接列表中插槽指向的。(如果使用向前移动启发式.)

另一个选项,称为线性扫描或开放寻址,是尝试表条目小时,然后如果已经满了,试试小时+1,小时+2,依此类推,直到找到空插槽。只有当桌子的尺寸足够大时,这才有效未使用时隙的一部分(例如1/4)。

直接链接和线性扫描仍然是最常见的碰撞解决方法,但在20世纪60年代,探索了更多。还有一种选择是使用非线性扫描,以便数据项生成哈希值序列小时1,小时2,小时,以及那些轮流尝试桌子上的插槽。两个对象具有相同的小时1不一定有同样的小时2不同于线性扫描。但哈希是一个相对的操作缓慢。花时间和代码计算所有这些额外的哈希值吗功能?

这为道格·麦克罗伊的1963年奠定了基础致通信部的信函ACM Pracniques页面的描述了Vic Vyssotsky的诡计:

文件搜索的一种变体方法

我想宣传V.a.Vyssotsky的一个改进技巧分散存储文件的效率。

Vyssotsky的想法,用于一个非常简短而优雅的IBM 7090将在第一个探测失败后继续随机搜索:

(1) 根据数据项,计算文件中的伪随机地址。
(2) 如果项目位于此位置,或者该位置为空,则作业完成。
(3) 如果存在另一个项目,请使用由计算的新地址再次进行探测另一个伪随机函数,直到伪随机函数的存量已经筋疲力尽。
(4) 作为最后的手段,当所有伪随机函数都用完时,执行对整个文件进行线性搜索,查找项目或孔,以先到者为准。

在Vyssotsky的程序中,后面的随机函数通常是从第一个。他计算了一个n个-位函数,其中只有第一个位用作地址。随后,通过旋转获得随机地址相同的n个位。之后n个他放弃了探索,转而采用线性搜索。

更常见的分散存储方法采用chaning或线性搜索稍后的探测。就平均数而言,链接是最有效的方法每个项目的探测数,但为链接信息支付存储空间的价格。线性搜索在时间上很昂贵。表一,比较探针的平均数量这些方法的每个项目都基于普遍的一致性和独立性假设:

表一.每个项目的平均探针数量
负载系数 连锁[1] 线性搜索[2] 随机搜索
第页1+p/21+½p/(1-p)-第页-1对数(1-p)
.501.251.51.39
.751.382.51.83
.901.455.52.56

链接和随机搜索有明确的优势。如果储存要求允许,链子是最好的。Vyssotsky的随机搜索花费了很低的时间在紧迫情况下实现最终存储利用率的惩罚。

典型的7090应用程序使用了一个包含两个单词的项目的文件。链接将添加一个额外的单词或,使用额外的编码处理非整数字长项目的复杂性,每项额外加半个单词。表II比较了查找时间对于给定一定存储量的各种文件方案:

表二。各种文件方案的查找时间
负载系数
3字项目
链传动
3个单词
链传动
2½个单词
线性的
2个单词
随机
2个单词
0.61.31.251.331.30
0.81.41.331.571.49
11.51.4221.65
1.2溢出1.5032.01
1.4溢出溢出62.90

参考文献:

1.Johnson,L.R.二级密钥寻址的间接链接方法。通信ACM 4(1961), 218-223.

2.Schay,G.和Spruth,W.G.对一种文件寻址方法的分析。通信ACM 5(1962), 459-462.


M.D.McIlroy博士
贝尔电话实验室。
新泽西州默里山。

(3月余下时间可能会断断续续发布。)

(评论最初通过Blogger发布。)

  • 纳索伦加 (2008年3月12日上午11:25)在我看来,使用简单的位旋转方法,冲突组的所有成员都将具有相同的地址序列,这相当于线性扫描。那么为什么它表现得更好呢?

  • 俄罗斯考克斯 (2008年3月12日下午12:08)@nasorenga:它的性能更好,因为您计算的比特数超过了单个散列所需的比特数,但不一定是n个不同散列所需要的比特数。您可以计算一个36位的散列,然后使用不同的16位窗口作为扫描序列。

  • 纳索伦加 (2008年3月12日下午12:21)@rsc:我认为你关于计算几个散列的观点适用于非线性扫描,而不适用于线性扫描,这就是本文中所比较的随机扫描顺便说一句,我突然想到,随机比线性的优势在于,每个碰撞组的扫描序列都是唯一的。使用线性扫描,当开始形成团块时,它会影响所有附近碰撞组的性能。这可以解释随机扫描带来的性能改进。

  • 迈克尔 (2008年3月22日凌晨12:54)嗨,罗斯,

    生成并尝试多个哈希值发现了一个最新的杜鹃哈希应用程序,它提供了最坏情况下的O(1)查找。它工作得很好——我在生产中使用了一个实现,它保持了200多万个元素,负载系数为0.99。请参见http://www.it-c.dk/people/pages/papers/cuckoo-bunderrad.pdf,但要实现这些高负载因子,您必须将散列函数分区的数量概括为5个左右。

  • 迈克尔 (2008年3月22日凌晨1:01)呃,我是说Russ。真尴尬,对不起!:)