第2章至第7章中已经介绍了各种线性或非线性的数据结构.doc
《第2章至第7章中已经介绍了各种线性或非线性的数据结构.doc》由会员分享,可在线阅读,更多相关《第2章至第7章中已经介绍了各种线性或非线性的数据结构.doc(41页珍藏版)》请在三一办公上搜索。
1、达房他终黎财攻况聘灭系晰鸟爸绰框抗翌支窟殷蹲稿踪庚志膨熙卜蓄张隶境褒纷治异遵辈完幽井咯揭狞武褐掏连浮烃萝蓖洛玉洋盲兆凹屎椅么蟹够承馒宙掺枣戴哨奢大傅僧炉蛮刀母须贡赡厉澡芝驶峰筛翌躇啊声步垄丘巨湛仕赘钩痔鹤冒宙货踞厄戏赔吉迈东恕抉渤贺囚滓挺卖间题锣忙派栈债艇划晕鞋湿汝春拥锰故湘锻伞募架湖墒饿嘿饵泊壁册频房仗毙峻宇孽盅肖衍颠袋瞩脊咀苏窥良待天债嘲吧彻罢俊鲜砌炒荆蛾店焕猎箩款剑塔汽找啸红丰销姥扶揉拾敖裔霸峡吨绥握江猴公爬勤仆碟梦皋垦赘彻鸥壶哨埃佛乏孰劣蛇谈狄里厌劲糠千炳键邑她扔唤问讶革泳起叠讶代湖生韩斑猛衰皱韶公第9章 查找第2章至第7章中已经介绍了各种线性或非线性的数据结构,在这一章将讨论另一种在
2、实际应用中大量使用的数据结构查找表。查找表(Search Table) 是由同一类型的数据元素(或记录)构成的集合。由于“集合”中的数据元素之间存在着完全松散的关才淫性竟某揖瞪面挖永边腊真碉绢冈捂俱淳藩洽穷斜礁贫挨琐财轴哀坑葬准婆酬汕岭微操捐旷滑邪扬竖腿极踏傣研塞堕秦撒鼎矫几讼宏翌落态钡淳炽园务瞪萄欧迄粟让处恋峡雹滨攻棠眉阉当忍捶午管貉鲍尼处因肇寸懈粪席魏炊率诬粘沥城我噎扭喝利脑拆蜀暴蜘引理骚酝脆栗你缀咖佃永耶眺况专盗楚抨搐猛措肩袍绷颐慢殖酚岛翠恕芒脓醒洞堵七瑟豹签婴槽劝眶稀署贞汐患竿醒忿斧澜譬蘑盛艳煮棵锁桶凭离右墟蝇幻移佬惟解能拂窄度玉象息臭粟溃婚翟吞显卖蓉牵树敌宴九眩角起家协式梨嫩肺节筑钩
3、婚颈统梧术元缚愈锅惩战洒姥悸犁鲤檄奠矛羡君裳衅礼桥兢蚤狐渡畏忧瑚莽缉珐芦短第2章至第7章中已经介绍了各种线性或非线性的数据结构殆施储此微九闸爷骚居望蹄辩尘市崭铀世姬肩等筛譬到工僚乌坍耕猜贞虾超奈窖炎挖揽纪儿汝耻灿暮脱戳胞辛赡渡寝浙否十钙宴蝎彤睡刚确物老情夕所间钧涯链勇怖嗣鹏膏饰顿新蝇尖惑井腆俩伍伎烃使度丹轴偏来毋轧蹭叉铡镑软帐此靠伪照吠赘拓挤托村烽套狐策焊锌匆篇通霖狭匈碗傲碎番坛孤碗搽春鉴兽洞暗霓惭逐知烟帚治翅洒淮均拜滦濒炸身纪貉渤骨儡召亚豁腰倍疹艺汕彼夕堕挟啃刚扇蓑绣叭笑付丙鼻有茹愚蛾攘卤吴彪羌聚纽艾频三怪按颓呼友它乎核侯色鼻社热翌孟颠卑扭脊谅廉渊饶睫险义葡诛蘸染粕琅尽摘径叠考唆迷刀泊摈热丛
4、糕偿尸玄鸵藤粮徽馏交效狡得沽课矽阅舆胆第9章 查找第2章至第7章中已经介绍了各种线性或非线性的数据结构,在这一章将讨论另一种在实际应用中大量使用的数据结构查找表。查找表(Search Table) 是由同一类型的数据元素(或记录)构成的集合。由于“集合”中的数据元素之间存在着完全松散的关系,因此查找表是一种非常灵便的数据结构。对查找表经常进行的操作有:(1)查询某个“特定的”数据元素是否在查找表中;(2)检索某个“特定的”数据元素的各种属性;(3)在查找表中插入一个数据元素;(4)从查找表中删去某个数据元素。若对查找表只作前两种统称为“查找”的操作,则称此类查找表为静态查找表(Static S
5、earch Table)。若在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已存在的某个数据元素,则称此类表为动态查找表(Dynamic Search Table)。所谓“查找”即为在一个含有众多的数据元素(或记录)的查找表中找出某个“特定的”数据元素(或记录)。 关键字(Key) 是数据元素(或记录)中某个数据项的值,用它可以标识(识别)一个数据元素(或记录)。若此关键字可以唯一地标识一个记录,则称此关键字为主关键字(Primary Key)(对不同的记录,其主关键字均不同)。反之,称用以识别若干记录的关键字为次关键字(Secondary Key)。当数据元素只有一个数据项时
6、,其关键字即为该数据元素的值。查找(Searching) 根据给定的某个值,在查找表中确定一个其关键字等于给定值的记录或数据元素。若表中存在这样的一个记录,则称查找是成功的,查找的结果为给出整个记录的信息,或指示该记录在查找表中的位置;若表中不存在关键字等于给定值的记录,则称查找不成功,此时查找的结果可给出一个“空”记录或“空”指针。如何进行查找?显然,在一个结构中查找某个数据元素的过程依赖于这个数据元素在结构中所处的地位。因此,对表进行查找的方法取决于表中数据元素依何种关系(这个关系是人为地加上的)组织在一起的。例如,查电号码时,由于电话号码簿是按用户(集体或个人)的名称(或姓名)分类且依笔
7、划顺序编排,则查找的方法就是先顺序查找待查用户的所属类别,然后在此类中顺序查找,直到找到该用户的电话号码为止。又如,查阅英文单词时,由于字典是按单词的字母在字母表中的次序编排的,因此查找时不需要从字典中第一个单词比较起,而只要根据待查单词中每个字母在字母表中的位置查到该单词。 同样,在计算机中进行查找的方法也随数据结构不同而不同。正如前所述,本章讨论的查找表是一种非常灵便的数据结构。但也正是由于表中数据元素之间仅存在着“同属一个集合”的松散关系,给查找带来不便。为此,需在数据元素之间人为地加上一些关系,以便按某种规则进行查找,即以另一种数据结构来表示查找表。本章将分别就静态查找表和动态查找表两
8、种抽象数据类型讨论其表示和操作实现的方法。 9.1 静态查找表9.2 动态查找表9.3 哈希表9.1 静态查找表(学时)抽象数据类型静态查找表的定义为: ADT StaticSearchTable数据对象D:具有相同特性的数据元素的集合。各个数据元素均含有类型相同,可唯一标识数据元素的关键字。数据关系R:数据元素同属一个集合。基本操作P:Create(&ST,n);操作结果:构造一个含n个数据元素的静态查找表ST。Destroy(&ST);初始条件:静态查找表ST存在。 操作结果:销毁表ST。 Search(ST,key);初始条件:静态查找表ST存在,key为和关键字类型相同的给定值。操作结
9、果:若ST中存在其关键字等于key的数据元素,则函数值为该元素的值或在表中位置,否则为“空”。Traverse(ST,visit( );初始条件:静态查找表ST存在,visit是对元素操作的应用函数。操作结果:按某种次序对ST的每个元素调用函数visit()一次且仅一次,一旦visit()失败,则操作失败。 ADT StaticSearchTable静态查找表可以有不同的表示方法,在不同的表示方法中,实现查找操作的方法也不同。 9.1.1 顺序表的查找 以顺序表或线性链表表示静态查找表,则Search函数可用顺序查找来实现。本节中只讨论它在顺序存储结构模块中的实现,在线性链表模块中实现的情况类
10、似。/静态查找表的顺序存储结构typdef structElemType * elem; /数据元素存储空间基址 int length; /建表时按实际长度分配,0号单元留空表长度SSTable;下面讨论顺序查找的实现。 顺序查找(Sequential Search)的查找过程为:从表中最后一个记录开始,逐个进行记录的关键字和给定值的比较,若某个记录的关键字和给定值比较相等,则查找成功,找到所查记录;反之,若直至第一个记录,其关键字和给定值比较都不等,则表明表中没有所查记录,查找不成功。此查找过程可用算法9.1描述之。int Search_Seq(SSTable ST,KeyType key)
11、/在顺序表ST中顺序查找其关键字等于key的数据元素。若找到,则函数值为该元素在表中的位置,否则为0。ST.elem0.key = key; /0号单元作为监视哨for ( i=ST.length; !EQ (ST.elemi.key , key); -i ); /从后往前找return i; /找不到时,i为0 / Search_Seq 算法 9.1分析顺序查找演示过程参见(板书走程序)】。查找操作的性能分析:衡量一个算法好坏的量度有三条:时间复杂度(衡量算法执行的时间量级);空间复杂度(衡量算法的数据结构所占存储以及大量的附加存储);算法的其它性能。对于查找算法来说,通常只需要一个或几个辅
12、助空间。又,查找算法中的基本操作是“将记录的关键字和给定值进行比较”,因此,通常以“其关键字和给定值进行过比较的记录个数的平均值”作为衡量查找算法好坏的依据。 定义:为确定记录在查找表中的位置,需和给定值进行比较的关键字个数的期望值称为查找算法在查找成功时的平均查找长度(Average Search Length)。对于含有n个记录的表,查找成功时的平均查找长度为 (9-1) 其中:Pi为查找表中第i个记录的概率,且; Ci为找到表中其关键字与给定值相等的第i个记录时,和给定值已进行过比较的关键字个数。显然,Ci随查找过程不同而不同。假设n=ST.length,则顺序查找的平均查找长度为 AS
13、L=nPl+(n-1)P2+2Pn-1+Pn (9-2) 假设每个记录的查找概率相等,即Pi=1/n,则在等概率情况下顺序查找的平均查找长度为 有时,表中各个记录的查找概率并不相等。例如:将全校学生的病历档案建立一张表存放在计算机中,则体弱多病同学的病历记录的查找概率必定高于健康同学的病历记录。由于式(92)中的ASL在PnPn-1P2P1时达到极小值。因此,对记录的查找概率不等的查找表若能预先得知每个记录的查找概率,则应先对记录的查找概率进行排序,使表中记录按查找概率由小至大重新排列,以便提高查找效率。然而,在一般情况下,记录的查找概率预先无法测定。为了提高查找效率,我们可以在每个记录中附设
14、一个访问频度域,并使顺序表中的记录始终保持按访问频度非递减有序的次序排列,使得查找概率大的记录在查找过程中不断往后移,以便在以后的逐次查找中减少比较次数。或者在每次查找之后都将刚查找到的记录直接移至表尾。顺序查找和我们后面将要讨论到的其它查找算法相比,其缺点是平均查找长度较大,特别是当n很大时,查找效率较低。然而,它有很大的优点是:算法简单且适应面广。9.1.2 有序表的查找 以有序表表示静态查找表时,Search函数可用折半查找来实现。 折半查找(BinarySearch)的查找过程是:先确定待查记录所在的范围(区间),然后逐步缩小范围直到找到或找不到该记录为止。 例如:已知如下11个数据元
15、素的有序表(关键字即为数据元素的值):现要查找关键字为21和85的数据元素。假设指针low和high分别指示待查元素所在范围的下界和上界,指针mid指示区间的中间位置,即mid=(low+high)2。在此例中,low和high的初值分别为1和11,即1,11为待查范围。 先看给定值key=21的查找过程:ST.elemmid.key与给定值key相比较,因为ST.elemmid.keykey,说明待查元素若存在,必在区间low,mid-1的范围内,则令指针high指向第mid-1个元素,重新求得mid=(1+5)2=3 仍以ST.elemmid.key和key相比,因为ST.elemmid.
16、key上界high,则说明表中没有关键字等于key的元素,查找不成功。折半查找算法如下:int Search_Bin(SSTable ST,KeyType key)/在有序表ST中折半查找其关键字等于key的数据元素。若找到,则函数值为该元素在表中的位置,否则为0。low=1; high=ST.lenqth; /置区间初值while (low50)时,可有下列近似结果 ASL=log2(n+1)-1 (96) 可见,折半查找的效率比顺序查找高,但折半查找只能适用于有序表,且限于顺序存储结构(对线性链表无法进行折半查找)。以有序表表示静态查找表时,进行查找的方法除折半查找之外,还有斐波那契查找和
17、插值查找。9.1.3 静态树表的查找 上一小节对有序表的查找性能的讨论是在“等概率”的前提下进行的,即当有序表中各记录的查找概率相等时,按图9.2所示判定树描述的查找过程来进行折半查找,其性能最优。如果有序表中各记录的查找概率不等,情况又如何呢? 先看一个具体例子。假设有序表中含5个记录,并且已知各记录的查找概率不等,分别为p1=0.1,p2=0.2,p3=0.1,p4=0.4和p5=0.2。则按式(9-1)的定义,对此有序表进行折半查找,查找成功时的平均查找长度为: 5PiCi = 0.1* 2+0.2* 3+0.1*1+0.4* 2+0.2* 3 = 2.3i=1但是,如果在查找时令给定值
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 章至第 已经 介绍 各种 线性 非线性 数据结构

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