散列表

填个坑

散列表

正整数

将整数散列最常用方法是 除留余数法 。选择大小为素数M的数组,对于任意正整数k,计算k除以M的余数。不使用素数可能会导致散列不均,影响效率。

浮点数

如果键是 0 到 1 之间的实数,我们可以将它乘以 M 并四舍五入得到一个 0 至 M -1 之间的索引值。尽管这个方法很容易理解,但它是有缺陷的,因为这种情况下键的高位起的作用更大,最低位对散列的结果没有影响。修正这个问题的办法是将键表示为二进制数然后再使用除留余数法(Java就是这么做的)。

字符串

除留余数法也可以处理较长的键,例如字符串,我们只需将它们当做大整数即可。
如下代码可以用除留余数法计算 String S 的散列值:

int hash = 0;
for(int i=0;i<s.length();i++)
	hash=(R * hash + s.charAt(i)) % M;
//散列字符串键

Java 的 charAt() 函数能够返回一个 char 值,即一个非负 16 位整数。如果 R 比任何字符的值都大,这种计算相当于将字符串当做一个 N 位的 R 进制值,将它除以 M 并取余。一种叫 Horner 方法的经典算法用 N 次乘法、加法和取余来计算一个字符串的散列值。只要 R 足够小,不造成溢出,那么结果就能如我们所愿,落在 0 至 M - 1 之内。使用一个较小的素数,例如31,可以保证字符串中的所有字符都能发挥作用。Java 的 String 的默认实现使用了一个类似的方法。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值