欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    数据结构与程序设计王丽苹23hash函数.ppt

    • 资源ID:4734028       资源大小:169.50KB        全文页数:37页
    • 资源格式: PPT        下载积分:10金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要10金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    数据结构与程序设计王丽苹23hash函数.ppt

    5/12/2023,1,5/12/2023,数据结构与程序设计,1,数据结构与程序设计(23)Chapter09 9.6 Hashing函数,王丽苹,透霍蚜茫症馋分茂图住泼峭叉拐讥脆踩里帽矿顷意日叁填脐渊裁暑雪带迢数据结构与程序设计(王丽苹)23hash函数数据结构与程序设计(王丽苹)23hash函数,2,5/12/2023,数据结构与程序设计,2,哈希函数,顺序查找和二分查找都是建立在“比较”的基础上,所要查找的关键字与存贮地址之间无确定的关系,故查找的效率决定于查找中比较的次数。如果能找到一种函数,对应于每个关键字,都能唯一确定一个存贮地址,那么在查找时,只要根据给定的关键字用该函数进行计算后即可直接取得该关键字所在记录的存贮地址,从而获得待查记录。这个思想就是哈希查找的思想,相应地称这种函数为哈希函数。Hash函数输入为:关键字Hash函数输出为:存储位置 满足上述存储关系的表为Hash表。关键字在整个Hash表中必须要唯一。,云谊掇收袁狸聂倚锤盐每吸茎哆浇无产系孙学丁与驶谊挚逐撤霖婶连谩纲数据结构与程序设计(王丽苹)23hash函数数据结构与程序设计(王丽苹)23hash函数,3,5/12/2023,数据结构与程序设计,3,哈希函数,建立哈希函数带有极强的技术性和经验性,下面简单介绍几种常用方法。1直接哈希函数直接哈希函数是直接取关键字或关键字的某个线性函数作为哈希函数,其特点是关键字与哈希地址之间是一对一的关系,因此不会发生冲突,但它的空间浪费严重,因为在大多数情况下,由哈希函数计算出来的地址不是连续的。例如,对参加某一活动的同学进行登记,关键字为学生的学号,哈希函数为H(key)=key。,介陶齿谢灵嘉咙姬放刷谨祁某琼楞钳匣留平司培揽赠缔敲摘汲喝隔滨猖愉数据结构与程序设计(王丽苹)23hash函数数据结构与程序设计(王丽苹)23hash函数,4,5/12/2023,数据结构与程序设计,4,哈希函数,2除数取余法这种方法是先找出一个合适的正整数m,取关键字对m的余数作为哈希函数的值,即H(key)=key mod m。为了尽可能避免冲突,一般m取小于存贮区长度的尽可能大的素数。,钒税湃抿伺眠亩宰谗攻瓮炎埃枢弘河香电过弹咬励藤札咨循物珍将敌雾泅数据结构与程序设计(王丽苹)23hash函数数据结构与程序设计(王丽苹)23hash函数,5,5/12/2023,数据结构与程序设计,5,哈希函数,3随机法当关键字的长度不等时,通常采用随机函数法,先选择一个随机函数作为哈希函数,关键字对应的随机函数值即为哈希地址,即H(key)=ran(key)。,碟译疮溅惜封馋胰脆隧宅嘻稳拉眼昆孪乡同语措解矢扇逛括店帧孵贬痛副数据结构与程序设计(王丽苹)23hash函数数据结构与程序设计(王丽苹)23hash函数,6,5/12/2023,数据结构与程序设计,6,哈希函数,在哈希表的建表过程中,若对于某个哈希函数H(k),若有两个或两个以上的关键字映射的哈希地址相同,即H(key1)=H(key2)(key1key2),则发生冲突。在前一节提到过,选择哈希函数时应选择均匀的,冲突较少的。但在大多数情况下,冲突是不可避免的,因此选择哈希函数和解决冲突是哈希查找中两个主要研究内容。常用的处理冲突的方法有开放地址法和链地址法。,虱棺船它像睡惜佳稀迎缚葬碾骑炒戴前币唉滑比缓愁脯且藻绩绽赣部起迂数据结构与程序设计(王丽苹)23hash函数数据结构与程序设计(王丽苹)23hash函数,7,5/12/2023,数据结构与程序设计,7,9.6.3 开放地址法,开放地址法解决哈希冲突的思想是,将整个哈希地址区看成一个环形表,当冲突发生时,根据某种解决冲突的方法,为发生冲突的关键字找出一个“空”的地址单元作为该关键字的哈希地址。若插入元素,则碰到空的地址单元就存放要插入的同义词。若检索元素,则需要碰到空的地址单元后,才能说明表中没有待查的元素(检索失败)。,侮勤标娩涕畴鞭肉扑怪荒认羔轿包瞥裴慕冠岔辈霸桩辉章为蔷荒法柯隆体数据结构与程序设计(王丽苹)23hash函数数据结构与程序设计(王丽苹)23hash函数,8,9.6.3 开放地址法,用开地址法解决冲突的方法讨论:(1)用线性探测法:即将基本存储区看作一个循环表。若在地址为d=h(key)的单元发生碰撞,则依次探查下述地址单元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%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 这种方法就称为平方探测法。(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,卯肋匠砂魄坦郡充渗即酶影枫伎世膨熬辈世拿存冉弟遵吨箩缀姆憾密涌亩数据结构与程序设计(王丽苹)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/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(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;,遂凿巷讶故鞭神蚁生胰抽页甲祖珠知谩盅祥民栈暴探谰之奶炼吟斟看靴峦数据结构与程序设计(王丽苹)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)判断该关键字是否唯一。不唯一则报错。(2)判断当前位置是否空闲:如果空闲直接将元素放入当前位置如果不空闲,选用冲突检测方法,计算下一个可放置的位置。(3)重复(2),直到找到位置,或者判断出当前表格已满。约定:0,表示当前位置空闲。-1,表示当前位置的元素被删除。,贼圆访东极相摊梭抛汽汪应兑跟冰镁捣慢悍蓝厢溶产砍医健杉耿嘴鞭兜裁数据结构与程序设计(王丽苹)23hash函数数据结构与程序设计(王丽苹)23hash函数,17,5/12/2023,数据结构与程序设计,17,开放地址法,Error_code Hash_table:insert(const Record,渍安跺忧憾扣母锚哑小猴石捷牡灰戌额怜炳靶萝印贺垄琅蹦彝辕振蜒膏电数据结构与程序设计(王丽苹)23hash函数数据结构与程序设计(王丽苹)23hash函数,18,开放地址法,Error_code retrieve(const Key 访问Hash表:(1)通过Hash函数计算得到target的位置prob。(2)判断prob位置的值是否与target相等:如果相等,则找到该关键字。将其内容存储于found中。如果不相等,则根据冲突解决的方法,计算下一个地址prob。(3)重复步骤2,直到找到,或者确定target不存在于hash表中:a,碰到Prob位置为空闲,b,计算了所有可能的位置。,韧盼虽然读乏汉撞耽虫俏署咨灼歌舱确百栗寞甩呀闯弯翌漠道苇锈梅坛财数据结构与程序设计(王丽苹)23hash函数数据结构与程序设计(王丽苹)23hash函数,19,5/12/2023,数据结构与程序设计,19,Error_code Hash_table:retrieve(const Key,擂锣辛柴拷袍辙予废恤檬俞曰副段混寞琴店抚急籽战富吱藉曳蝴侮涎歹缩数据结构与程序设计(王丽苹)23hash函数数据结构与程序设计(王丽苹)23hash函数,20,开放地址法,Error_code Hash_table:remove(const Key&target,Record&found)删除Hash表的一个元素。(1)通过Hash函数计算得到target的位置prob。(2)判断prob位置的值是否与target相等:如果相等,则找到该关键字。将其内容存储于found中,将该位置置为-1。如果不相等,则根据冲突解决的方法,计算下一个地址prob。(3)重复步骤2,直到找到,则删除成功。或者确定target不存在于hash表中:a,碰到Prob位置为空闲,b,计算了所有可能的位置。此时删除失败。,很粒号细镊苍陕碗袒颇壶篮麦箱拦料兹蔽豌绿惫啥欢盟肘攀赦道副颇颧腋数据结构与程序设计(王丽苹)23hash函数数据结构与程序设计(王丽苹)23hash函数,21,5/12/2023,数据结构与程序设计,21,开放地址法,Error_code Hash_table:remove(const Key,版搓布善诲凭吕唾铲辅翟怨攒崖搬秩茅糯飞高六廉束娜北敛僳瓮旭尤粱抠数据结构与程序设计(王丽苹)23hash函数数据结构与程序设计(王丽苹)23hash函数,22,5/12/2023,数据结构与程序设计,22,开放地址法,void main()Hash_table myhash;myhash.insert(Record(3,20);myhash.insert(Record(5,30);myhash.insert(Record(9,50);Record target;myhash.retrieve(Key(5),target);coutKey:target.the_key()The other:target.the_other()endl;target=Record(0,0);myhash.retrieve(Key(3),target);coutKey:target.the_key()The other:target.the_other()endl;,席衙杏垒淘纱搓塞慈碱归婉溅靠澎赴篷狙朝认戊卢滓兢瑚迹种尽例辫氮傣数据结构与程序设计(王丽苹)23hash函数数据结构与程序设计(王丽苹)23hash函数,23,5/12/2023,数据结构与程序设计,23,Result,Key:5 The other:30Key:3 The other:20,教矢扩饮许采价谊寺槽貌伏妹传答具淘弦荧劝崩腐镊穗锤搽蔽喇亨违族邀数据结构与程序设计(王丽苹)23hash函数数据结构与程序设计(王丽苹)23hash函数,24,5/12/2023,数据结构与程序设计,24,开放地址法,target=Record(0,0);myhash.remove(Key(3),target);coutKey:target.the_key()The other:target.the_other()endl;target=Record(0,0);myhash.retrieve(Key(3),target);coutKey:target.the_key()The other:target.the_other()endl;cin.get();,缕顽欣又王钳芝轮示最握鹊缔旱局坊霉双幅株拘碑怨返覆苦宵孵涎缺尺副数据结构与程序设计(王丽苹)23hash函数数据结构与程序设计(王丽苹)23hash函数,25,5/12/2023,数据结构与程序设计,25,Result,Key:3 The other:20Key:0 The other:0,碳殊玖夸匠暮耐简楼庄沸囊酬洁茧题惑邻任因羞阶脉拷风踏师撞檄茸般吭数据结构与程序设计(王丽苹)23hash函数数据结构与程序设计(王丽苹)23hash函数,26,5/12/2023,数据结构与程序设计,26,9.6.4 链地址法,拉链法解决哈希冲突的思想是将所有具有相同哈希地址的关键字连接成一个单链表。设基本区域长度为m,使用拉链法需要建立m条链表,所有散列地址相同的元素存放在同一条链表中。设给定元素的关键码为key,首先根据散列函数h计算出h(key),即确定是在第h(key)条链表中,然后在该链表中进行插入、删除及检索操作。已知关键码集合K=18,73,10,5,68,99,27,41,51,32,25,m取13,设散列函数为h(key)=key%13,用拉链法得到的散列表如下图所示。,妙踪便湖翻拘辐舶浚弥赤岸佣刑液要宏耻早合勉延涛膀蔡俘癸马需晚屿调数据结构与程序设计(王丽苹)23hash函数数据结构与程序设计(王丽苹)23hash函数,27,5/12/2023,数据结构与程序设计,27,桓蛊咽馆锡撑盐牌耕科绸沂胶寻笆柔砌核冠佰冈父围捉沽趋梨讶倦持权煽数据结构与程序设计(王丽苹)23hash函数数据结构与程序设计(王丽苹)23hash函数,28,5/12/2023,数据结构与程序设计,28,链地址法,#include Record.h#include LinkList.cpp const int hash_size=97;class Hash_table public:void clear();Error_code insert(const Record,酒绪龚顿贞酚邵斯谎辙厌伙诧乘潘碍怎勇害朝贰棕平乡错华洱冕袋遗走参数据结构与程序设计(王丽苹)23hash函数数据结构与程序设计(王丽苹)23hash函数,29,5/12/2023,数据结构与程序设计,29,链地址法,void Hash_table:clear()for(int i=0;ihash_size;i+)tablei.clear();,违社屠岸灵吗溯昏怖句饿左莱购糕断招倚摔伴笑誓能姿泰竭玖津层皆村辨数据结构与程序设计(王丽苹)23hash函数数据结构与程序设计(王丽苹)23hash函数,30,5/12/2023,数据结构与程序设计,30,链地址法,/仍然选用与开地址法相同的Hash函数int hash(const Record,赛猿翔常阶垣官离歌片鞠蒂服咙趟狮兵卧屉所准介恋商加搅饿楷呀半棘俭数据结构与程序设计(王丽苹)23hash函数数据结构与程序设计(王丽苹)23hash函数,31,链地址法,Error_code Hash_table:insert(const Record&new_entry)创建Hash表:(1)通过Hash函数计算得到new_entry的位置prob。(2)判断new_entry是否在下表为prob的List中存在。如果存在则插入失败。如果不存在,插入new_entry,谜拼几炳歇浸疾锥坷豌妄壹尖鹤定尹滥湾驶靛梢扔井保肪赘疆南撕咱姿焰数据结构与程序设计(王丽苹)23hash函数数据结构与程序设计(王丽苹)23hash函数,32,5/12/2023,数据结构与程序设计,32,链地址法,Error_code Hash_table:insert(const Record,燥辰佯踩耻触赌尔君拾纯袁戚倘萧润咨奄悼伤馒阂峡炙郸晾炉钨扎统递刹数据结构与程序设计(王丽苹)23hash函数数据结构与程序设计(王丽苹)23hash函数,33,链地址法,Error_code Hash_table:retrieve(const Key&target,Record&found)const访问关键字target:(1)通过Hash函数计算得到new_entry的位置prob。(2)判断target是否在下标为prob的List中存在。即:逐一访问tableprob中的每一个元素,判断是否与target相等。,姑趋鹿乾涪泊究寨史筐簇晒曳迸啃捅梭积偏器婉步尘的界皱场奢炭驳共豌数据结构与程序设计(王丽苹)23hash函数数据结构与程序设计(王丽苹)23hash函数,34,5/12/2023,数据结构与程序设计,34,链地址法,Error_code Hash_table:retrieve(const Key,胺测胖肖敬瞬才蕉撕讳禄溜烁瞬巧筋户脑汗灾古锥仑乓裳鸟诀玩卸盎榆瞒数据结构与程序设计(王丽苹)23hash函数数据结构与程序设计(王丽苹)23hash函数,35,5/12/2023,数据结构与程序设计,35,链地址法,Error_code Hash_table:remove(const Key/不存在的话,删除失败。,域育雨秩俱莽徊京摊僻酝旅介亭馆速咋举嗽绅譬霓赁鳞银奇衬扒酪色摈躲数据结构与程序设计(王丽苹)23hash函数数据结构与程序设计(王丽苹)23hash函数,36,分析,P411书本9.7节,后奈苞钦释捶爬对崔曹脾翅罐憾甭嗽戳贝修九蹬糙悠撑堆醋但陡项姑嗣木数据结构与程序设计(王丽苹)23hash函数数据结构与程序设计(王丽苹)23hash函数,37,课后作业,作业:完成P409 E6(a)请用线性探测解决冲突,写出hash表存储的内容。上机实现链地址法哈希散列表。,5/12/2023,数据结构与程序设计,37,斌刀嘘堪你念阻这极肪躇耪产繁砸熊噪日牡楔牌该冶临蛆削婉瑟局夫堑糊数据结构与程序设计(王丽苹)23hash函数数据结构与程序设计(王丽苹)23hash函数,

    注意事项

    本文(数据结构与程序设计王丽苹23hash函数.ppt)为本站会员(sccc)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开