散列表的查找技术

一.基本思想

所谓查找,其实质就是要确定待查记录在查找结构中的存储位置 , 以往的查找结构中,查找记录和存储位置之间并没有确定的关系。

而最理想的情况是不经过任何比较,就能够得到待查记录的存储位置。那就必须在查找记录和存储位置之间建立确定的关系H。使得每个关键码key和唯一的存储地址H(key)对应起来.这个过程叫映射

这种查找技术称为散列技术,存储的连续空间称为散列表 ,  将关键码映射为散列表中合适的位置上去的函数称之为散列函数,所得到的的存储地址叫散列地址.

但实际情况下两个不同的关键码可能会对应同一个散列地址,这叫做冲突,这两个关键码叫做同义词.

设计散列查找要解决的两个问题:

①散列函数的设计 ②冲突的处理

二.散列函数的设计

2.1 设计的基本原则:①计算简单②函数值分布均匀

1.直接定址法    H(key)  = a * key + b (a,b为常数)

特点:不会产生冲突,要提前知道关键码.但实际应用中用的很少.

2.平方取中法: 将数值平方,取中间若干个数值当做存储地址

特点: 可以事先不知道数值,位数不能太多

应用:有些编译器中的标识符的管理

3.除留余数法 :  H(key) = key mod p  (最常用)

特点:一般p选取为小于或等于表长的最小素数或者不含小于20质因子的合数 

原因解释:

例如:

12可以是3*4。那么3的倍数,如27,30,33,39,42,45会被映射到3,6,9,3,6,9,即

3的倍数上。

而素数不会有这种问题.

密码学的一个基本假定是人类不具备猜测一个大的随机数的能力。

三.解决冲突的方法

1.开放定址法 (闭散列表)

线性探测法:冲突了就往后推,直到找到空位.

概念:堆积:非同义词对同一个散列地址进行争抢.

二次探测法:步长变为 -1 1 -4 4 -9 9 -16 16 ... -n^2 ,+n^n  好处:分布比较分散

注意的问题:删除的时候,不能直接删除,会截断之后的探测序列.可以采用懒惰标记,被标记的点 往后插入的时候可以直接插入,查询的时候直接跳过。

2.拉链法(开散列表)

发生冲突,就引出一条链表.(称之为同义词子表)


复杂度性能的分析:

关键码的比较次数 取决于 冲突的概率 

冲突的概率由以下三个因素决定:

①散列函数是否均匀

②处理冲突的方法

填装因子 : 

n代表待插入的关键码,m代表散列表的长度,填装因子 a = n/m. a越大,发生冲突的可能性就越大.

散列查找复杂度:O(1);

四.开闭散列表的比较

①由于开散列表可以动态变表长,所以开散列表更适用于事先不知道容量的情况.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值