这段代码(从来历不明的LZW压缩程序中提取)在大小为5021的哈希表中找到一个空槽,索引从0到5020:
probe := <random 12-bit hash key>
// probe is initially 0 to 4095
repeat
{
if table[probe] is empty then return(probe);
if probe == 0 then probe := -1 else dec(probe, 5021-probe);
if probe < 0 then inc(probe, 5021);
}
这不是典型的线性或二次探测。为什么要这样调查?这是一种已知的探测算法吗?我在哪里可以找到更多关于它的信息?
计算新探测器的算法很简单,尽管它看起来很丑:
if probe == 0
probe <= 5020
else
probe <= (2*probe) % 5021
不太清楚为什么选择了这个函数,但它确实经历了所有可能的位置1。。5020以循环且看似随机的方式(0被发送回循环)。(不,它没有,请看oops!)应该注意的是,5021在这种情况下有点神奇。
该算法实际上是一个线性同余生成器(LCG)。看见http://en.wikipedia.org/wiki/Linear_congruential_generator
OOPS:这是一个LCG,但不是一个最佳周期,因为2^1004% 5021 == 1。有五个不同的周期,成员如下:(1, 2, 4, 8, ...), (3, 6, 12, 24, ...), (7, 14, 28, 56, ...), (9, 18, 36, 72, ...)和(11, 22, 44, 88, ...)。更奇怪的是有人选择使用这个算法。(或者我分析错了。)
我正在用一个字符串数组单维和一个2维int数组制作哈希表。我正在使用线性探测进行冲突检测,当我意识到如果检测到冲突,单词的hashCode将不再是索引时,我真的很兴奋地完成了这个程序。我该如何保存该索引以备以后使用?
这是一个类似于线性探测运行时的问题,但它涉及二次探测。 对我来说,“理论上最坏的情况是O(n)”对于线性探测是有意义的,因为在最坏的情况下,你可能需要遍历每个桶(n个桶) 二次探测的运行时是什么?我知道二次探测-1, 4, 9, 16,......我最初的想法是这是对数n(指数)的一些变化,但没有一致的基数。
主要内容:哈希表的构建,哈希函数的构造,处理冲突的方法,总结前面介绍了静态 查找表以及动态查找表中的一些查找方法,其查找的过程都无法避免同查找表中的数据进行比较,查找算法的效率很大程度取决于同表中数据的查找次数。 而本节所介绍的 哈希表可以通过关键字直接找到数据的存储位置,不需要进行任何的比较,其查找的效率相较于前面所介绍的查找算法是更高的。 哈希表的构建 在初中的数学课本中学习过函数的相关知识,给定一个 x,通过一个数学公式,只需要将 x 的值带入公式就
主要内容:哈希表是什么,哈希查找算法哈希查找算法又称 散列查找算法,是一种借助哈希表(散列表)查找目标元素的方法,查找效率最高时对应的时间复杂度为 O(1)。 哈希查找算法适用于大多数场景,既支持在有序序列中查找目标元素,也支持在无序序列中查找目标元素。讲解哈希查找算法之前,我们首先要搞清楚什么是哈希表。 哈希表是什么 哈希表(Hash table)又称 散列表,是一种存储结构,通常用来存储多个元素。 和其它存储结构(线性表、树等)
从原理到应用分析什么是哈希? 一、什么是哈希? 哈希(hash):将任意长度的输入(关键字),通过Hash算法变成固定长度的输出。这个映射的规则就是对应的Hash算法,而原始数据映射后的二进制串就是哈希值,通常哈希值代表了关键字的存储位置。 但是为什么要这样做呢?或者说,哈希是怎样来的呢? 哈希的出现解决了两个问题:存储和搜索。 1. 存储(数据结构):如果在容器中保存对象及其关联的键,并且不用键
我在做一个程序,比较哈希表中线性探测、二次探测和单独链接所需的平均访问量和最大访问量。 我已经做了三个案例的元素插入部分。当从哈希表中找到元素时,我需要有一个结束搜索的限制。在单独链接的情况下,当下一个指针为空时,我可以停止。对于线性探测,当探测到整个表时,我可以停止(即表的大小)。在二次探测中,我应该用什么作为限制?表大小可以吗? 我的二次探测函数是这样的 其中i从0到无穷大。请帮帮我...