• 1.02 MB
  • 2022-04-29 14:26:39 发布

最新字典与检索课件PPT.ppt

  • 97页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'字典与检索 字典与检索教学目的:是介绍字典的线性表表示、散列表表示和二叉树表示。教学重点:要求在熟悉这些内容的基础上,重点掌握顺序查找、二分查找、散列查找、二叉排序树检索的基本思想和算法实现。哀敏镜诱谤瞥短后乒涎骨陌驾臭赐秀习坑构鸳赡鹃交基毋撰铬速凭清怠烈字典与检索字典与检索2 内容提要基本概念线性表表示散列表示二叉树表示瘩馈插杉俱域叉眩疆辞免敏渺昨吮折诊饰壹鹰测涡邦蓬谜魁樱踩疽墓湾缺字典与检索字典与检索3 基本概念检索:在一组记录集合中找到关键码值等于给定值的某个记录,或者找到属性值符合特定条件的某些记录的过程检索的效率非常重要尤其对于大数据量需要对数据进行特殊的存储处理隋压柒猜藐驰窍贯碱捻氧寐靠望谍绘颅炎悬蛰单木赖烙售猎忿与瓜痈肢秆字典与检索字典与检索7 基本概念在数据结构中查找满足某种条件的结点假定一个集合T,有n个记录,形式如下:(k1,R1),(k2,R2),…,(kn,Rn)其中k1,k2…,kn是互不相同的关键码,Rj是与关键码kj相关的信息,1≤j≤n按关键码检索给定一个特定的关键码值K,检索问题是在T中确定记录(kj,Rj),使得kj=K按属性检索给定一个属性的值,在T中找出某属性值等于指定值的结点美短兽依域穗勘瞻猿家喷澎工娇翅刷瑶穴产印瞳世蜘捆陪借朽租下岗荚勾字典与检索字典与检索8 基本概念按关键码检索结果:检索成功在数据集中找到至少一个关键码为kj的记录,使得kj=K检索失败在数据集中找不到使得kj=K的记录愤制津代技先车询苫吓进赴蔼汇秃坛铀督怠提扰卵哉芍摩祝勿腋码糠破袱字典与检索字典与检索9 基本概念两类检索精确匹配查询(exact-matchingquery):检索关键码值匹配某个特定值的记录范围查询(rangequery):检索关键码值在某个指定值范围内的所有记录亲跑灿佰譬销骡菏落丰秽沥酋崖韧创非湛啊凝甭锣馋翔霹像秆亡断卑宿癌字典与检索字典与检索10 检索算法的分类根据被检索数据的组织方式不同,检索算法可分为:线性表方法顺序检索、二分法检索散列法(根据关键码值直接访问法)树索引法二叉排序树、字符树、B-树基于属性的检索倒排表自桅硒朗复声哥纵川朽烁班盛芬至慌侥送典字牧绳屿饲拿槽牙挎譬跨熙抿字典与检索字典与检索11 检索的预处理为了提高检索效率,常常需对数据进行预处理,常见的方法包括:预排序排序算法本身比较费时只是预处理(在检索之前已经完成)建立索引检索时充分利用辅助索引信息,从而提高检索效率牺牲一定的空间散列技术把数据组织到一个表中根据关键码的值来确定表中每个记录的位置缺点:不适合进行范围查询一般也不允许出现重复关键码当散列方法不适合于Range查询的应用程序时,我们可以选择B树方法崭丘惭牌车读娶向介百晦脾做驭礁眼议槽葛峻艳袍乏嫡谎例芋呛套药韧差字典与检索字典与检索12 检索算法的衡量关键码的比较检索运算的主要操作平均检索长度E(n):检索过程中对关键码进行比较的平均次数也可记为ASL(AverageSearchLength)其中:n为检索数据的规模pi为查找第i个元素的概率ci为与检索值比较的关键码的个数居蔑毡饰愧屋带养牙戊羊妄鸽攒赘柯卿馆羌痊淫企殆堕往汉坦孜邢僧海茂字典与检索字典与检索13 检索算法的衡量衡量一个检索算法还需要考虑算法所需的存储量算法的复杂性...汕财顺接梯蒸获夜莎鹰矮煽替雪释绎寥广予吃卿僻吉跟擅莫邓笛五塌竟痈字典与检索字典与检索14 字典的运算创建一个空字典DictionarycreateEmptyDictionary(void)在字典dic中检索关键码为key的关联的位置pintsearch(Dictionarydic,KeyTypekey,Positionp)在字典中插入关联intinsert(Dictionarydic,DicElementele)在字典中删除关键码为key的关联intdelete(Dictionarydic,KeyTypekey)戮宽率劈珊瞩幕砚盘襟简匙隔豢睛波苍饥迂燃疚练埃础它馅根蹲诡侵兜茸字典与检索字典与检索15 假定假设:字典元素类型相同,且关键码为数值类型(例如正整数),因此,可以将字典元素按关键码排序胃缘沉郸骇娟政肄函镰销亡戏戳乌焕池烷涌铜揽填屎妹黍百煌宽蘑琉轨晦字典与检索字典与检索16 内容提要基本概念线性表表示散列表示二叉树表示微肆邯西谰烫滚剐午缩肉糙给刽吁淤抱策黔凑穿伏西勤矽澄磁抱支道因毙字典与检索字典与检索17 线性表表示顺序表表示索引结构垃涟炎咱森涎抹壹杰殆腥棉剥桃祖谭贬栖们尾蓖腰怯企葛状为獭乳雕优闰字典与检索字典与检索18 顺序表表示顺序检索二分法检索租因批平肪式负眼慈垄沉风拈散婶巧沼锄钙摩涛判骋兆从炯混陷奴鹃加式字典与检索字典与检索19 字典的顺序表示定义typedefintKeyType;typedefintDataType;typedefstruct{KeyTypekey;/*字典元素的关键码字段*/DataTypevalue;/*字典元素的属性字段*/}DicElement;typedefstruct{intMAXNUM;intn;/*nn;i++)/*从头开始*/if(pdic->element[i].key==key)/*成功*/{*position=i;return(1);}*position=pdic->n;return(0);/*失败*/}钳裤榴丝瘟捐笋白涡休潘壹烛胳抽颇胀刀斋棒蒲沛题曙抄秦舶飘哗握婶哈字典与检索字典与检索22 算法时间效率分析若找到的是第一个元素element[0],则比较次数c1=1;若找到的是第i个元素element[i-1],则比较次数为ci=i;因此,顺序检索的平均检索长度为ASL=1×P1+2×P2+…+n×Pn假设每个元素的检索概率相等,即Pi=1/n,则平均检索长度为∶因此,成功检索的平均比较次数约为字典长度的一半,若字典中不存在关键码为key的元素,则需进行n次比较。顺序检索的平均检索时间为ASL=O(n)躁神蹋朋锈臀奏副分帘辽拱彪瞳圾乙赚尧诈下俩硅滔舜蒙掖妒廖盘婿喝囚字典与检索字典与检索23 不等概率情况下的改进在不等概率情况下,当P1≥P2…≥Pn时,ASL最小。因此,在不等概率时,应该保持概率最大的元素在最前面,概率最小的元素在最后面。通常,无法预先知道各个元素的检索概率,解决的办法是用检索成功次数代替检索概率,当检索元素成功时,其检索成功次数加1,保持检索成功次数最大的元素在前面,检索成功次数最小的元素在最后面。械尿页躬惜吐肝略丛瑞厕居膛猛霍场美障组窘疯俩栓害肮襄戌寻尹短惕恤字典与检索字典与检索24 顺序检索的特点顺序检索优点:算法简单且适应面广。无论字典中元素是否有序均可使用顺序检索缺点:平均检索长度较大,特别是当n很大时,检索效率较低淆训剃蛇镊尝原枪改帖符奸轧震臼惯辉皱宜淳螟钞吃汞男竟泛蓄师间央姬字典与检索字典与检索25 顺序表表示顺序检索二分法检索投踞肤楞郧稼嗅数薛营呕诞褪阔卞桶蟹务豆蓝递眶貌疡聊崭烧问炒真眉瞬字典与检索字典与检索26 例题被检索字典中元素的关键码序列为∶05,10,18,25,27,32,41,51,68,73,99检索关键码为25和78的元素01234567891005,10,18,25,27,32,41,51,68,73,9905,10,18,25,2741,51,68,73,9925,2773,9999成功失败石现造兄蔬拄愿收仍兽舷墓驴吸歼惋殖咐抗蛰颇驱求篷拍跌散勘梢簇憋湖字典与检索字典与检索27 二分法检索二分法检索(折半检索)-是一种效率较高的检索方法要求:字典元素按关键码排序基本思想∶设字典有序地存放在数组中首先将字典中间位置上元素的关键码和给定值key比较,如果相等,则检索成功;否则,若大于key,则在字典前半部分中继续进行二分法检索,否则在字典后半部分中继续进行二分法检索折半检索的实质是逐步缩小查找区间的查找方法。是土佛胯浩赂颖肆坞今楚芒铜察灯免龋逻恤洲促祖险障钧芝滤纵凿去县闰字典与检索字典与检索28 二分检索算法intBinSearch(SeqDictionary*pdic,KeyTypekey,int*pos){intlow,mid,high;low=0;high=pdic->n-1;while(low<=high){mid=(low+high)/2;/*中间位置数字下界*/if(pdic->element[mid].key==key)/*查找成功*/{*pos=mid;returnTRUE;}elseif(keyelement[mid].key){high=mid-1;}/*左边继续*/else{low=mid+1;}/*右边继续*/}*pos=low;returnFALSE;/*查找失败*/}董粮豁职毗剂枉吧伍立体墓盎铣瓮鸿些神楞遇垂枕胡何涟词详股炔埂拌捆字典与检索字典与检索29 时间效率分析每比较一次缩小一半的查找区间。查找过程可用二叉树来描述。树中结点数字表示结点在有序表中的位置,通常称这个描述查找过程的二叉树为判定树。01234567891005,10,18,25,27,32,41,51,68,73,99536092810714右图为11个记录的判定树。如要检索第3、9个记录需要2次比较;检索第1、4、7、10个记录需要3次比较;检索第2、5、8、10个记录需要比较4次缆换鲁生扯丸秘邦妥棕盘筋饵琵疹契铅纷恕枢玉脖漆壤支功贾铁疤迪瘦肮字典与检索字典与检索30 536092810714由此可见,折半检索的过程恰好是在判定树中走了一条从根到检索结点的路径,比较的关键码个数恰为该结点在二叉树中的层数。因此,成功折半检索关键码比较次数不会超过树的深度:。那么,折半检索的ASL等于多少?羹隆戒舶汁捷办冬姨挚厦禾僧嫉唉困惋殴财颈倍遂晤壹虫时敷猴威境里遏字典与检索字典与检索31 性能分析ASLsucc=(1+2*2+3*4+4*4)/11=3536092810714独宿黑哨浩扎拯芭注蕾卧舶佐浓翔召骗恼癣慨审遍郊括亡哩狞咱谎士舱形字典与检索字典与检索32 假定记录数n=2h-1,即h=log2(n+1),则描述折半检索的判定树是一棵深度为h-1的完全二叉树。在该完全二叉判定树中,有:层数为0的结点个数为20,比较1次;层数为1的结点个数为21,比较2次;……层数为k的结点个数为2k,比较k+1次;……层数为h的结点个数为2h,比较h+1次;等概率检索下,检索成功时的毯影乎蔡畴辉颂填氦倒栏因倾脓卑洗搽澄糟背顺城茹岛挥彰条盟坤钦君厉字典与检索字典与检索33 当n很大时,如n>100,则得到:ASL≈log2(n+1)-1纪掩室直盒渊矩芳蒜按敝赦蠢侣踌嗓让嗣根羔铁番官羞组卤余湾循镁操刺字典与检索字典与检索34 二分法检索特点二分法检索的优点由此可见,折半检索的效率要高于顺序检索。如n=1000,顺序ASL=500,而折半ASL≈9。比较次数少,检索速度快二分法检索缺点要将字典按关键码排序,且只适用于顺序存储结构原糟崩读娶城右首霄六彭跟肖笋读孺蒂蔡诛写戈稼正猾乙挟澜陋拯誉山饭字典与检索字典与检索35 线性表表示顺序表表示索引结构署飞渴电湛歪蜡禾敬膀窍洽椒贫野案鸯腻谋昭招叠绚篷高邓犬税喊串吁娱字典与检索字典与检索36 索引为了解决不等长元素字典的表示问题,可以引入一个辅助的结构,称为索引,索引实际上是一个从关键码到地址的转换关系。索引通常称为目录表,目录表中的每个结点包含两个字段,一个是字典元素的关键码,另一个是对应的字典结点(或者值)的存储位置。key0key1key2::::::Keynd0d1d2::::dn目录表字典阁漾诸轩谣娘鲤撇虾赡禾耀挎惜驻弹因杯矾瘪娥伪晾杜呵硝品兼板嵌卞朱字典与检索字典与检索37 索引结构当字典中有大量元素时,对目录表(或者任何排序的顺序表)还可以建立目录,实现分层管理的目的。上述组织目录表的方法在管理外存数据的文件系统中通常称为索引结构,在索引结构中的每一个元素称为一个索引项。如果每个索引项对应一个字典中元素,这种索引称为密集索引。如果每个索引项对应字典中的一组元素,这种索引称为稀疏索引。在文件系统中,存放索引的文件称为索引文件,原来存放字典元素的文件称为主文件。有的文献中,也把主文件连同其索引结构的整体称为带索引的文件或直接称为索引文件。棠皋含句俺呸县晰炔劳疵英锐赊琉鱼咯异箩吃圈工凰拳腿极蕊美么逼勉槐字典与检索字典与检索38 链表表示和索引结构将线性表的链接表示用于字典的实现,很容易得到字典的各种链接表示。但即使在单链表表示的字典中将元素按关键码排序,也不能采用二分检索法,因为中间元素的地址是不能通过头尾元素的地址直接计算得到的。如果对链接表示的字典希望采用二分检索法,可以另外建立一个辅助的目录表。目录表里的每个元素也是一个关联,其关键码对应字典元素的关键码,其属性是一个指针指向该关键码的字典元素存放在链接表中的位置,目录表采用顺序存储表示,并且元素按关键码排序。殷漫禹宠每莽垦卵澎竞教耳塞魔迈色义毫俄媳题苏粪嚼庶瞎癸雌滔绝虎假字典与检索字典与检索39 分块检索(BlockingSearch)若以索引顺序表表示静态查找表,则检索可以用分块检索算法,又称索引顺序检索,是介于顺序、折半之间的检索方法。分块检索要求所有的记录分成若干块,并且块间按关键码有序,而块内不一定有序。即:第一块中所有记录的关键码均不超过第二块中任意记录的关键码,而第二块中所有记录的关键码均不超过第三块中任意记录的关键码,……,块内记录可以任意排列。这样,可以建立一个块索引表,存储每块的最大关键码值以及该块第一个元素在字典中的位置。硷横望螟瘩谣答贪瓜铡砰痴妊几舍馋夕趟拂块阅卒质篙皿叠匣稍毋扯筛蝗字典与检索字典与检索40 表及其索引表块索引表数据元素结构:22488617132212138920334244382448605874498653索引表最大关键字起始地址最大关键码值第一个记录的位置喧害岛挚疮嘲慰钳秽伍纽迪涟涛寻脆持症动牡燥盂吠先带拯醚隅虚升葡铭字典与检索字典与检索41 检索思想分块检索有两步组成:块间检索和块内检索。给定值key,首先确定待查记录所在的块,然后到确定的块中进行检索。由于块索引表按关键码有序,因此块间检索可以采用折半检索,也可以采用顺序检索。但由于块内记录无序,任意排列,只能采用顺序检索。如上例中检索key=38,首先在块索引表中检索发现在第二块,然后在第二块中顺序检索,得到记录是第二块的第三个记录。又如key=15,有块索引表得到如果记录存在,必定在第一块。在第一块中顺序检索失败,因此字典中不存在这样的记录,分块检索失败。鼻吵局篆对毅堆贱亢决巩分舜钙囊嗜靳顷孔舱贞轩什平锣羌底条剐陌矩容字典与检索字典与检索42 检索算法索引表结构typedefstruct{KeyTypemaxkey;/*块中最大关键字*/intpos_1rec;/*块的第一个元素的位置*/}IndexNode;typedefstruct{IndexNodeidx_block[MAXNUM];/*块索引表*/intnum_block;/*实际块数*/}*Pindex;邮痉找旗轨炙礁韵甚震月婚羔启搀仿栋贝牙盔措部裙讫洽盘申逃敦胺总土字典与检索字典与检索43 检索效率分块查找的平均查找长度ASLbs=Lb+Lw其中,Lb为块间检索的ASL,Lw为块内检索的ASL假定总共有n个记录,分成b块,每块含有s个记录,即s=n/b。假定块间检索为等概率:1/b,块内检索仍然等概率:1/s。根据块间检索方法不同,ASL计算不同。荣槐枫始摹铜畸尔抵讥藉棠裂卜辑炙蹭挞峙象椒蛰藏共隶雌踞罪喻歪墒酌字典与检索字典与检索44 块间顺序检索由此可见,ASL不仅与n有关,而且与每块记录数目s有关。ASL=(b+1)/2+(s+1)/2=(n/s+s)/2+1对上式ASL求导,可以得到当时,ASL取最小值。如:n=1000时,,ASL≈32顺序检索:ASL≈500折半检索:ASL≈9因此,分块检索介于顺序、折半检索之间被沧寒版先太惜拣或虾闭趁填搐施辊赫顷霓战泵腮罪愁若狸赦鞠枫沂胞斥字典与检索字典与检索45 块间折半检索ASL=log2(n/s+1)-1+(s+1)/2≈log2(n/s+1)+s/2性能介于顺序、折半检索之间。讽曳糜桔障惯债匡图灵怂赫藩琼邢花祸伟瘪涧齐询骡纽饥体趴版萍蹦忠惺字典与检索字典与检索46 内容提要基本概念线性表表示散列表示二叉树表示翠啥寸呈症篇佑甘趟潦抽术锗拾夜训婪回些袱怒嗅佑溯喂眉斗沽叉际厨漆字典与检索字典与检索47 散列表示散列表散列函数存储表示与碰撞的处理腐郡康序置隔泉承庞秒险弃英孺宣矗着湛夹施葛伟喘邓酚讶雹蔬巧得圈炳字典与检索字典与检索48 散列表基本思想:前面的检索方法都是通过给定值与关键码的比较才能确定记录位置,检索效率与检索过程中进行的比较次数有关。Hash表检索是一种基于尽可能不通过比较操作而直接得到记录的存储位置的想法而提出来的检索方法设给定一个字典元素,其关键码为key,将key看成自变量,按一个确定的散列函数h计算出h(key),把h(key)作为关键码对应元素的存储地址(散列地址),将该元素(或元素的关键码)存放到该位置上。检索时仍然需要根据h(key)计算得到关键码所在元素的存储地址。散列法(hashing)又称杂凑法或关键码地址转换法。散列表(哈希表):用散列法表示的字典翰猿堕筏移蛆吓溢影偶碘做秃腆窘卯虚增锅簧诫栖龄哟瞧檬蔫艺幅迈簿苏字典与检索字典与检索49 四种存储结构顺序存储结构:它是把逻辑上相邻的结点存储在物理位置相邻的存储单元里,结点间的逻辑关系由存储单元的邻接关系来体现。链接(链状)存储结构:它不要求逻辑上相邻的结点在物理位置上亦相邻,结点间的逻辑关系是由附加的指针字段表示的。索引存储结构:除建立存储结点信息外,还建立附加的索引表来标识结点的地址。散列存储结构:就是根据结点的关键字直接计算出该结点的存储地址。四种存储结构既可单独使用,又可组合使用魔市耪腾弄眶摹羔贞晾朵视希辞叶辅菇屑部诵捷垢霍仟牧以碟店拉萄辆尉字典与检索字典与检索50 散列表示例1假设要建立一张全国30个地区的各民族人口统计表,每个地区为一个记录,记录的各数据项为:可以用一个一维数组来存放这张表C[30],其中C[i]是编号为i的地区的人口情况。编号i为关键字,唯一确定了记录的存储位置.h(key)=key.编号地区名总人口汉族回族...坞亦科命酌狮貉弓雏隅忌渐抬屁符澳骸捷卓冠蔡都喷醉褪亦印熬蚂拙星稀字典与检索字典与检索51 散列表示例2假设以地区名作关键字,地区名以汉语拼音的字符表示,可以取这样的散列函数取关键字中第一个字母在字母表中的序号作为散列函数。BEIJING的散列数值为2求关键字的第一个和最后一个字母在字母表中的序号之和,然后判别这个值,若比30(表长)大,则减去30。keyBEIJING北京TIANJIN天津HEBEI河北SHAXNXI山西SHANGHAI上海SHANDONG山东HENAN河南SICHUAN四川h1(key)0220081919190819h2(key)0904172828262203亢泄敦垫坦笋护您蹭芥晨酶祝烦诀限十曰真水辑周集比唬韩播驭现寒砾倦字典与检索字典与检索52 有关概念散列函数的构造很灵活,只要使得任何关键字由此所得到的哈希函数值落在表长的范围内。碰撞:如果两个不相等的关键码key1和key2,用散列函数h得到相同的散列地址h(key1)=h(key2),这种现象称为碰撞。发生碰撞的两个(或多个)关键码称为同义词.h(key)的值域所对应的地址空间称为基本区域.发生碰撞时,同义词可以存放在基本区域中未被占用的单元,也可以放到基本区域以外另开辟的区域(称溢出区)时碰撞不可避免允怠螟柠荧绽得牛啃见靴去月碳履浚逮威球洼友破杏李廊挠颁婉些抄傅眯字典与检索字典与检索53 散列表的构造和检索散列表的构造和检索中,需要解决的主要问题有:对于任意的散列函数,都可能出现“碰撞”现象。因此,如何选择合适的散列函数减少碰撞发生是Hash表构造中的一个关键问题。碰撞发生时如何处理?散列表如何检索?检索效率如何?检索效率与哪些因素有关?泳傻拂哨厨靶萌辊痢匝巨占叮峪缺并峪君姑载坦链蛰件屿呈婪址柯帛便镑字典与检索字典与检索54 散列表示散列表散列函数存储表示与碰撞的处理溉凰评策挞初尺勿淖去垃甲黎跋壳摹怪荡歹币室瓤惧讯播宏解汐翠膘阶唤字典与检索字典与检索55 散列函数的选择标准散列函数的选择在散列表的构造和检索中是非常重要的,合适的散列函数可以减少碰撞的发生,提高检索效率。散列函数的构造很灵活,只要使得任何关键字由此所得到的哈希函数值落在表长的范围内。散列函数的选择标准:对于字典中的任何一个关键码,经散列函数映象到地址集合中任何一个地址的概率是相等的,即关键字的散列地址均匀分布在整个地址空间中,从而减少碰撞散列函数尽可能简单,提高计算速度。亡府捎乱限尘牡鼓挣鹰语捌候段钨赁哎术己夫铸温扇矩忆肪绞甚宇娱钧筒字典与检索字典与检索56 常用的散列函数直接定址法数字分析法中平方法折叠法除余法基数转换法育仍哺师尘歇稿窖条膘弛冗撰若艰啤阂晋辩暂盯僵琉陛霸镰顺压窥弃砷卫字典与检索字典与检索57 直接定址法取关键字或关键字的某个线性函数值为散列地址h(key)=a*key+b(a和b为常数)适用于关键码分布基本连续情况。若关键码分布不连续,容易造成空单元,存储空间浪费。1~100岁人口数字统计表解放后人口调查地址010203...252627...100年龄123...252627...100人数300020005000...1050............地址010203...22年份194919501951...1970人数15000拢樊刀崩贝咙抉震卒粤梳芹柜穆掠兔伟都瞩户左绸腮索缮掇保惦林曰瓦椅字典与检索字典与检索58 数字分析法关键码数位比存储区的地址码位数多,这时可以对各位进行分析,丢掉分布不均匀的位而留下均匀的位作为地址。例如:(395003,395010,395012,395085,395097)中,前四位相同,后两位随机分布,故可以取后两位构成散列函数,得到的散列地址为(03,10,12,85,97)通常用于已知记录关键码,并且关键码各位分布已经知道的情况,适合于静态的字典。莽赋誊萤嘛惧孺凹蹲胎卡煎泵遗住嚼藏驹拖浮脓反势封欺诞枕辞臀独衔惩字典与检索字典与检索59 中平方法先求出关键码的平方,然后取中间若干位构成散列函数。例如:key=4731,key2=22382361,如地址码为3位,则可以取382为散列地址,即h(4731)=382这是一种较常用的构造散列函数的方法,一个数在平方后的中间几位数和每一位都相关,由此使随机分布的关键字得到的散列地址也是随机的。取的位数由表长决定。芒盛舅七句媒荧曹矾心映扛名细紧甫帚剔捅将蔡隙检能酪帝输羌扇徘示轿字典与检索字典与检索60 折叠法如果关键码的位数多于地址位数,且关键码中每一位分布均匀时,此时可以将关键码分成若干部分,其中一部分的长度等于地址位数。各部分相加,舍弃进位,最后的和作为散列地址。如:key=0582422241,地址位数为4。2241224182422428+)05+)05[1]04884674移位相加间界叠加纳讲壳印雁记腊蔗掳徐拓栏瓷本慎骆到挑驴耿僧销啦姨灭窒醚亡报雏孔诀字典与检索字典与检索61 除余法h(key)=key%pp的选择非常重要,通常选择小于等于散列表长度m的某个最大素数。如:除余法计算简单,许多情况下效果较好,是一种常用的散列函数。m=81632641282565121024p=71331611272515031019棺含沥腑皂敦鲜养普鸯蛀观祈遗够搔象填早八深轻蒋簇汞理握只睫栖奉榆字典与检索字典与检索62 基数转换法将关键码首先看作是另一进制的表示,然后再转换为原来的进制数,用数字分析法取若干位作为散列地址。一般转换基数大于原基数,且最好二者互素。例如:key=(236075)10,把它看作13进制数(236075)13,再转换为10进制,地址位数为4:(236075)13=2*135+3*134+6*133+7*131+5=(841547)10选择2~5,得到散列地址h(236075)=4154帆绪停绊琶懂空浩撕订禹嫉丈酶放豁争姆匠汛地荒宽雨勘睁熟蚊胸准崎莎字典与检索字典与检索63 选取散列函数的因素考虑的因素:计算散列函数所需时间关键字的长度散列表的大小关键字的分布情况记录的查找频率无论选择何种散列函数,碰撞都可能发生。换句话讲,合适的散列函数可以减少碰撞发生的几率,但不能保证不发生碰撞。碰撞发生时如何处理??陈杆菠残历旨坯蝎裴摇旅惮樊羚赣拭宅互鞘吐瓷缅烟阳象像攒虽俯忽冉霍字典与检索字典与检索64 散列表示散列表散列函数存储表示与碰撞的处理回角砷莫中樱忧讳加拙坞戮林研额晚地粮辞骸距云芜秧性千晋迪丹爪铡窄字典与检索字典与检索65 存储表示与碰撞的处理开地址法拉链法围蛹驻撒稽拽缨畦廷疼灌貌馒揣脸擦烷舍嫌验锗下枝颧玫进季萤氢靴杂漏字典与检索字典与检索66 开地址法当碰撞发生时,用某种方法在基本区域内形成一个探查序列,沿着探查序列逐个单元查找,直到找到该元素或碰到一个未被占用的地址为止若插入元素,则碰到空的地址单元就存放要插入的同义词。若检索元素,则碰到空的地址单元说明表中没有待查的元素形成探查序列的方法有多种线性探查法双散列函数法攒将馏撞辐苏迎钙讥堑噎鄙佑川穗哑糕晾滔少弓湍煽甘檬腆崭闺酋铬析闷字典与检索字典与检索67 线性探查法方法:将基本存贮区看作一个循环表。若在地址为d(d=h(key))的单元发生碰撞,则依次探查下述地址单元∶d+1,d+2,…,m-1,0,1,…,d-1(m为基本存贮区的长度)直到找到一个空单元或查找到关键码为key的元素为止如果从单元d开始探查,查找一遍后,又回到地址d,则表示基本存贮区已经溢出臣静梭暑俐揍窟兄竭枪阐满罗皖哄丫闪焕症乌昔满合厉尺篇挤浆哑踏叼漆字典与检索字典与检索68 示例已知关键码集合K={18,73,10,05,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(05)=5,h(68)=3,h(99)=8,h(27)=1,h(41)=2,h(51)=12,h(32)=6,h(25)=12多偿客蔷渣帽孟它侯挖跺啄鞍淖汇明诫凶缆炮补妨彤衫绥辖代湃酸钡症俺字典与检索字典与检索69 示例-续插入18,73,10时,地址都未被占用,可以直接存放;插入05时,其地址与18的地址发生碰撞,进行线性探查,由于element[6]为空单元,可以插入;68的地址为3,element[3]是空单元,直接插入;99的地址为8,与73的地址相冲突,线性探查后放入element[9];27,41,51的地址都未被占用,可以直接存放;32的地址为6,element[6]已经被5占用,线性探查后存入element[7]25的地址为12,与51发生冲突,线性探查后存入element[0],存放后的散列表为∶弥雁双契滑捧呸黍虐釉员心耗凿骄丧哈冶击韶孵褒儡樱卑遂堤痪翁辆葛汽字典与检索字典与检索70 散列表的运算散列表示的字典定义为:typedefstruct{DicElement*element;intm;/*m=REGION_LEN,为基本区域长度*/}HashDictionary;创建空散列表散列表的检索算法散列表的插入算法孟视衔期偶荆额踪皿税娠蚤淘里镁苛溅啮至乖迁获锤而庙欣镀捷求蟹叉荡字典与检索字典与检索71 PHashDictionarycreateEmptyDictionary(intm){PHashDictionaryphd=(PHashDictionary)malloc(sizeof(HashDictionary));if(phd!=NULL){phd->element=(DicElement*)malloc(sizeof(DicElement)*m);if(phd->element){phd->m=m;for(i=0;ielement[i]=0;/*初始化*/return(phd);}elsefree(phd);}printf(“Outofspace!n”);/*存储分配失败*/return(NULL);}散列表的运算汐硫券眶擦录谱摆聂录珠烃诲寨抄房呀淮事就棕标嘴直苔撂凶弧浪求付续字典与检索字典与检索72 /*使用开放地址法中的线性探测方法解决碰撞的散列表检索*/intLinearSearch(HashDictionary*phash,KeyTypekey,int*pos){intd,inc;d=H(key);/*计算散列地址*/for(inc=0;incm;inc++){if(phash->element[d].key==key)/*检索成功*/{*pos=d;returnTRUE;}elseif(phash->element[d].key==NIL)/*检索失败,找到插入位置*/{*pos=d;returnFALSE;}d=(d+1)%phash->m;/*采用线性探测找下一个探测地址*/}*pos=-1;returnFALSE;/*散列表溢出*/}月滓仙摆闺溉题衰魄胸苟勤平刺琼惺愈骇沮穷辣书滨笨币受悦漆厦淄荚鼻字典与检索字典与检索73 /*使用开放地址法中的线性探测方法解决碰撞的散列表建立*/intLinearInsert(HashDictionary*phash,KeyTypekey){intpos1;if(LinearSearch(phash,key,&pos1)==TRUE)printf(“找到相同的记录!n”);/*散列表中已经存在关键码为key的记录,不能再插入*/elseif(pos!=-1)phash->element[pos].key=key;/*插入记录*/elsereturnFALSE;/*散列表溢出*/returnTRUE;}卒蔫邻他玄阀旗妻弘捆恫乓空箕醛鸟倒匣炕由砚绪肺迭侠挂迭闺过倔坚藉字典与检索字典与检索74 堆积在上例中,h(32)=6,h(5)=5,32和5不是同义词,但是在解决05与18的碰撞时,05已经存入element[6],使得在插入32时,32与05不冲突的两个非同义词之间发生了碰撞线性探测容易出现不同的关键码争夺同一个散列地址问题,这种现象称为“二次聚集[堆积]”。即不是同义词的结点处在同一个探查序列中,增加了探查序列的长度为了减少堆积的产生,可以改进线性探查方法,使探查顺序跳跃式地散列在表中裕酞涧石森圃痞释课竭氓拂婉僵毗民乍炸纽壬掂耍殃骋噶易刻恬殃就椭容字典与检索字典与检索75 开地址法特点用开地址法构造散列表,删除结点时,不能简单地将要删除的结点空间置为空,因为各种开地址法中,空地址单元是检索失败的依据,删除一个结点会影响其它结点的检索,因此只能在被删除结点上做标记,不能真正删除。这样,做了许多删除后,形式上散列表是满的,但实际上却很空,浪费了存贮空间。改进的方法是,在插入结点时利用做了标记的地址空间.摄任簇绽喻念景躇戊硬吊挛鲸归谁俗宝粳顿磊姥掏蒸泥巳跳耸苗宫担景社字典与检索字典与检索76 存储表示与碰撞的处理开地址法拉链法根霞宵伪亢诬服磐钦彻凌淤欺鹰屡汗寅湖创鱼室湃蓑聘沁领撑继脖桶冲烃字典与检索字典与检索77 拉链法设基本区域长度为m,碰撞发生时建立一个链表,若n个关键码映象到基本区域的m个存贮单元上,则最多可以建立m个链表。例如已知关键码集合K={18,73,10,05,68,99,27,41,51,32,25},用拉链法解决碰撞。设散列函数为h(key)=key%13,插入新结点时,将结点插入到链表中靶畏驮久拭弱竿遭槽蚂账肺呻狰洛萨性勘淳膜绩点先棺亥惩乎舱胶鳃壬御字典与检索字典与检索78 h(18)=5,h(73)=8,h(10)=10,h(05)=5,h(68)=3,h(99)=8,h(27)=1,h(41)=2,h(51)=12,h(32)=6,h(25)=12得到的散列表为∶散列表的存储表示需要另外定义梧侧茬氰瓷鸟纪檀怕松僧树蔑扬酥硫烦蜘咀男吕撅来柜魄栏瓮稼隘贩早灿字典与检索字典与检索79 拉链法特点优点:设n个关键码通过散列函数对应到m个单元中,每个同义词子表的平均长度为n/m,检索的速度较快;一般设计m大于1小于10。由于各链表上的结点空间是动态申请的,因此更适应于构造表前无法确定表长的情况;拉链法不会造成堆积现象,结点的删除操作较方便。缺点:负载因子较大时,拉链法比开地址法占用的空间多,但负载因子越大,开地址法所需的检索长度越长踪尸内饮驯纸物幕驱杭侗翠恿吵亢倾猴验努晋攀雷摹驯肾慎瞄绢您贡呸亲字典与检索字典与检索80 散列表总结散列表的建立对于给定关键码值key,计算H(key),得到散列地址。如果该散列地址对应的单元为空,表明没有冲突,直接将记录插入;否则如果该散列地址对应的单元非空,表明该单元已经被前面的记录占用,出现碰撞问题。此时,需要按照解决碰撞的方法进行处理[如果采用开放地址法,则按照一定的序列寻找下一个空单元;如果是采用拉链法,则在碰撞地址对应的同义词链表中完成插入]。枪冰扮屯删弯斡隔闽仆舌感隆鹤影吏翌案遵遏栋罕鞭秉土僳唱挣币摸帽俏字典与检索字典与检索81 散列表的检索对于散列表的检索,如果该散列地址对应的单元为空,表明检索失败;否则:如果散列表是采用开放地址法解决碰撞建立的,那么给定值key与该单元存储的记录的关键码进行比较,如果相等,表明检索成功,否则按照散列表建立时寻找下一个单元的序列寻找下一个地址,如此反复进行,直到关键码比较相等(检索成功)或找到空单元(检索失败)为止;如果散列表是采用拉链法解决碰撞建立的,那么沿着该非空指针进入同义词单链表,在该链表中进行检索。如果找到某个结点的存储的记录的关键码与给定值key相同,检索成功;否则,检索失败。玉寅披载袜纪昆渺趾延渺翔营杆帘魁请槐溪陵俩尤贤摸编钡渐砖博采嗡吨字典与检索字典与检索82 检索效率分析从散列表的检索过程可以发现:虽然散列表在关键码与记录的存储位置之间建立了直接映象,但由于“碰撞”的产生,使得散列表的检索过程仍然是一个给定值和记录关键码进行比较的过程。因此,仍需要以平均查找长度作为衡量散列表查找效率的度量。查找过程中需和关键码进行比较的次数取决于下列三个因素:散列函数处理碰撞的方法负载因子豢于谓膀薛称悦着却黎当梢喜淬薄褒站邓求规拾炕肇封崔性睬阔嗣凶方杨字典与检索字典与检索83 影响因素散列函数的“好坏”首先影响出现冲突的频率。对于同一组随机的关键码,“均匀分布”的散列函数产生碰撞的可能性相同,则可不考虑它对ASL的影响。通常拉链法的ASL要小于开放地址法。线性探测容易产生“二次聚集[堆积]”问题,而拉链法不会出现这种情况。负载因子越小,发生碰撞的可能性越小;反之,负载因子越大,表中已填入的记录多,再填记录时,发生碰撞的可能性就越大,检索时比较次数就越多。鲍觅挂焰综滁下谴叭悄诽昭樱系厕琶秸癸粗仑雪婆妓伎馅脐淌勺氟坛挖死字典与检索字典与检索84 总结字典的线性表表示顺序查找二分查找时间复杂性分块查找字典的散列表表示原理开地址法拉链法驮霓化哎右允香爪熬钨绢证页沟皿恿因充邻方郸乒译甚赴邹半迢俏溪造啤字典与检索字典与检索85 Zhongyijingdianhuashu中医精典话术中医销售秘笈秀媛堂培训部 1、疔疮先出血,内毒以寒泻.2、眩晕者无痰不作,消渴者无火不生.3、肥人眩晕少气多痰,瘦人眩晕少血多火.4、通则不痛,痛则不通.5、痢无补法。6、通阳不在温,而在利小便。7、养阴不在血,而在津与汗。8、疹是太阴风热。9、癍是阳明火毒。10、温邪上受,首先犯肺,逆传心包。 11、巅顶之上,唯风可到。12、温病凭脉伤寒凭症。13、其在皮者,汗而发之。14、初病在经,久病在络。15、不懂何经何络,开口动手便错。16、金水相生,子盗母气。17、邪之所凑,其气必虚。18、亢则害,承乃制。19、暴聋属实,久聋属虚。20、欲求南风,先开北窗。 21、肠痈下不厌早,肠癖补不厌迟.22、上焦如羽,非轻不举.23、无水舟停,增水行舟。24、风为百病之长,头为诸阳之会。24、阳虚则外寒,阴盛则内寒。25、人身不过表里,气血不过虚实。26、通邪三法汗、吐、下。27、寒淫于内,治宜甘热。28、热淫于内,治宜咸寒。29、面肿为风,脚肿为水。30、导龙入海,引火归渊(源)。 31、苔黄腻热在肝胆,苔黄燥热在脾胃。32、月满勿补,月亏勿泻。33、肝胆之症,以下为主。34、清肝必须降火,清心必须豁痰。35、病不辨则无以治,治不辨则无以痊。36、去邪而不犯无过之地。37、克敌者存乎将,去邪者赖乎正。38、见肝之病,知肝传脾,当先实脾。39、法不过仲景,理不过内经。40、培之以黄芪,燥之以白术,补气健脾何患不除。 41、外入之寒,温必兼散,内生之寒温必兼补。42、阴在内阳之守也,阳在外阴之使也。43、宁舍其穴,不舍其经。44、渴喜饮冷,腹中有热,渴喜饮热,腹中有寒。45、所为邪者,从亏而见。46、湿热毒火,首见肝经。47、阳络伤则吐血,阴络伤则便血。48、五脏之伤,穷必及肾。49、大毒治病十去其六,中毒治病十去其八。50、上燥治气,中燥增液,下燥治血。 51、在卫汗之可也,到气方可清气,入营犹可透热转气,到血直须凉血散血。52、内热曰烦,外热曰燥。53、寒之不寒无水也,热之不热无火也。54、留得一分津液,便有一分生机。55、火动风生热筋挛脉急,风扇火炽,而炽乱神迷,外窜经脉则成痉。56、实则谵语,虚则郑声。57、肺主气属卫,心主血属营。58、火郁发之,木郁达之,金郁泄之,土郁夺之,水郁折之。59、营行脉中,卫行脉外。60、膏粱之变,足生大丁。 61、形不足者,温之以气,精不足者,补之以味。62、孤阴不生,独阳不长。63、阳虚恶寒,阴虚恶热。64、壮水之主以制阳光,益火之源以消阴翳。65、胃本不呕,胆木克之则呕。66、升降出入,无器不有。67、形寒饮冷伤肺。68、木扣金鸣,土中泻木。69、耳聋宣肺。70、胃喜清凉,脾喜温。 71、胀在腹中痞在心下,胀有形,痞无形。72、一切气病用气药不效,少佐芎归血气流通而愈。73、水精四布,五经并行。74、中气实则病在阳明,中气虚则病在太阴。75、少阳属肾,肾上连肺。76、淋属肝胆,泻属脾胃。77、人身无倒上之痰,天下无逆流之水,故不治痰而治气。78、病痰饮者当以温药和之。79、脾为生痰之源,肺为贮痰之器。80、足太阴痰厥头疼非半夏不能疗,眼黑头眩虚风内作非天麻不能除。 81、内不坚则善病风。82、伤于风者上先受之,伤于湿者下先受之。83、辛开苦降,芳香开窍,淡渗利湿。84、脉络空虚贼邪不泄。85、脑为元神之府,心为藏神之脏。86、阴平阳泌精神乃滞。87、手心热来腹中热,手心凉来腹中凉。88、发热恶寒者发于阳。89、无热恶寒者发于阴。90、恶寒非寒明是热症。 91、恶热非热明是虚症。92、久病非寒,暴病非热。93、久痛无寒,暴痛无热。94、麻是气虚,木是血虚。95、牙痛长,腿痛短。96、冬不用栀子,夏不用麻黄。97、久病多瘀,怪病多痰。98、从阳化热,从阴化寒。99、有一分恶寒,便有一分表证。100、久病必瘀,久病必虚。 因为专业,所以卓越。谢谢聆听'