慕课(11)

散列表:

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。

常用方法编辑
散列函数能使对一个数据序列的访问过程更加迅速有效,通过散列函数,数据元素将被更快地定位。
实际工作中需视不同的情况采用不同的哈希函数,通常考虑的因素有:
· 计算哈希函数所需时间
· 关键字的长度
· 哈希表的大小
· 关键字的分布情况
· 记录的查找频率

散列函数的构造方法:
常见的散列函数
(1)直接定址法
对关键码进行先行计算:hash(key)=a*key+b,a和b为常数
(2)除留余数法
散列表中存储地址范围0~m-1,去一个不大于m但最接近m的质数p,hash(key)=key%p(p<=m)
(3)数字分析法
设有n个d位数,每一位可能有r种不同的符号,在各位的出现频率不一定相同,若散列表地址0~m-1,占k位数,可选其中各种符号分布均匀的k位,并乘一个比例因子得到散列地址
(4)平方取中法
计算构成关键码标识符的内码的平方,取中间若干位为散列地址
(5)折叠法
把关键码自左至右分成位数与散列地址相等的几部分,进行叠加
设关键码为2 5 3 4 6 3 5 8 7 0 5,散列地址为三位。

(1):
取关键词的某个线性函数值为散列地址,即
h(key) = a × key + b (a、b为常数)
散列函数的构造函数为:h(key)=key-1990。

(2):
散列函数为:h(key) = key mod p
例: h(key) = key % 17
地址 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
关键词 34 18 2 20 23 7 42 27 11 30 15
一般,p 取素数,这里:p = Tablesize = 17。

(3):
分析数字关键字在各位上的变化情况,取比较随机的位作为散列地址
比如:取11位手机号码key的后4位作为地址:
散列函数为:h(key) = atoi(key+7) (char *key)

如果关键词 key是18位的身份证号码:

用红线标出来的是变化比较大的的6位数字,这里就取这6位数字来组建散列函数
h1(key) = (key[6]-‘0’)×104 + (key[10]-‘0’)×103 +(key[14]-‘0’)×102 + (key[16]-‘0’)×10 + (key[17]-‘0’)

当 key[18] = ‘x’时,身份证最后一位为X
h(key) = h1(key)×10 + 10

当 key[18] 为’0’~’9’时,身份证最后一位为数字
h(key) = h1(key)×10 + key[18]-‘0’

(5):
把关键词分割成位数相同的几个部分,然后叠加。

冲突处理方法:
1.开放定址法(再散列法):

基本思想:当关键字key的哈希地址p=H(key)出现冲突时,以p为基础,产生另一个哈希地址p1,如果p1仍然冲突,再以p为基础,产生另一个哈希地址p2,…,直到找出一个不冲突的哈希地址pi ,将相应元素存入其中。 这种方法有一个通用的再散列函数形式:

        Hi=(H(key)+di)% m   i=1,2,…,n

其中H(key)为哈希函数,m 为表长,di称为增量序列。增量序列的取值方式不同,相应的再散列方式也不同。

1.线性探测再散列:

dii=1,2,3,…,m-1 冲突发生时,顺序查看表中下一单元,直到找出一个空单元或查遍全表。

2.二次探测再散列:

di=12,-12,22,-22,…,k2,-k2 ( k<=m/2 ) 冲突发生时,在表的左右进行跳跃式探测,比较灵活。

3.伪随机探测再散列:

di=伪随机数序列。 具体实现时,应建立一个伪随机数发生器,(如i=(i+p) % m),并给定一个随机数做起点。

性能分析:
影响产生冲突多少有以下三个因素:
(1)散列函数是否均匀;
(2)处理冲突的方法;
(3)散列表的装填因子α。
分析:不同冲突处理方法、装填因子对效率的影响

5 散列查找优缺点比较:
优点: 选择合适的 h(key) ,散列法的查找效率期望是常数O(1),它几乎与关键字的空间的大小n无关!也适合于关键字直接比较计算量大的问题

中性:它是以较小的α为前提。因此,散列方法是一个以空间换时间它是以较小的α为前提。因此,散列方法是一个以空间换时间

缺点:散列方法的存储对关键字是随机的,不便于顺序查找关键字,也不适合于范围查找,或最大值最小值查找。

开放地址法优缺点比较:
优点:散列表是一个数组,存储效率高,随机查找。
缺点:散列表有“聚集”现象

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值