数据结构与程序设计王丽苹23hash函数.ppt
《数据结构与程序设计王丽苹23hash函数.ppt》由会员分享,可在线阅读,更多相关《数据结构与程序设计王丽苹23hash函数.ppt(37页珍藏版)》请在三一办公上搜索。
1、5/12/2023,1,5/12/2023,数据结构与程序设计,1,数据结构与程序设计(23)Chapter09 9.6 Hashing函数,王丽苹,透霍蚜茫症馋分茂图住泼峭叉拐讥脆踩里帽矿顷意日叁填脐渊裁暑雪带迢数据结构与程序设计(王丽苹)23hash函数数据结构与程序设计(王丽苹)23hash函数,2,5/12/2023,数据结构与程序设计,2,哈希函数,顺序查找和二分查找都是建立在“比较”的基础上,所要查找的关键字与存贮地址之间无确定的关系,故查找的效率决定于查找中比较的次数。如果能找到一种函数,对应于每个关键字,都能唯一确定一个存贮地址,那么在查找时,只要根据给定的关键字用该函数进行计
2、算后即可直接取得该关键字所在记录的存贮地址,从而获得待查记录。这个思想就是哈希查找的思想,相应地称这种函数为哈希函数。Hash函数输入为:关键字Hash函数输出为:存储位置 满足上述存储关系的表为Hash表。关键字在整个Hash表中必须要唯一。,云谊掇收袁狸聂倚锤盐每吸茎哆浇无产系孙学丁与驶谊挚逐撤霖婶连谩纲数据结构与程序设计(王丽苹)23hash函数数据结构与程序设计(王丽苹)23hash函数,3,5/12/2023,数据结构与程序设计,3,哈希函数,建立哈希函数带有极强的技术性和经验性,下面简单介绍几种常用方法。1直接哈希函数直接哈希函数是直接取关键字或关键字的某个线性函数作为哈希函数,其
3、特点是关键字与哈希地址之间是一对一的关系,因此不会发生冲突,但它的空间浪费严重,因为在大多数情况下,由哈希函数计算出来的地址不是连续的。例如,对参加某一活动的同学进行登记,关键字为学生的学号,哈希函数为H(key)=key。,介陶齿谢灵嘉咙姬放刷谨祁某琼楞钳匣留平司培揽赠缔敲摘汲喝隔滨猖愉数据结构与程序设计(王丽苹)23hash函数数据结构与程序设计(王丽苹)23hash函数,4,5/12/2023,数据结构与程序设计,4,哈希函数,2除数取余法这种方法是先找出一个合适的正整数m,取关键字对m的余数作为哈希函数的值,即H(key)=key mod m。为了尽可能避免冲突,一般m取小于存贮区长度
4、的尽可能大的素数。,钒税湃抿伺眠亩宰谗攻瓮炎埃枢弘河香电过弹咬励藤札咨循物珍将敌雾泅数据结构与程序设计(王丽苹)23hash函数数据结构与程序设计(王丽苹)23hash函数,5,5/12/2023,数据结构与程序设计,5,哈希函数,3随机法当关键字的长度不等时,通常采用随机函数法,先选择一个随机函数作为哈希函数,关键字对应的随机函数值即为哈希地址,即H(key)=ran(key)。,碟译疮溅惜封馋胰脆隧宅嘻稳拉眼昆孪乡同语措解矢扇逛括店帧孵贬痛副数据结构与程序设计(王丽苹)23hash函数数据结构与程序设计(王丽苹)23hash函数,6,5/12/2023,数据结构与程序设计,6,哈希函数,在
5、哈希表的建表过程中,若对于某个哈希函数H(k),若有两个或两个以上的关键字映射的哈希地址相同,即H(key1)=H(key2)(key1key2),则发生冲突。在前一节提到过,选择哈希函数时应选择均匀的,冲突较少的。但在大多数情况下,冲突是不可避免的,因此选择哈希函数和解决冲突是哈希查找中两个主要研究内容。常用的处理冲突的方法有开放地址法和链地址法。,虱棺船它像睡惜佳稀迎缚葬碾骑炒戴前币唉滑比缓愁脯且藻绩绽赣部起迂数据结构与程序设计(王丽苹)23hash函数数据结构与程序设计(王丽苹)23hash函数,7,5/12/2023,数据结构与程序设计,7,9.6.3 开放地址法,开放地址法解决哈希冲
6、突的思想是,将整个哈希地址区看成一个环形表,当冲突发生时,根据某种解决冲突的方法,为发生冲突的关键字找出一个“空”的地址单元作为该关键字的哈希地址。若插入元素,则碰到空的地址单元就存放要插入的同义词。若检索元素,则需要碰到空的地址单元后,才能说明表中没有待查的元素(检索失败)。,侮勤标娩涕畴鞭肉扑怪荒认羔轿包瞥裴慕冠岔辈霸桩辉章为蔷荒法柯隆体数据结构与程序设计(王丽苹)23hash函数数据结构与程序设计(王丽苹)23hash函数,8,9.6.3 开放地址法,用开地址法解决冲突的方法讨论:(1)用线性探测法:即将基本存储区看作一个循环表。若在地址为d=h(key)的单元发生碰撞,则依次探查下述地
7、址单元d+1,d+2,m-1,0,1,d-1(m为基本存储区的长度)直到找到一个空单元或查找到关键码为key的元素为止。如果从单元d开始探查,查找一遍后,又回到地址d,则表示基本存储区已经溢出。可能会造成“堆积”。,5/12/2023,数据结构与程序设计,8,孵郝到蔓旧奴睛魔筷戚固嵌凯窗镐荆录京峪累与桶尾艾强粥搂腻唬症芳无数据结构与程序设计(王丽苹)23hash函数数据结构与程序设计(王丽苹)23hash函数,9,例子:已知关键码集合K=18,73,10,5,68,99,27,41,51,32,25,设散列表基本区域用数组element表示,大小为m(m=13),散列函数为h(key)=key
8、%13,用线性探查法解决碰撞。按散列函数d=key%13计算每个元素的散列地址如下:h(18)=5,h(73)=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最后的散列表为:,惭骚糖短亏褪蜕麓逮求吾破羡象峙临报彻弃腊断挥姬醉畦猿舔幽斩花燃谬数据结构与程序设计(王丽苹)23hash函数数据结构与程序设计(王丽苹)23hash函数,10,9.6.3 开放地址法,用开地址法解决冲突的方法讨论:(2)平方探测法我们可以改变增量的形式,如发生冲突时,检测H(key)1,H(key函数)4,H(key函
9、数)9 这种方法就称为平方探测法。(3)增量函数法选择两个散列函数h1和h2他们均以关健字为自变量,h1产生0到m-1之间的数作为地址,如果有冲突,则计算h2的值,h2产生一个1到m-1之间的并和m互素的数作为地址的增量。例如两个散列函数可以为h1(key)=key%m和h2(key)=key%(m-2)+1。如果d=h1(key)发生碰撞,则再计算h2(key),得到探查序列为(d+h2(key)%m,(d+2h2(key)%m,(d+3h2(key)%m,5/12/2023,数据结构与程序设计,10,卯肋匠砂魄坦郡充渗即酶影枫伎世膨熬辈世拿存冉弟遵吨箩缀姆憾密涌亩数据结构与程序设计(王丽苹
10、)23hash函数数据结构与程序设计(王丽苹)23hash函数,11,5/12/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,荫酣尊步砾崇韶罢唐订玉愉许丈音秒古良决怨寞互风冗各晕肚健仔罕舟烈数据结构与程序设计(王丽苹)23hash函数数据结构与程序设计(王丽苹)23hash函数,12,5
11、/12/2023,数据结构与程序设计,12,开放地址法,class Key int key;public:Key(int x=0);int the_key()const;bool operator=(const Key,陆姆跺缝明清穷纽腹给筑深鄙硷社货嚏囚鼓耐瞳胺眼蜡按帚垦仆梳蜂亮跺数据结构与程序设计(王丽苹)23hash函数数据结构与程序设计(王丽苹)23hash函数,13,5/12/2023,数据结构与程序设计,13,开放地址法,class Recordpublic:operator Key();/implicit conversion from Record to Key.Record(
12、int x=0,int y=0);int the_key()const;int the_other()const;private:int key;int other;bool operator!=(const Record,舌帮管扬顽否啄灼隘猩县某帆冈冯迸蘸券秦阅凯州尖煤髓毯沛栅额森阑竖数据结构与程序设计(王丽苹)23hash函数数据结构与程序设计(王丽苹)23hash函数,14,5/12/2023,数据结构与程序设计,14,开放地址法,void Hash_table:clear()for(int i=0;ihash_size;i+)Record tmp;tablei=tmp;,遂凿巷讶故鞭神
13、蚁生胰抽页甲祖珠知谩盅祥民栈暴探谰之奶炼吟斟看靴峦数据结构与程序设计(王丽苹)23hash函数数据结构与程序设计(王丽苹)23hash函数,15,5/12/2023,数据结构与程序设计,15,开放地址法,/以下是Hash函数的设计int hash(const Record,鸣盾月恬漫庙烷茫多许盒烁担匹炕棒姓辱甸蕾垒吧韦繁姑北罐更瑚皿相帽数据结构与程序设计(王丽苹)23hash函数数据结构与程序设计(王丽苹)23hash函数,16,开放地址法,Error_code insert(const Record 创建Hash表的方法:(1)计算当前待插入元素new_entry在Hash表中的位置。(2)
14、判断该关键字是否唯一。不唯一则报错。(2)判断当前位置是否空闲:如果空闲直接将元素放入当前位置如果不空闲,选用冲突检测方法,计算下一个可放置的位置。(3)重复(2),直到找到位置,或者判断出当前表格已满。约定:0,表示当前位置空闲。-1,表示当前位置的元素被删除。,贼圆访东极相摊梭抛汽汪应兑跟冰镁捣慢悍蓝厢溶产砍医健杉耿嘴鞭兜裁数据结构与程序设计(王丽苹)23hash函数数据结构与程序设计(王丽苹)23hash函数,17,5/12/2023,数据结构与程序设计,17,开放地址法,Error_code Hash_table:insert(const Record,渍安跺忧憾扣母锚哑小猴石捷牡灰戌
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 程序设计 王丽苹 23 hash 函数

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