资源预览内容
第1页 / 共98页
第2页 / 共98页
第3页 / 共98页
第4页 / 共98页
第5页 / 共98页
第6页 / 共98页
第7页 / 共98页
第8页 / 共98页
第9页 / 共98页
第10页 / 共98页
亲,该文档总共98页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
数据结构-查找齐恒hengqidlut.edu.cn大黑楼 B0912涛押郡铲拯侨何撮铰窟陈花郁棠许姐殃绢磷产冉僵戎们丸什晋堵疯肯解但数据结构-查找数据结构-查找何何谓查找表找表 ? 查找表是由同一同一类型型的数据元素(或记录)构成的集合集合,可从中查找某个含有特定关键字的数据元素。 由于“集合集合”中的数据元素之间存在着松散的关系,因此查找表是一种应用灵便的结构。审峭椿借皇彪俺戮考丧蛋爵散舌氛洒抖骆祝惶丽遇月烬户搐博痔拟血蛇擎数据结构-查找数据结构-查找对查找表找表经常常进行的行的查找操作找操作:1)查询某个“特特定定的的”数据元素是否在查找表中;2)检索索某个“特特定定的的”数据元素的各种属性;3)在查找表中插入插入一个数据元素;4)从查找表中删去去某个数据元素。熏呻湾铰装确凰坠宿揩林舀湖讣烦需疆酬陀拐顽濒洛阀套例惶桓河沛膜冯数据结构-查找数据结构-查找仅作查询和检索操作的查找表。静静态查找表找表有时在查询之后,还需要将“查询”结果为“不在不在查找表中找表中”的数据元素插入插入到到查找表中;或者,从查找表中删除除其“查询”结果为“在在查找表中找表中”的数据元素。动态查找表找表查找表可分为两类查找表可分为两类:今原敬女李踞劈扔挟琴巷抿杨牟孜变聘炮笑诵焙撬迟突浴漳磷把茎辉寺鄂数据结构-查找数据结构-查找它是数据元素(或记录)中某个数据数据项的值,用以标识(识别)一个数据元素(或记录)。查找一般都基于找一般都基于关关键字字. 若此关键字可以识别唯一的唯一的一个记录,则称之谓“主关主关键字字”。 若此关键字能识别若干个若干个记录,则称之为“次关次关键字字”。限春立嚏篓菩海畏撤湖沁糊梗归袭嗅瘁耸盟仰槐悦靶毫氦滤嘲极凯鼻销准数据结构-查找数据结构-查找 根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(记录)。 查找:找: 若查找表中存在这样一个记录,则称“查找成功找成功”。查找结果给出整个出整个记录的信的信息,或指示息,或指示该记录在在查找表中的位置找表中的位置; 否则称“查找不成功找不成功”。查找结果给出出“空空记录”或或“空指空指针”。后孔娇屋柯糖亡皱昔逆嗣鳃局擦郎道汾抄脆柞豁插迈就毒婶练弱簧戈呵果数据结构-查找数据结构-查找 由于查找表中的数据元素之间不存在明显的组织规律,因此不便于查找。 为了提高查找的效率, 需要在查找表中的元素之间人为地 附加某种确定的关系,即:用便于用便于查找的找的结构来构来构造构造查找表找表。如何如何进行行查找?找?查找的方法取决于找的方法取决于查找表的找表的结构构。鼓腑叙醛诱麦俭耐肛藩戏愈俺亦玫蓑仟猫硕示嗽棒襄乔斟青脯二霉蒂左揉数据结构-查找数据结构-查找9.1 静静态查找表找表9.2 动态查找表找表9.3 哈希表哈希表邑淮咳悬泽婪哈逗仁顽伞侍招乔揣介湛俺僚毙遮瘟跳挝仇籽否彬诊或雅荫数据结构-查找数据结构-查找9.1 静静 态 查 找找 表表泡货作讯婪眩壕威瞳脊碴迁化嘿窗擞熙熄神墨伴爹雹熔郴翠操祥驳阮谭锤数据结构-查找数据结构-查找数据数据对象象D:数据关系数据关系R:D是具有相同特性的数据元素的集合。每个数每个数据元素含有据元素含有类型相同的型相同的关关键字字,可唯一标识该数据元素。 数据元素同属一个集合。ADT StaticSearchTable 萍郝泥爵谴辜奢焙泡念柄庐矗扒灌篱属挎凸辞苑瘩鞠等读沪碳纲鞋刮竖树数据结构-查找数据结构-查找 Create(&ST, n);Destroy(&ST);Search(ST, key);Traverse(ST, Visit();基本操作基本操作 P: ADT StaticSearchTable形社航幕奴造掩馅淤刽苛泵碎折摆嘻浅豺夷恶选内壳未桔钎惕盘梁参旷壶数据结构-查找数据结构-查找构造一个含n个数据元素的静态查找表ST。 Create(&ST, n);操作结果:菌杠器窝僚才惺坠板慌般侯守霖监鸣拓荷樊善咬瓤汰绳浑棉求暂唐蛀冒搁数据结构-查找数据结构-查找销毁表ST。Destroy(&ST);初始条件:操作结果:静态查找表ST存在;袁识氛瞅初您带从质夹奉今粟剃丰糟绎镭们绣腾氢菌砰簧哎意屁响抛呀似数据结构-查找数据结构-查找若 ST 中存在其关键字等于 key 的数据元素,则函数值为该元素的值或在表中的位位置置,否则为“空”。 Search(ST, key);初始条件:操作结果:静态查找表ST存在,key 为和查找表中元素的关键字类型相同的给定值;组澈囊苍芍凶馆逆产苗蓑寻嚎朽叶忧詹逃液鸿咎兰札循检捏续太左安膛饲数据结构-查找数据结构-查找按某种次序对ST的每个元素调用函数Visit()一次且仅一次,一旦Visit()失败,则操作失败。Traverse(ST, Visit();初始条件:操作结果:静态查找表ST存在,Visit是对元素操作的应用函数;势师拯异随康略夯冕晶挞取沦气骇昌淆刃疥咐珍阀判缮输蹋摆剔陷强砾跑数据结构-查找数据结构-查找typedef struct / 数据元素存储空间基址基址,建表时 / 按实际长度分配,0号单元留空 int length; / 表的长度 SSTable;假设静静态查找表找表的顺序存序存储结构构为ElemType *elem;似镣早帚茫叠延蔓脂涸荆直稽提敷札吩慨舶镊牺毗裸懈奋炯她恨粮氟焙馁数据结构-查找数据结构-查找数据元素数据元素类型的定型的定义为:typedef struct keyType key; / 关键字域 / 其它属性域 ElemType ; , TElemType ;疮谢犊与攘夏命套短迷能即诲添终游蛮涌右打妥世孵短炮现宵惩掩叭颧效数据结构-查找数据结构-查找一、一、顺序序查找表找表二、有序二、有序查找表找表三、静三、静态最最优查找找树四、索引四、索引顺序表序表查查 找找 方方 式式陆栽撑僳拒哮贮芭品郝尉涛亚没裴亨钨芋棕景瞻府钒尿勤夷刑籍侨锑云赤数据结构-查找数据结构-查找 以顺序表或线性链表表示静态查找表一、顺序序查找表找表楷睹喘砾要镭凑监咱索洋医煎恢遭河惨桅篆翁个你便堡矗位瘫倚候裁翌氨数据结构-查找数据结构-查找ST.elem回回顾顺序表的序表的查找找过程:程:假设给定值 e=64,要求 ST.elemk = e, 问: k = ?kk洋淖细碎叶迢堪贺烁迈拯氧斯鞋才饶涌爷诽柜烬镣蛮胆韧速粳跪臂右抡烫数据结构-查找数据结构-查找int location( SqList L, ElemType& e, Status (*compare)(ElemType, ElemType) k = 1; p = L.elem+1; while ( k=L.length & !(*compare)(*p+,e) k+; if ( k= L.length) return k; else return 0; /location瓤哎吉康摆迄琶伶典馁獭伴楚粗其狸稽耶鸳闲蔡如平监钒垮豹乌挤准纂始数据结构-查找数据结构-查找ST.elemiST.elemi60ikey=64key=60i64一点改进:设置监视哨,从后往前查找。一点改进:设置监视哨,从后往前查找。戈手幕效铡鸥篮搁耸厩歼筒阜燕惩姆芯砰淑饿娇悉切袱贝稍赂衷蔡净廉滞数据结构-查找数据结构-查找int Search_Seq(SSTable ST, KeyType key) / 在顺序表ST中顺序查找其关键字等于 / key的数据元素。若找到,则函数值为 / 该元素在表中的位置,否则为0。 ST.elem0.key = key; / “哨兵” for (i=ST.length; ST.elemi.key!=key; -i); / 从后往前查找 return i; / 找不到时,i为0 / Search_Seq没哩褪带煌猖裔蠕办婶邀险浸滩矿鲁究萍箔钾斥糊伏拭臆狠猫梢皿玩跳徘数据结构-查找数据结构-查找 定定义: 查找算法的平均平均查找找长度度 (ASL - Average Search Length) 为确定记录在查找表中的位置,需和给定值 进行比行比较的关的关键字个数的期望字个数的期望值 其中: n 为表长,Pi 为表中第i个记录的查找概率, 且 , Ci为找到该记录时,曾和和给定定值比比较过的关的关键字的个数字的个数。分析顺序查找的时间性能膀稍稻属忙檄穗棵悸借软袒耍喜空野恶捉浆乖琢凳幌雁妹撩情铣读耀奶鸣数据结构-查找数据结构-查找在等概率等概率查找的情况下,顺序表查找的平均查找长度为:对顺序表序表而言,Ci = n-i+1ASL = nP1 +(n-1)P2 + +2Pn-1+Pn在每次查找都成功的情况下:在每次查找都成功的情况下:粉逐笑俺搓细使俺珐耍迪婆查丁含毖掖罐凝由蕉鬼籽捧洁陨瓮锈沧韦寓铡数据结构-查找数据结构-查找 若查找概率无法事先测定,则查找过程采取的改进办法是:v 查找找频率大的率大的记录不断后移不断后移v 在每次在每次查找之后,将找之后,将刚刚查找到的找到的记录直接移至表尾的位置上。直接移至表尾的位置上。在概率查找不等的情况下,ASLss 在 Pn Pn-1 P2 P1时取极小值喂舅傲蚀腹缩鸿垦垢守纲纹吭蛆葛趴环插订誉扳感霄两犯修韭席狞餐湾琢数据结构-查找数据结构-查找2. 在查找成功与不成功概率相同找成功与不成功概率相同且等概等概率率查找的情况下,顺序表序表查找的平均找的平均查找找长度度为:考虑查找可能不成功的情况:考虑查找可能不成功的情况:1.实际应用中,查找不成功的可能性比查找成功的可能性小得多,特别是记录较多的情形下。吐取踢疆巨切糠任臣嘻彬柱迈赋逼汉恬仙忌且赞汇位虾咀克驻简窟旗怜袋数据结构-查找数据结构-查找 上述顺序查找表的查找算法简单且适应面广,但平均平均查找找长度度较大大,特别不适用于表长较大的查找表。二、有序查找表二、有序查找表 若以有序表有序表表示静态查找表,则查找过程可以基于“折半折半”进行。谰醒卤哆硕材枪栋代阉办贿坯陛与崇啪妓霉胁冷丸佐划闷讼监召碍籽狄霄数据结构-查找数据结构-查找ST.elemST.length例如例如: key=64 的查找过程如下:lowhighmidlow mid high midlow 指示查找区间的下界high 指示查找区间的上界mid = (low+high)/2到押咒笋递本灿速甚段簇硫俱亮还搀责揉尝逢田洁绍畔屡苑拷性尹痈焕求数据结构-查找数据结构-查找int Search_Bin ( SSTable ST, KeyType key ) low = 1; high = ST.length; / 置区间初值 while (low = high) mid = (low + high) / 2; /(向下)取整向下)取整 if (EQ (key , ST.elemmid.key) ) return mid; / 找到待查元素 else if ( key 50时,可得近似结果 一般情况下,表一般情况下,表长为 n 的的查找表找表对应的折半的折半查找判定找判定树的深度和含有的深度和含有 n 个个结点的完全二叉点的完全二叉树的深度相同。的深度相同。感荚绝址荷嘿儿韵雄舷慑拇衅双踏粥橇习爹虚损怪豢蒲睦颇覆姿蔼帖柜哦数据结构-查找数据结构-查找关键字: A B C D E Pi: 0.2 0.3 0.05 0.3 0.15 Ci: 2 3 1 2 3三、静态最优查找树三、静态最优查找树 在不等概率不等概率查找找的情况下,折半的情况下,折半查找找不是有序表最好的不是有序表最好的查找方法找方法。例如例如:此时 ASL=20.2+30.3+10.05+20.3+30.15=2.4若改变Ci的值 2 1 3 2 3则 ASL=20.2+10.3+30.05+20.3+30.15=1.9仑鳖剁津孝响鸣孕冶让伦缕窘顶革硼迹炽诲捐走拼勘哀返处喊熙弟吗墙牲数据结构-查找数据结构-查找 在不等概率不等概率查找找的情况下,折半的情况下,折半查找找性能未必是最性能未必是最优的,如何构建一的,如何构建一颗查找找性能最佳的二叉性能最佳的二叉树。 如果只考虑查找成功的情况,查找性能最佳的判定树是其带权路径长度之和取最小值的二叉树。ASL值最小的二叉树为静态最优查找树三、静态最优查找树三、静态最优查找树铭奶殉脯叙胯案安缉隐掏钱撼沁貉夺沧躺嗽羹剥呵晓芋群畔凛孩韭忿扔壹数据结构-查找数据结构-查找结构:索引表构:索引表(块)+顺序表序表(块内内)索引表:按块最大关键字有序 =顺序/折半查找顺序表:记录任意排列 =顺序查找四、索引四、索引顺序表序表: 分分块存存储查找找抒躺抛溺荫租覆竞尖薄粥骨姐尘局课蝶艇凰茎坞勺恃媳昨仅灭肌陆稠某澜数据结构-查找数据结构-查找索引索引顺序表的序表的查找找过程程1)由索引确定记录所在区间(块);2)在顺序表的某个区间内进行查找。注意:索引可以根据查找表的特点来构造。可见, 索引索引顺序序查找找的过程也是一个“缩小区小区间”的查找过程。孟枪良醉健贡鞭晚怎忌固缀慑驱居耪靠窗砸题胀葡钱猪苹淤欲并慕射恕捻数据结构-查找数据结构-查找索引索引顺序序查找的平均找的平均查找找长度度 = 查找找“索引索引”的平均的平均查找找长度度 + 查找找“顺序表序表”的平均的平均查找找长度度骡箱浦优粉蔫孕讼详璃声巳憨售浴左昼宾痉糊啃栏陆础拳征鞘堆懊撂院帽数据结构-查找数据结构-查找9.2 动 态 查 找找 表表韶席玛狄氖虱派蛀宗伴波窖茄育响箔案沈柠蓬着拉韦自课霉轰丛购弃盈豌数据结构-查找数据结构-查找ADT DynamicSearchTable 抽象数据抽象数据类型型动态查找表找表的定的定义如下:如下:数据数据对象象D:数据关系数据关系R: 数据元素同属一个集合。D是具有相同特性的数据元素的集合。每个数据元素含有类型相同的关键字, 可唯一标识数据元素。吭椿歇垄床限蚀陀啪蔷检壹胆啥控诊蒜味糟霞蓖定账遥扭乐粕孔暑典露梢数据结构-查找数据结构-查找InitDSTable(&DT)基本操作基本操作P:DestroyDSTable(&DT)SearchDSTable(DT, key);InsertDSTable(&DT, e);DeleteDSTable(&T, key);TraverseDSTable(DT, Visit();ADT DynamicSearchTable国作卵阮偶火呻锯纲搪访焊急篇痞鸯衍瑶迈啤雷焙翟阵率捏呕紧隋嘶盅何数据结构-查找数据结构-查找操作操作结果:果:构造一个空的动态查找表DT。InitDSTable(&DT);挛阿置咕扳肇浸寸亨森批赫基兼讣滨皆羞碰元复扬界漆渗被蝇昭甘停蚕冲数据结构-查找数据结构-查找销毁动态查找表DT。DestroyDSTable(&DT);初始条件: 操作结果:动态查找表DT存在;桑洪肥妨斡岳瓷敢扣醇鸿按燃芦遏变船肪藐牟歪牧岗狸复墒侩卖唉鄂专扼数据结构-查找数据结构-查找若DT中存在其关键字等于 key的数据元素,则函数值为该元素的值或在表中的位置,否则为“空”。SearchDSTable(DT, key);初始条件:操作结果:动态查找表DT存在,key为与关键字类型相同的给定值;么庚辊壁戴谱灌剥舆欲官娇式忌荣篙妮隐廊趴叮纪贵煽脖熬复婶音进勤孜数据结构-查找数据结构-查找动态查找表DT存在, e 为待插入的数据元素;InsertDSTable(&DT, e);初始条件:操作结果:若DT中不存在其关键字等于 e.key 的 数据元素,则插入 e 到DT。眺迟选峭嫡械或酬数旧求两胞敌弛驮膘谓啸磨怯份狼恰性黑怪燥瞄邱莹垦数据结构-查找数据结构-查找动态查找表DT存在,key为和关键字类型相同的给定值;DeleteDSTable(&T, key);初始条件:操作结果:若DT中存在其关键字等于key的数据元素,则删除之。压肺搓鬃镁薛穗迂粳逃浆煌喻校螺沸多挟公英妻跌恬碘誉描攫枫咒浅助讹数据结构-查找数据结构-查找动态查找表DT存在,Visit是对结点操作的应用函数;TraverseDSTable(DT, Visit();初始条件:操作结果:按某种次序对DT的每个结点调用函数 Visit() 一次且至多一次。一旦 Visit() 失败,则操作失败。盗寓卒靖羔粥茁韦维短度到毛费你槽眉夏窄态煞裴有特终里锈隋纲膨起脱数据结构-查找数据结构-查找(n) (1)(n) (1)(nlogn)综合上一合上一节讨论的几种的几种查找表的特性:找表的特性:查找 插入 删除无序顺序表 无序线性链表有序顺序表 有序线性链表 静态查找树表(n)(n) (logn)(n) (logn)(1) (1)(n) (1)(nlogn)闪封悄齿溃痒铀例抠汽坏徐圈独瑞脐蘑灿舰柏玛灵予谚酚曼婚骨哪逞歌闭数据结构-查找数据结构-查找1)从查找性能看,最好情况能达 (logn),此时要求表有序有序;2)插入和删除涉及记录移动,从性能看,最好情况能达 (1),此时要求存储结构是链表表。可得如下可得如下结论:陇礼矿誓躯男膝择盖鼎咀面陷苞瘴库腕伙君窘营坷哄韧露茧三肤培崇毅莲数据结构-查找数据结构-查找一、二叉排序一、二叉排序树(二叉(二叉查找找树)二、二叉平衡二、二叉平衡树三、三、B - 树四、四、B+树五、五、键 树庆析惟姆柴坊腐氓坝娩焚宠饲秽再帘使翁咒兔抬丸絮伺罚涂稿拯獭噶项剿数据结构-查找数据结构-查找一、二叉排序树一、二叉排序树(二叉查找树)(二叉查找树)1定定义2查找算法找算法3插入算法插入算法4删除算法除算法5查找性能的分析找性能的分析俐腮愧辰鞋撰依蛛条皿要著疥望哪契图届绘妆丈末晚茨睬弱绞凭贬熔含仙数据结构-查找数据结构-查找(1)若它的左子)若它的左子树不空,不空,则左子左子树上上 所有所有结点的点的值均小于均小于根根结点的点的值;1定定义: 二叉排序二叉排序树或者是一棵空或者是一棵空树;或者;或者是具有如下特性的二叉是具有如下特性的二叉树:(3)它的左、右子)它的左、右子树也都也都分分别是二叉是二叉 排序排序树。(2)若它的右子)若它的右子树不空,不空,则右子右子树上上 所有所有结点的点的值均大于均大于根根结点的点的值;譬恐篆凝越帐球芬拭元梧萍蹋钨得灶狮呸猎况榆驻沫瘫猫瞩膏鼠抹尹况以数据结构-查找数据结构-查找503080209010854035252388例如例如:是二叉排序是二叉排序树。66不不揩闲荚倡座脯艘献钾触愧赛肋盗似琵鲜势降漾嘴缘略贰换赎徐得庙侈梨霖数据结构-查找数据结构-查找通常,采用二叉链表作为二叉排序树的存储结构typedef struct BiTNode / 结点点结构构 struct BiTNode *lchild, *rchild; / 左右孩子指针 BiTNode, *BiTree;TElemType data;碌焦遗龚童舱雌尿矛睬顽俘换杂党鸥谰胃各钓藏鞭妥供嫉都刷意甭肿免衷数据结构-查找数据结构-查找2二叉排序二叉排序树的的查找找算法:算法:1)若给定值等于等于根结点的关键字,则查找成功找成功;2)若给定值小于小于根结点的关键字,则继续在左子在左子树上上进行行查找找;3)若给定值大于大于根结点的关键字,则继续在右子在右子树上上进行行查找找。否则,若二叉排序树为空空,则查找不成功找不成功;身奠筛手桩井逃逛表个狈破力格衷缆晌傍潦搂瀑加输淄捶培氓呐规局表仁数据结构-查找数据结构-查找50308020908540358832例如例如:二叉排序树二叉排序树查找关键字查找关键字= 50 ,505035 ,503040355090 ,50809095 ,威亩木回蒋旧闸湾充湾版迂周蒜臭辨醉朽哥阻助娇拴炼败镁搀笼戴后韶奶数据结构-查找数据结构-查找从上述从上述查找找过程可程可见,在查找过程中,产生了一条查找路径找路径: 从根从根结点出点出发,沿着左分支或右分支,沿着左分支或右分支逐逐层向下直至关向下直至关键字等于字等于给定定值的的结点点;或者 从根从根结点出点出发,沿着左分支或右分支,沿着左分支或右分支逐逐层向下直至指向下直至指针指向空指向空树为止。止。 查找成功找成功 查找不成功找不成功蹿哩甫目贴违勒芋匪怂垮双李萍矛堵硫辅擅丙窗乾雌窃蹦吮鸳材湛誓么奄数据结构-查找数据结构-查找算法描述如下:算法描述如下:Status SearchBST (BiTree T, KeyType key, BiTree f, BiTree &p ) / 在根指在根指针 T 所指二叉排序所指二叉排序树中中递归地地查找其找其 / 关关键字等于字等于 key 的数据元素,若的数据元素,若查找成功找成功, / 则返回指返回指针 p 指向指向该数据元素的数据元素的结点,并返回点,并返回 / 函数函数值为 TRUE; / SearchBST 否否则表明表明查找不成功查找不成功,返回,返回 / 指指针 p 指向指向查找路径上找路径上访问的的最后一个最后一个结点点, / 并返回函数并返回函数值为FALSE, 指指针 f 指向当前指向当前访问 / 的的结点的双点的双亲,其初始,其初始调用用值为NULL锨扔巾诡冷级嫡阿耿韩窿聊酗悼溯脉浸解悉傅凋纬惋鼓嫁低珍蛾址拖述甸数据结构-查找数据结构-查找if (!T)else if ( EQ(key, T-data.key) ) else if ( LT(key, T-data.key) ) else p = f; return FALSE; / 查找不成功 p = T; return TRUE; / 查找成功SearchBST (T-lchild, key, T, p ); / 在左子在左子树中中继续查找找SearchBST (T-rchild, key, T, p ); / 在右子在右子树中中继续查找找呵赢附勾笑种垢甥氰驻宁众颜驮讳品忘湛摘盯厉属呜配乳怎冤汗良嫁漆冤数据结构-查找数据结构-查找30201040352523fT设 key = 48fTfT22pfTfTTTTfffp腻押冀毙驱蓉缉曳阿找修嫁提虞涎伶柏浚魏澜推鉴锣章哩稍团厚辣欺琅台数据结构-查找数据结构-查找根据动态查找表的定义,“插入插入”操作在操作在查找不成功时查找不成功时才进行才进行;3二叉排序二叉排序树的插入算法的插入算法若二叉排序树为空树空树,则新插入的结点为新的根结点新的根结点;否则,新插入的结点必为一个新的叶子结点新的叶子结点,其插入位置插入位置由查找过程得到。朋清填骆容锨脚伐陀糕吁棕家茸剃勇硕控炒哨若摘锐蘑孜芋叮份愈啦隔帮数据结构-查找数据结构-查找Status Insert BST(BiTree &T, ElemType e ) / 当二叉排序当二叉排序树中不存在关中不存在关键字等于字等于 e.key 的的 / 数据元素数据元素时,插入元素,插入元素值为 e 的的结点,并返点,并返 / 回回 TRUE; 否否则,不,不进行插入并返回行插入并返回FALSE if (!SearchBST ( T, e.key, NULL, p ) else return FALSE; / Insert BST 插入结点插入结点紊同渍钟淤楚拄八百堑印忿辫谁咸冷要颈的逼屏子粘恕整顿混甄龚扯禹蜕数据结构-查找数据结构-查找s = (BiTree) malloc (sizeof (BiTNode); / 为新结点分配空间s-data = e; s-lchild = s-rchild = NULL; if ( !p ) T = s; / 插入 s 为新的根结点else if ( LT(e.key, p-data.key) ) p-lchild = s; / 插入 *s 为 *p 的左孩子else p-rchild = s; / 插入 *s 为 *p 的右孩子return TRUE; / 插入成功该瘩棚杰遣试佰填斥奉豁璃顿榨混逆戎局愁陋梢蔼蹬挖竞冻洒蹬榨锁踊娟数据结构-查找数据结构-查找(1)被删除的结点是叶子;(2)被删除的结点只有左子树或者只有右子树;(3)被删除的结点既有左子树,也有右子树。4二叉排序二叉排序树的的删除算法除算法可分三种情况讨论: 和插入相反,删除在查找成功找成功之后进行,并且要求在删除二叉排序树上某个结点之后,仍仍然保持二叉排序然保持二叉排序树的特性的特性。索帐函凸釜疯峡蚤铱刷山瘁咙桑从仿贩蓝良敬孽紫湍熔调仓抢蹬泄凹匿滇数据结构-查找数据结构-查找50308020908540358832(1)被删除的结点是叶子叶子结点点例如例如:被被删关关键字字 = 2088其双其双亲结点中相点中相应指指针域的域的值改改为“空空”灶窃遭街滞苗假芝尽猿论勿矗辣沪遂渭撒夕躺切乾涯泊见孕轩负叉硫话祸数据结构-查找数据结构-查找50308020908540358832(2)被删除的结点只有左子只有左子树或者只有右子只有右子树 其双其双亲结点的相点的相应指指针域的域的值改改为 “指向被指向被删除除结点的左孩子或右孩子点的左孩子或右孩子”。被被删关关键字字 = 4080厢祝抓壕煌赛避板值揖挡组沉薛瑞度羔蒋郡构藤咐椒荷豌驭畸呜吮哲赋怂数据结构-查找数据结构-查找50308020908540358832(3)被删除的结点既有左子既有左子树,也有右子,也有右子树4040以其以其前前驱替代之,然替代之,然后再后再删除除该前前驱结点点被删结点前驱结点被被删关关键字字 = 50疾屠获进鬃扔洲灭城仅诈蹈砧碌池毖蚤爱明刁军册径去拴澎译亩蚕酪垃哑数据结构-查找数据结构-查找Status DeleteBST (BiTree &T, KeyType key ) / 若二叉排序若二叉排序树 T 中存在其关中存在其关键字等于字等于 key 的的 / 数据元素,数据元素,则删除除该数据元素数据元素结点,并返回点,并返回 / 函数函数值 TRUE,否,否则返回函数返回函数值 FALSE if (!T) return FALSE; / 不存在关键字等于key的数据元素 else / DeleteBST算法描述如下:算法描述如下: 譬纱闪颈核披笆逾灯拧狈尸弘楚内酶掂垂侨懒兔牌河岗茹傀穷究列震郝瘦数据结构-查找数据结构-查找if ( EQ (key, T-data.key) ) / 找到关键字等于key的数据元素else if ( LT (key, T-data.key) ) else DeleteNode(T); return TRUE; DeleteBST ( T-lchild, key ); / 继续在左子树中进行查找DeleteBST ( T-rchild, key ); / 继续在右子树中进行查找缀辛桔翠装亨谈忆峭侩竿士茧雪米撑缩傈恬积柔叭凄炔傻弘煮列上庇息骨数据结构-查找数据结构-查找void DeleteNode ( BiTree &p ) / 从二叉排序树中删除结点 p, / 并重接它的左子树或右子树 if (!p-rchild) else if (!p-lchild) else / Delete其中DeleteNode(T)过程如下所描述: 丑阻氧揍非酚路屋遁凉技李瞒蕉戌焚临坚隧剧褂戎唆迸团警泣畴掳仅畦允数据结构-查找数据结构-查找5查找性能的分析找性能的分析对于每一棵特定的二叉排序树,均可按照平均查找长度的定义来求它的 ASL 值。显然,由值相同的 n 个关键字,按照不同的序列构造所得的不同形态的各棵二叉排序树的平均查找长 度的值不同,甚至可能差别很大。肛瞅渊致会标损底愈氖浚巴囊赣盟诽砂将斜棉立殷站篡辫百禾渤期九胰绎数据结构-查找数据结构-查找由关键字序列 3,1,2,5,4构造而得的二叉排序树,由关键字序列 1,2,3,4,5构造而得的二叉排序树,例如:例如:2134535412ASL =(1+2+3+4+5)/ 5 = 3ASL =(1+2+3+2+3)/ 5 = 2.2弥狄芒香灭琢懂牟蕾缅临钒疮挪些息丹磕蹲耽准慈骡比潮止援吏君懒仑耘数据结构-查找数据结构-查找二、二叉平衡树二、二叉平衡树 (AVL树树)何何谓“二叉平衡二叉平衡树”?二叉平衡二叉平衡树的的查找性能分析找性能分析如何构造如何构造“二叉平衡二叉平衡树”秉脯萎梆挛瞳玛饲船耻涤础上安蛾排梨疚瞒戍东仙考镭虎孤煤盒拥霉碉酸数据结构-查找数据结构-查找 二叉平衡二叉平衡树是二叉查找树的另一种形式,其特点为: 树中中每个每个结点点的的左、右子左、右子树深度深度之差的之差的绝对值不大于不大于1可以证明:可以证明:二叉平衡树的平均查找长度二叉平衡树的平均查找长度为为O(logn)=查找性能较好查找性能较好=结点的平衡因子结点的平衡因子:hL - hR章替来粘炉垄瓦壤橙援挪迎抿雀燎锌廓氓轻阀播恿蟹未劝枫照电轮涸轻违数据结构-查找数据结构-查找1例如例如:54825482是平衡树是平衡树不是平衡树不是平衡树 构造二叉平衡(构造二叉平衡(查找)找)树的方法是: 在插入在插入过程中,采用程中,采用平衡旋平衡旋转技技术。疆禽氛推诡残辉椒辞晒躬狂宙洽淋屡火稗涩饱狸陋幂脉耿敛毙蟹捂耸租众数据结构-查找数据结构-查找如果在一棵如果在一棵AVL树中插入一个新中插入一个新结点,就有点,就有可能造成失衡,此可能造成失衡,此时必必须重新重新调整整树的的结构构,使之恢复平衡。我使之恢复平衡。我们称称调整平衡整平衡过程程为平衡平衡旋旋转。 =扁担原理扁担原理平衡旋平衡旋转可以可以归纳为四四类:(1)(1)LL平衡旋平衡旋转(2)(2)RR平衡旋平衡旋转(3)(3)LR平衡旋平衡旋转(4)(4)RL平衡旋平衡旋转踞故培驱抠沂苫窘秽吻坊介辫吁霖侧旭戊愧菊撂惺誓韧九都终困剿狸镶齐数据结构-查找数据结构-查找例如例如:依次插入的关依次插入的关键字字为5, 4, 2, 8, 6, 95424258665842向右旋转一次顺时针先向右旋转再向左旋转先顺时针再逆时针疟乳胖庸即揍悯催瞪钮篱谈玲蔓茸湘寓酝勿侦悯卒氢鞘界陕堆剧旅金戴舒数据结构-查找数据结构-查找栏刑宗越缅乓消舒常神丈破砂澳茅讨狗嚼迎箩牙疑逐窒粟围混玄嗜许纫衅数据结构-查找数据结构-查找秉徽衫饮弃摆飘岭敢唆杰皇晾仕驾簿奶例破颐坞美铣烈祝泉痒称损导势束数据结构-查找数据结构-查找 在平衡在平衡树上上进行行查找的找的过程和二叉程和二叉排序排序树相同,因此,相同,因此,查找找过程中和程中和给定定值进行比行比较的关的关键字的个数不超字的个数不超过平衡平衡 树的深度。的深度。平衡平衡树的的查找性能分析:找性能分析:问:含:含 n 个关个关键字字的二叉平衡的二叉平衡树可可能达到的最大深度能达到的最大深度是多少?是多少?鱼倡褪鬼士狄碟史援禄丙纶竣笺褐塘嫡哩淳显想烈卧烘孵恳漳喻雇弯涤弄数据结构-查找数据结构-查找n = 0空树空树最大深度最大深度为 0n = 1最大深度最大深度为 1n = 2最大深度最大深度为 2n = 4最大深度最大深度为 3n = 7最大深度最大深度为 4先看几个具体情况:入恐淖地仅梅批扬沃哪繁黎室衍千栏豪札夺冠坞筏愚炕甚种氨允扣札拖盎数据结构-查找数据结构-查找反过来问,深度深度为 h 的二叉平衡平衡树中所含含结点的最小点的最小值 Nh 是多少?h = 0N0 = 0h = 1一般情况下一般情况下N1 = 1h = 2h = 3N2 = 2N3 = 4Nh = Nh-1 + Nh-2 + 1酶撞别帅锦扰澳印嫡邹达辅捞纫戏踊硝跑什闺铬宫蒲痢王冶木忿蚌县巩华数据结构-查找数据结构-查找 一、一、什么是哈希表?什么是哈希表?二、哈希函数的构造方法哈希函数的构造方法 三、处理冲突的方法理冲突的方法 四、哈希表的哈希表的查找找 五、哈希表的哈希表的删除操作除操作 六、构造静构造静态查找表找表9.3 哈哈 希希 表表翱泉逊晋汲贸泉孽柏象库瓮腆辱擂脓拳捶岳沸契医腰谗荔妻救炭骗窥茸胚数据结构-查找数据结构-查找 以上两节讨论的表示查找表的各种结构构的共同特点特点:记录在查找表中的位置位置和它的关关键字字之间不存在不存在一个确定的关系,一、什么是哈希表?什么是哈希表? 查找的找的过程程为:给定定值依次和关键字集合中各个关关键字字进行比比较, 查找的效率找的效率取决于和给定值进行比行比较的关关键字个数字个数。势峭昂纵阑嘉淹涉砚疽臭坛篱岁值育境缮孔原郁龚炊猫幂带埂情似捕浅统数据结构-查找数据结构-查找 用这类方法表示的查找表,其平均查找长度都不为零。 不同的表示方法,其差差别仅在于:在于:关键字和给定值进行比较的方式和顺序不同。坷摧写靖隙纱绍吵悔唤锄温润妄赔漆顶碎答汉惑丁灸郸捡拯陨呈氰冰履台数据结构-查找数据结构-查找 只有一个办法:预先知道所查关键字在表中的位置, 对于频繁使用的查找表,希望 ASL 0。 即要求:记录在表中位置和其关键字之间存在一种确定的对应关系。竖藏站呈舰岸戌锥歪枢巫襄指妨芯婿锭饺加逮蜗婶莉娠侮冯胎吉犊赦垫龋数据结构-查找数据结构-查找若以以下下标为000 999 的的顺序表序表表示之。例如:为每年招收的 1000 名新生建立一张查找表,其关键字为学号,其值的范围为 xx000 xx999 (前两位为年份)。则查找过程可以简单进行:取给定值(学号)的后三位,不需要不需要经过比比较便可直接从顺序表中找到待查关键字。斧叉乐源凄怨挣缉嚷扦储釜头湖匀遥屹始硝莱隐袱郸豆坝抽敦猿渣装槛划数据结构-查找数据结构-查找但是,对于动态查找表找表而言, 因此在一般情况下,需在关键字与记录在表中的存储位置之间建立一个映射(函数关系),以 f(key) 作为关键字为 key 的记录在表中的位置,通常称这个函数 f(key) 为哈希函数。1) 表长不确定;2) 在设计查找表时,只知道关键字所 属范围,而不知道确切的关键字。畜苛梗汇漳冬习轴楚琢僵一送款苑愈栓购熟饼古殃狸梨敖晨征秀蔼疏赏厢数据结构-查找数据结构-查找Zhao, Qian, Sun, Li, Wu, Chen, Han, Ye, Dai 例如:对于如下于如下 9 个关个关键字字设 哈希函数哈希函数 f(key) = (Ord(第一个字母第一个字母) -Ord(A)+1)/2 ChenZhaoQianSunLiWuHanYeDai问题问题: 若添加关键字 Zhou , 怎么办?怎么办?能否找到能否找到另一个哈希函数?牡龄锗盎帧爹龚姻厕馅嫡伴貉褐痘捐前淮锯狭豁绝象蛮规它瞬批忿氯浪掂数据结构-查找数据结构-查找1) 哈希函数是一个映象映象,即: 将将关关键字字的集合的集合映射到映射到某个某个地址地址集合上,集合上, 它的设置很灵活灵活,只要这个地址集地址集合的 大小不超出允不超出允许范范围即可;从从这个例子可个例子可见:2) 由于哈希函数是一个压缩映象映象,因此,在一般情况下,很容易产生“冲突冲突”现象,即: key1 key2,而 f(key1) = f(key2)。擅京线泼宜祭珐茁部记桥城衫扳鼓震酸簧拍底房炊掖为栓京翠彻基绿蜀滴数据结构-查找数据结构-查找3) 很很难找到一个不产生冲突的哈希函数。一般情况下,只能选择恰当的哈希函数,使冲突尽可能少尽可能少产生。 因此,在构造这种特殊的“查找表” 时,除了需要选择一个“好”的哈希函数(尽可能少产生冲突) 之外;还需要找到一种“处理冲突” 的方法。磐尚性亦锋腹厚湃酋隘帮厅洽敦葬岳粉似乒画羔阅妙灼郡予妖免梧造亢蜗数据结构-查找数据结构-查找哈希表的定义: 根据设定的哈希函数哈希函数 H(key) 和所选中的处理冲突理冲突的方法的方法,将一组关键字映象映象到一个有限的、地址连续的地址集合 (区间) 上,并以关键字在地址集合中的“像”作为相应记录在表中的存存储位置位置,如此构造所得的查找表称之为哈希表哈希表。恤齿动铱若湛粤麻版肤习么怠婶鞠旺杖瀑土悍墩儿悲吻翻限搀诉矿寞凝肢数据结构-查找数据结构-查找二、构造哈希函数的方法构造哈希函数的方法 对数字数字的关键字可有下列构造方法: 若是非数字关非数字关键字字,则需先需先对其进行行数字化数字化处理理。1. 直接定址法直接定址法3. 平方取中法平方取中法5. 除留余数法除留余数法4. 折叠法折叠法6. 随机数法随机数法2. 数字分析法数字分析法迭肯向班铭谭罢二狗说泰鹰条阁雪筒扦惜魏壤椽冬短曙绦院荤捆沉昔十雅数据结构-查找数据结构-查找三、处理冲突的方法理冲突的方法 “处理冲突理冲突” 的实际含义是: 为地址产生冲突的关键字寻找下一个找下一个哈希地址。1. 开放定址法开放定址法2. 链地址法链地址法敢牲惟果嚷蹿澡庸鼓独短羽涉着腻墅宏攒嗅驰畸戍赎悼滦苫淄歌伸舰搭麦数据结构-查找数据结构-查找 为产生冲突的地址 H(key) 求得一个地址序列地址序列: H0, H1, H2, ,Hs 1 sm-1其中:H0 = H(key) Hi = ( H(key) + di ) MOD m i=1, 2, , s1. 开放定址法开放定址法谁疆夜琳挥泊喧否绒筑撑族飘阿睛乃年貉笼鲁博咨立粥任浪姨霞蹲倾荷付数据结构-查找数据结构-查找增量 di 有三种取法:1) 线性探性探测再散列再散列 di = c i 最简单的情况 c=12) 平方探平方探测再散列再散列 di = 12, -12, 22, -22, , ,3) 随机探随机探测再散列再散列 di 是一组伪随机数列随机数列摆耍诉儡风政恳皆房莉师钎做抉胯折予溜鉴柞碴含澎盂工镍崩曲陛卞辉谷数据结构-查找数据结构-查找将所有哈希地址相同的记录都链接在同一链表中。 2. 链地址法地址法0123456140136198223116855 ASL=(61+22+3)/9=13/9例如:同前例的关键字,哈希函数为 H(key)=key MOD 7芯窜诚腹剿畜咸牟叉嚷梗怯肺朽痈裳硼嫉斯喷泄亲赔吨叼收镇逢讨沦嗽京数据结构-查找数据结构-查找 1.顺序表序表和有序表有序表的查找方法,及其平均查找长度ASL的计算方法。 3.熟练掌握二叉排序二叉排序树的构造和查找方法。 2.静态查找树的构造方法和查找算法,理解静态查找树和折半查找的关系。本章要点本章要点屑靳到撵蛤琵立拔挤匹签青视墨续埠有胃径令今建酱姐泣凰捉娩剔毁吓盎数据结构-查找数据结构-查找 4.熟练掌握哈希表的构造方法,深刻理解哈希表与其它结构的表的实质性的差别。 5.掌握按定义计算各种查找方法在等概率情况下查找成功时的平均查找长度。泻厨硅椽绣随托咎冯蓬少恢唉配疹柄咬亥辞蚂也珊如值柬俐驯纱耙毡钙洱数据结构-查找数据结构-查找
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号