数据结构_____散列表查找(哈希表)

 

定义:

存储位置=f(关键字)

可以通过关键字获取存储位置 -----散列技术

记录存储位置和关键字一种确定对应关系,使得每个关键字key 对于一个存储位置 f(key) 这种关系又称为哈希函数Hash函数

 

 

 冲突  key1!=key2     f(key1)!= f(key2)  collision

 

 

1.直接定址法

f(key) = a*key+b  (a  b 为常数)  不常用   需要事先知道关键字分布 适合表小时

 

2.数字分析法

1234  

fun(key)  = f(4321) 数字倒序    f(12+34)  分开相加

适合关键字位数大 需事先知道关键字 并且关键字若干位分布均匀

 

3.平分取中法

1234 平分 1522759

fun(key)  = fun(227)  取中间三位

不知道关键字 分布 位数不大

 

4.折叠法

123334441

fun(key) = fun(123+333+444+1) 每三个分组  在相加

适合关键字位数过大 不知道关键字分布

 

5.扣留余数法

 

f(key) = f(key  mod p) 取余数    p的取值 最好  <= 表长   最好接近表长的质数或不包含小于20质因子合数 (529=23X23)

最常用  有冲突key

 

6.随机数方法

f(key) = f(random(key))  rondow 随机数

关键字长度不等的情况下使用

 

 

 

使用以上函数考虑考虑使用参数

1.计算散列地址所需时间

2.关键字长度

3.散列表大小

4.关键字分布情况

5.记录查询的频率

 

1.key冲突解决办法

 

1.开放定址法

f(key) = f(key+di) mod m  (1,2,3,  m-1)    

2.二次定址法

f(key) = f(key+di) mod m  (1²,-1²,2²,-2² ,q², -q²)  q<=m/2

两个方向寻找新地址    加平方根 不让关键字聚集在一起

 

3.链地址法

提供了绝不会出现找不到地址的保障,  这也带来了查找单链表带来的性能损失

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值