《算法》-- 散列表

1. 散列表介绍

使用散列的查找算法分为2步,第一步是用散列函数将被查找的键转化为数组的一个索引。理想情况下,不同的键都能转化为不同的索引值。当然,这只是理想情况,所以我们需要面对2个或者多个键都会散列到相同的索引值得情况。因此,散列表的第二部,就是一个处理碰撞冲突的过程。
散列表是算法在时间和空间上作出权衡的经典例子。如果没有空间限制,我们可以直接将键值作为索引,那么所有的查找操作只需要访问内存一次即可完成。另一方面,如果没有时间限制,我们直接对无序数组进行顺序查找即可,这样只需要很少的内存,而散列表使用了适度的空间和时间并在这两个极端中找到了一种平衡。
严格的说,对于每种类型的键,我们都需要一种散列函数来与之对应。

2. 基于拉链法的散列表

拉链法是将大小为M的数组中的每个元素指向一条链表,链表中的每个结点都存储了散列值为该元素的索引的键值对, 因为发生冲突的元素都被存储在链表中。这个方法的基本思想是选择足够大的M,使得所以链表都尽可能短,从而保证高效的查找。查找分两步:首先根据散列值找到对应的链表,然后沿着链表顺序查找相应的键,在JDK8中,当链表长度大于8时,链表会转为红黑树,从而保证更加高效的查找。

3. 基于线性探测法的散列表

实现散列表的另外一种方式就是用大小为M的数组来保存N个键值对,其中M>N,我们需要依靠数组中的空位来解决碰撞冲突,基于这种策略的所有方法又被称为开放地址散列表。
开放地址散列表中最简单的方法叫做线性探测法:当碰撞发生时,我们直接检查散列表的下一个位置,这样的线性探测可能会产生三种结果:

  1. 命中,即该位置的键与被查找的键相同
  2. 未命中,该位置没有键
  3. 继续查找,该位置的键与被查找的键不同
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值