- 1、本文档共84页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* Hash(key)=key mod p (p是一个整数) 关键:如何选取合适的p? 技巧:设表长为m,取p≤m且为质数 除留余数法 (最常用重点掌握) * ① 执行速度(即计算哈希函数所需时间); ② 关键字的长度; ③ 哈希表的大小; ④ 关键字的分布情况; ⑤ 查找频率。 构造哈希函数考虑的因素 * 1.开放定址法 处理冲突的方法 2.链地址法 * 基本思想:有冲突时就去寻找下一个空的哈希地址,只要哈希表足够大,空的哈希地址总能找到,并将数据元素存入。 1.开放定址法(开地址法) 线性探测法 二次探测法 伪随机探测法 * Hi=(Hash(key)+di) mod m ( 1≤i m ) 其中:m为哈希表长度 di 为增量序列 1,2,…m-1,且di=i 一旦冲突,就找下一个空地址存入 线性探测法 * 关键码集为 {47,7,29,11,16,92,22,8,3}, 设:哈希表表长为m=11; 哈希函数为Hash(key)=key mod 11 0 1 2 3 4 5 6 7 8 9 10 47 7 △ ▲ △ △ 29 11 16 92 22 8 3 ① 47、7、11、16、92没有冲突 ② Hash(29)=7,有冲突,由H1=(Hash(29)+1) mod 11=8,哈希地址8为空,因此将29存入 ③ 3 连续移动了两次 线性探测法 * 线性探测法的特点 优点:只要哈希表未被填满,保证能找到一个空地址单元存放有冲突的元素。 缺点:可能使第i个哈希地址的同义词存入第i+1个地址,这样本应存入第i+1个哈希地址的元素变成了第i+2个哈希地址的同义词,……,产生“聚集”现象,降低查找效率。 解决方案:二次探测法 * 二次探测法 关键码集为 {47,7,29,11,16,92,22,8,3}, 设: 哈希函数为Hash(key)=key mod 11 Hi=(Hash(key)±di) mod m 其中:m为哈希表长度,m要求是某个4k+3的质数; di为增量序列 12,-12,22,-22,…,q2 0 1 2 3 4 5 6 7 8 9 10 8 29 7 16 92 47 3 22 11 △ ▲ △ △ Hash(3)=3,哈希地址冲突,由 H1=(Hash(3)+12) mod 11=4,仍然冲突; H2=(Hash(3)-12) mod 11=2,找到空的哈希地址,存入。 * 伪随机探测法 Hi=(Hash(key)+di) mod m ( 1≤i m ) 其中:m为哈希表长度 di 为随机数 * 2.链地址法(拉链法) 基本思想:相同哈希地址的记录链成一单链表,m个哈希地址就设m个单链表,然后用用一个数组将m个单链表的表头指针存储起来,形成一个动态的结构 0 1 2 3 4 5 6 7 8 9 10 11 12 14 ^ 1 27 79 68 55 19 84 20 23 10 11 ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ * 链地址法的优点: 非同义词不会冲突,无“聚集”现象 链表上结点空间动态申请,更适合于表长不确定的情况 * 哈希表的查找 给定k值 计算H(k) 此地址为空 关键
文档评论(0)