散列表的构建与冲突处理 – 线性探测

      散列表的构建是散列查找的前提,说起查找,我第一时间想起二分查找,可是二分查找要求序列是有序排列的并且元素的存储地址是连续的。对于数据查找还好,但是如果做插入或删除操作的话,就要移动大量的元素,当数据量很大时,这样明显不划算。二分查找不行(要求序列为有序序列),那么可以用二叉搜索树啊!二叉搜索树的查找、插入和删除时间复杂度可以从O(logN)到O(N)。N为二叉搜索树的高度。

      既然二叉搜索树已经很快了,可是又有一种更快的查找方式,就是散列查找。散列查找的时间复杂度几乎可以达到O(1)(不过事实上很难很难做到- -、),因为散列查找的查找方法是根据散列函数直接算出元素在序列中的位置。要实现这样的查找,就要先把所有元素按照散列函数构造出一张散列表,(有点像加密和解密- -)。

      首先把每一个元素按照散列函数计算出在散列表中的存储位置并插入(这个位置是一个整数值)。如果这个散列函数设计的好,每个元素都有唯一对应位置,即每个位置只对应一个元素,那么在之后做散列查找时,时间复杂度就可以达到O(1)。不过这在实际情况中大量数据下,是很难实现的,往往会出现多个元素经过散列函数计算后得到同一个位置,这就是冲突。

      构建散列函数表,首先要设计一个散列函数,这里我们先用求余做散列函数,即拿到一个元素,我们把它和所有元素的个数总和做求余运算来获得散列位置,例如我们构建散列表,散列表最大表长为21,插入元素“9”时,9对21求余得到9本身,所有9被插入到散列表中地址等于9的位置。往后我们继续做插入,假设遇到元素“30”,30对21求余也是得到9,可是这时候散列表上9这个位置已经有元素了,这就发生了冲突,接着我们就要解决这个冲突。

      解决冲突的方法有两种,(现在我只写出来一种,因为下面我的散列表都是用一维数组构建的- -、)。第一种是“开放地址法”,遇到冲突后,就按照某种规则,寻找下一个位置,直到找到空位置为止;第二种是把冲突的对象都链接在一起,用一个链表链接(就像桶排序里面的桶那样)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值