数据结构与程序设计(王丽苹)23hash函数.ppt
《数据结构与程序设计(王丽苹)23hash函数.ppt》由会员分享,可在线阅读,更多相关《数据结构与程序设计(王丽苹)23hash函数.ppt(37页珍藏版)》请在三一办公上搜索。
1、5/27/2023,数据结构与程序设计,1,数据结构与程序设计(23)Chapter09 9.6 Hashing函数,王丽苹,5/27/2023,数据结构与程序设计,2,哈希函数,顺序查找和二分查找都是建立在“比较”的基础上,所要查找的关键字与存贮地址之间无确定的关系,故查找的效率决定于查找中比较的次数。如果能找到一种函数,对应于每个关键字,都能唯一确定一个存贮地址,那么在查找时,只要根据给定的关键字用该函数进行计算后即可直接取得该关键字所在记录的存贮地址,从而获得待查记录。这个思想就是哈希查找的思想,相应地称这种函数为哈希函数。Hash函数输入为:关键字Hash函数输出为:存储位置 满足上述
2、存储关系的表为Hash表。关键字在整个Hash表中必须要唯一。,5/27/2023,数据结构与程序设计,3,哈希函数,建立哈希函数带有极强的技术性和经验性,下面简单介绍几种常用方法。1直接哈希函数直接哈希函数是直接取关键字或关键字的某个线性函数作为哈希函数,其特点是关键字与哈希地址之间是一对一的关系,因此不会发生冲突,但它的空间浪费严重,因为在大多数情况下,由哈希函数计算出来的地址不是连续的。例如,对参加某一活动的同学进行登记,关键字为学生的学号,哈希函数为H(key)=key。,5/27/2023,数据结构与程序设计,4,哈希函数,2除数取余法这种方法是先找出一个合适的正整数m,取关键字对m
3、的余数作为哈希函数的值,即H(key)=key mod m。为了尽可能避免冲突,一般m取小于存贮区长度的尽可能大的素数。,5/27/2023,数据结构与程序设计,5,哈希函数,3随机法当关键字的长度不等时,通常采用随机函数法,先选择一个随机函数作为哈希函数,关键字对应的随机函数值即为哈希地址,即H(key)=ran(key)。,5/27/2023,数据结构与程序设计,6,哈希函数,在哈希表的建表过程中,若对于某个哈希函数H(k),若有两个或两个以上的关键字映射的哈希地址相同,即H(key1)=H(key2)(key1key2),则发生冲突。在前一节提到过,选择哈希函数时应选择均匀的,冲突较少的
4、。但在大多数情况下,冲突是不可避免的,因此选择哈希函数和解决冲突是哈希查找中两个主要研究内容。常用的处理冲突的方法有开放地址法和链地址法。,5/27/2023,数据结构与程序设计,7,开放地址法,开放地址法解决哈希冲突的思想是,将整个哈希地址区看成一个环形表,当冲突发生时,根据某种解决冲突的方法,为发生冲突的关键字找出一个“空”的地址单元作为该关键字的哈希地址。若插入元素,则碰到空的地址单元就存放要插入的同义词。若检索元素,则需要碰到空的地址单元后,才能说明表中没有待查的元素(检索失败)。,开放地址法,用开地址法解决冲突的方法讨论:(1)用线性探测法:即将基本存储区看作一个循环表。若在地址为d
5、=h(key)的单元发生碰撞,则依次探查下述地址单元d+1,d+2,m-1,0,1,d-1(m为基本存储区的长度)直到找到一个空单元或查找到关键码为key的元素为止。如果从单元d开始探查,查找一遍后,又回到地址d,则表示基本存储区已经溢出。可能会造成“堆积”。,5/27/2023,数据结构与程序设计,8,例子:已知关键码集合K=18,73,10,5,68,99,27,41,51,32,25,设散列表基本区域用数组element表示,大小为m(m=13),散列函数为h(key)=key%13,用线性探查法解决碰撞。按散列函数d=key%13计算每个元素的散列地址如下:h(18)=5,h(73)=
6、8,h(10)=10,h(5)=5,h(68)=3,h(99)=8 h(27)=1,h(41)=2,h(51)=12,h(32)=6,h(25)=12最后的散列表为:,开放地址法,用开地址法解决冲突的方法讨论:(2)平方探测法我们可以改变增量的形式,如发生冲突时,检测H(key)1,H(key函数)4,H(key函数)9 这种方法就称为平方探测法。(3)增量函数法选择两个散列函数h1和h2他们均以关健字为自变量,h1产生0到m-1之间的数作为地址,如果有冲突,则计算h2的值,h2产生一个1到m-1之间的并和m互素的数作为地址的增量。例如两个散列函数可以为h1(key)=key%m和h2(key
7、)=key%(m-2)+1。如果d=h1(key)发生碰撞,则再计算h2(key),得到探查序列为(d+h2(key)%m,(d+2h2(key)%m,(d+3h2(key)%m,5/27/2023,数据结构与程序设计,10,5/27/2023,数据结构与程序设计,11,开放地址法实现讨论,enum Error_codenot_present,overflow,duplicate_error,success;const int hash_size=97;class Hash_table public:void clear();Error_code insert(const Record,5/2
8、7/2023,数据结构与程序设计,12,开放地址法,class Key int key;public:Key(int x=0);int the_key()const;bool operator=(const Key,5/27/2023,数据结构与程序设计,13,开放地址法,class Recordpublic:operator Key();/implicit conversion from Record to Key.Record(int x=0,int y=0);int the_key()const;int the_other()const;private:int key;int other
9、;bool operator!=(const Record,5/27/2023,数据结构与程序设计,14,开放地址法,void Hash_table:clear()for(int i=0;ihash_size;i+)Record tmp;tablei=tmp;,5/27/2023,数据结构与程序设计,15,开放地址法,/以下是Hash函数的设计int hash(const Record,开放地址法,Error_code insert(const Record 创建Hash表的方法:(1)计算当前待插入元素new_entry在Hash表中的位置。(2)判断该关键字是否唯一。不唯一则报错。(2)判
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 程序设计 王丽苹 23 hash 函数

链接地址:https://www.31ppt.com/p-4980253.html