旋转哈希
很久以前,在散列表(又称分散存储文件)之前是一种基本的数据类型,如整数
,程序员必须手工实现它们。(如今,手动执行哈希表很少出现在像本科生这样的历史重演之外算法类和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/2 | 1+½p/(1-p) | -第页-1对数(1-p) |
.50 | 1.25 | 1.5 | 1.39 |
.75 | 1.38 | 2.5 | 1.83 |
.90 | 1.45 | 5.5 | 2.56 |
链接和随机搜索有明确的优势。如果储存要求允许,链子是最好的。Vyssotsky的随机搜索花费了很低的时间在紧迫情况下实现最终存储利用率的惩罚。
典型的7090应用程序使用了一个包含两个单词的项目的文件。链接将添加一个额外的单词或,使用额外的编码处理非整数字长项目的复杂性,每项额外加半个单词。表II比较了查找时间对于给定一定存储量的各种文件方案:
表二。各种文件方案的查找时间
负载系数 3字项目
| 链传动 3个单词
| 链传动 2½个单词
| 线性的 2个单词
| 随机 2个单词
|
0.6 | 1.3 | 1.25 | 1.33 | 1.30 |
0.8 | 1.4 | 1.33 | 1.57 | 1.49 |
1 | 1.5 | 1.42 | 2 | 1.65 |
1.2 | 溢出 | 1.50 | 3 | 2.01 |
1.4 | 溢出 | 溢出 | 6 | 2.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月余下时间可能会断断续续发布。)