- 1、本文档共74页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构-8-8查找
8.4.3 解决冲突的方法 由于哈希存贮中选取的哈希函数不是线性函数,将大的关键值的取值空间映射到小的地址空间中,故不可避免地会产生冲突,下面给出常见的解决冲突方法。 1.开放定址法 开放定址法就是从发生冲突的那个单元开始,按照一定的次序,从哈希表中找出一个空闲的存储单元,把发生冲突的待插入关键字存储到该单元中,从而解决冲突的发生。在哈希表未满时,处理冲突需要的“下一个”空地址在哈希表中解决。 开放定址法利用下列公式求“下一个”空地址 Hi=(H(key)+di) MOD m i=1,2,…K(K=m-1) 其中H(key)为哈希函数,m为哈希表长度,di为增量序列 根据di的取法,解决冲突时具体使用下面一些方法。 (1)线性探查法 假设哈希表的地址为0∽m-1,则哈希表的长度为m。若一个关键字在地址d处发生冲突,则依次探查d+1,d+2,…,m-1(当达到表尾m-1时,又从0,1,2,….开始探查)等地址,直到找到一个空闲位置来装冲突处的关键字,将这一种方法称为线性探查法。假设发生冲突时的地址为d0=H(k),则探查下一位置的公式为di=(di-1+1)%m (1≤i≤m-1),最后将冲突位置的关键字存入di地址中。 例8-5 给定关键字序列为19,14,23,1,68,20,84,27,55,11,10,79,哈希函数H(k)=k%13 ,哈希表空间地址为0∽12,试用线性探查法建立哈希存贮(哈希表)结构。 得到的哈希表如图8-17所示 (2) 二次方探查法 该方法规定,若在d地址发生冲突,下一次探查位置为d+12,d-12,d+22,d- 22, …,直到找到一个空闲位置为止。 开放地址法充分利用了哈希表的空间,但在解决一个冲突时,可能造成下一个冲突。另外,用开放地址法解决冲突不能随便对结点进行删除。 2. 链地址法 链地址法也称拉链法,是把相互发生冲突的同义词用一个单链表链接起来,若干组同义词可以组成若干个单链表 例:对给定的关键字序列19,14,23,1,68,20,84,27,55,11,10,79,给定哈希函数为H(k)=k%13,试用拉链法解决冲突建立哈希表。 图8-18为用尾插法建立的关于例8-6的拉链法解决冲突的哈希表。 8.4.5 哈希查找的性能分析 哈希查找按理论分析,它的时间复杂度应为O(1),它的平均查找长度应为ASL=1,但实际上由于冲突的存在,它的平均查找长度将会比1大。下面将分析几种方法的平均查找长度。 1.线性探查法的性能分析 由于线性探查法解决冲突是线性地查找空闲位置的,平均查找长度与表的大小m无关,只与所选取的哈希函数H及装填因子α的值和该处理方法有关,这时的成功的平均查找长度为ASL=1/2 (1+1/(1- α)) 。 2.拉链法查找的性能分析 由于拉链法查找就是在单链表上查找,查找单链表中第一个结点的次数为1,第二个结点次数为2,其余依次类推。它的平均查找长度ASL=1+α/2。 例8-7 给定关键字序列11,78,10,1,3,2,4,21,试分别用顺序查找、二分查找、二叉排序树查找、平衡二叉树查找、哈希查找(用线性探查法和拉链法)来实现查找,试画出它们的对应存储形式(顺序查找的顺序表,二分查找的判定树,二叉排序树查找的二叉排序树及平衡二叉树查找的平衡二叉树,两种哈希查找的哈希表),并求出每一种查找的成功平均查找长度。哈希函数H(k)=k%11。 顺序查找的顺序表(一维数组)如图8-19所示, 从图8-19可以得到顺序查找的成功平均查找长度为: ASL=(1+2+3+4+5+6+7+8)/8=4.5; 二分查找的判定树(中序序列为从小到大排列的有序序列)如图8-20所示, 从图8-20可以得到二分查找的成功平均查找长度为: ASL=(1+2*2+3*4+4)/8=2.625; 二叉排序树(关键字顺序已确定,该二叉排序树应唯一)如图 8-21(a)所示,平衡二叉树(关键字顺序已确定,该平衡二叉树也应该是唯一的),如图8-21(b)所示, 从图8-21(a)可以得到二叉排序树查找的成功平均查找长度为: ASL=(1+2*2+3*2+4+5*2)=3.125; 从图8-21(b)可以得到平衡二叉树的成功平均查找长度为: ASL=(1+2*2+3*3+4*2)/8=2.75; 线性探查法解决冲突的哈希表如图8-22所示, 从图8-22可以得到线性探查法的成功平均查找长度为: ASL=(1+1+2+1+3+2+1+8)/8=2.375; 拉链法解决冲突的哈希表如图8-23所示。 从图8-23可以得到拉链法的成功平均查找长度为: ASL=(1*6+2*2)/8=1.25。 30 20 10 40 35 25 23 f T 设 key = 48
文档评论(0)