线性探测(哈希表)有一件事对我来说并不直观。如果我把散列结果的key1放到数组索引1中。然后我放了钥匙2-
或者,我们的散列函数(如果写得足够好的话)在索引中平均分配键,并且我们不断调整数组的大小,使其最大半满,这就减轻了这种情况?
您发现的问题确实会影响线性探测的性能。当您试图查找某个元素时,为了找到您的元素,您可能必须从初始哈希探测开始的地方查找很远的地方。
也就是说,线性探测在实践中非常快,这主要是由于引用的局部性。在内存中查找某些东西的成本是不一致的——如果你在最近读过的东西附近查找一个地址,很可能内存区域已经被拉入缓存,查找东西的成本非常低。因此,这些探测在实践中的成本通常比你自然预期的要低,因为这些探测可能非常快。
然而,这并不意味着你可以忽略这个事实。有许多问题需要注意。首先,随着表的负载系数增加,命中其他元素的成本开始增加,从而导致查找时间越来越长。通常,你会看到人们以大约75%的负荷系数重新回到一张更大的桌子上。第二,你需要有一个非常好的散列函数,因为如果你有一个低质量的散列,把很多元素放到相似的位置,你会得到非常糟糕的性能。
有几种技术可以用来缓解这种情况。罗宾汉散列法的工作原理是,在元素被放置后,移动元素,以便将离家更近的元素推到更远的地方,为离家更近的元素腾出空间。这会使查找的平均成本稍高,但会显著降低查找的最坏情况成本(换句话说,它会降低查找成本的方差,以换取增加该查找成本的预期值)。跳点散列法的工作原理是限制元素可以移动的最大距离,并维护一个位掩码,指示附近哪些元素可能匹配,从而减少查找内容所需的工作量。新的Googleflat_map
从线性探测开始,使用非常聪明的散列和并行内存操作,使查找速度极快。
当有许多冲突时,线性探测是次优的。请注意,冲突的数量不仅取决于哈希,还取决于表中的槽数(通常是素数),因为索引是哈希除以表长度的整数的余数。
然而,请注意,与将冲突的键一个接一个相比,还可以利用CPU缓存,这将在一次读取中从RAM中带来许多元素。所以,不要(原则上)认为检查20个探针所需的时间是检查一个探针所需时间的20倍,因为CPU及其缓存中发生的事情要比进入RAM快得多。不过,没有魔法。如果每次比较的计算都会丢弃缓存中的内容,那么节省的部分就会丢失。
我正在用一个字符串数组单维和一个2维int数组制作哈希表。我正在使用线性探测进行冲突检测,当我意识到如果检测到冲突,单词的hashCode将不再是索引时,我真的很兴奋地完成了这个程序。我该如何保存该索引以备以后使用?
我试图解决这个问题,我需要实现线性探测。 给定一个整数数组和一个哈希表大小。使用线性探测将数组元素填充到哈希表中以处理冲突。 例1: 例2: 您的任务: 您不需要读取输入或打印任何内容。 您的任务是完成函数linearProbing(),该函数将空哈希表(hash)、哈希表大小(hashSize)、整数数组arr[]及其大小N作为输入,并将数组arr[]的所有元素插入给定的哈希表中。 哈希表的空单
我试图理解使用Java实现的线性探测哈希表。然而,我对理解为什么M的初始值为30001感到失望。下面给出了代码的框架。 我的问题是为什么M在这里被初始化为30001。这是经验法则吗?初始化线性探测哈希表时,我应该如何确定M的大小?
我在研究hackerearth上的哈希表,在那里我遇到了用线性探测实现哈希表的代码。我对这段代码有两个疑问:- 1)为什么他们声明大小为21(而不是大小为20)的hashTable最多容纳20个元素? 2) 在Insert函数中,当循环无限运行时,如果在连续迭代之后,索引的值变为索引的初始值,不是吗? 链接至黑客主页:-https://www.hackerearth.com/practice/da
问题内容: Hashcode()和equals()的概念是 1)如果两个对象根据equal()相等,则在这两个对象中的每一个上调用hashcode方法应产生相同的哈希码。 另一个是 2)如果两个对象根据equal()不相等,则不需要在两个对象中的每一个上调用hashcode方法必须产生不同的值。 我尝试并理解了第一个,这是第一点的代码。 上面的程序为两个不同的对象提供了相同的哈希码。 有人可以用一
我已经完成了一个android应用程序的开发,该应用程序使用facebook sdk与facebook集成。目前,我对这个应用程序没有任何问题需要解决,因为它功能齐全,运行良好——但尽管如此,我相信即使应用程序正在运行,我仍然不完全理解Android密钥散列是什么 1)据我所知,facebook sdk为开发者提供了一个独特的应用程序id,以了解他们与谁“交谈”,这样他们也可以控制谁是谁之类的人,