您的位置:首页 > 其它

第6天:散列HASH(三)冲突解决办法之非线性再散列法

2013-12-31 22:15 218 查看
非线性再散列法
之前讨论过线性再散列法的优缺点,现在我们再来看一下非线性再散列法。与线性再散列法顺序遍历散列表不同,非线性再散列法会重新计算一个散列Key,并通过它跳转到表中一个完全不同的部分。其思想是希望通过跳转到表中不同的部分,可以避免相似值的聚集。如果再散列函数跳转到的槽已经被占用了,则继续执行新一轮的再散列和跳转。如果散列表快满了,那么可能会出现多次再散列的情况。为了避免这个问题,仅当散列表中使用的空间不太可能超过50%时,才应该使用此再散列算法。
再散列的两种算法:

(1)计算散列值的一种实用方法是先计算出一个数字,然后用它除以表的Size。这个除法运算的余数(模)就是散列值。与之对应的一种再散列的方法是利用除法运算产生的商,而不是余数。然后可以用这个商乘以输入字符串的长度以及第二个字符(假设存在第二个字符)所对应的数值。

(2)另一种方法可能有点慢,但非常有效,其原理是使用C语言随机数生成器。使用rand()函数通过一个种子生成伪随机数,并使用返回的随机数作为新的散列值。rand()函数对于给定的种子(通过srand()函数设定)会生成固定的伪随机序列,这是它能够用于再散列的理论基础。
一个对散列表性能影响很大的概念称为负载因子(load factor)。负载因子(α)是指插入到表中的元素个数(n)除以可用槽的总数所得到的的结果。因此;
α = n / tablesize
当负载因子增大时,散列表的性能也会随之下降。经过测试,当负载因子大于0.50时,再散列将不是一种切实可行的解决方案。





结论:只应该在快速而又随机性强的情况下或者快速原型化的环境中使用再散列方法。它的主要优点是:很容易进行动态编码,在确保表负载较低并且不太可能执行删除操作的情况下它的速度足够快。对于其他需求,应该使用外部拉链法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: