数据结构(C描述)电子教案第8章.ppt
《数据结构(C描述)电子教案第8章.ppt》由会员分享,可在线阅读,更多相关《数据结构(C描述)电子教案第8章.ppt(67页珍藏版)》请在三一办公上搜索。
1、第8章 查找,数据结构(C+描述),目录,84 散列查找,83 树表查找,8.1 查找的基本概念,82 线性表的查找,退出,8.1 查找的基本概念,查找,也称为检索。在我们日常生活中,随处可见查找的实例。如查找某人的地址、电话号码;查某单位45岁以上职工等,都属于查找范畴。本书中,我们规定查找是按关键字进行的,所谓关键字(key)是数据元素(或记录)中某个数据项的值,用它可以标识(或识别)一个数据元素。例如,描述一个考生的信息,可以包含:考号、姓名、性别、年龄、家庭住址、电话号码、成绩等关键字。但有些关键字不能唯一标识一个数据元素,而有的关键字可以唯一标识一个数据元素。如刚才的考生信息中,姓名
2、不能唯一标识一个数据元素(因有同名同姓的人),而考号可以唯一标识一个数据元素(每个考生考号是唯一的,不能相同)。我们将能唯一标识一个数据元素的关键字称为主关键字,而其它关键字称为辅助关键字或从关键字。,有了主关键字及关键字后,我们可以给查找下一个完整的定义。所谓查找,就是根据给定的值,在一个表中查找出其关键字等于给定值的数据元素,若表中有这样的元素,则称查找是成功的,此时查找的信息为给定整个数据元素的输出或指出该元素在表中的位置;若表中不存在这样的记录,则称查找是不成功的,或称查找失败,并可给出相应的提示。,因为查找是对已存入计算机中的数据所进行的操作,所以采用何种查找方法,首先取决于使用哪种
3、数据结构来表示“表”,即表中结点是按何种方式组织的。为了提高查找速度,我们经常使用某些特殊的数据结构来组织表。因此在研究各种查找算法时,我们首先必须弄清这些算法所要求的数据结构,特别是存储结构。查找有内查找和外查找之分。若整个查找过程全部在内存进行,则称这样的查找为内查找;反之,若在查找过程中还需要访问外存,则称之为外查找。我们仅介绍内查找。,要衡量一种查找算法的优劣,主要是看要找的值与关键字的比较次数,但我们将找到给定值与关键字的比较次数的平均值来作为衡量一个查找算法好坏的标准,对于一个含有n个元素的表,查找成功时的平均查找长度可表示为ASL=,其中i为查找第i个元素的概率,且=1。一般情形
4、下我们认为查找每个元素的概率相等,i为查找第i个元素所用到的比较次数。要衡量一种查找算法的优劣,主要是看要找的值与关键字的比较次数,但我们将找到给定值与关键字的比较次数的平均值来作为衡量一个查找算法好坏的标准,对于一个含有n个元素的表,查找成功时的平均查找长度可表示为ASL=,其中i为查找第i个元素的概率,且=1。一般情形下我们认为查找每个元素的概率相等,i为查找第i个元素所用到的比较次数。,82 线性表的查找,8.2.1 顺序查找1顺序查找的基本思想,顺序查找是一种最简单的查找方法,它的基本思想是:从表的一端开始,顺序扫描线性表,依次将扫描到的结点关键字和待找的值相比较,若相等,则查找成功,
5、若整个表扫描完毕,仍末找到关键字等于的元素,则查找失败。顺序查找既适用于顺序表,也适用于链表。若用顺序表,查找可从前往后扫描,也可从后往前扫描,但若采用单链表,则只能从前往后扫描。另外,顺序查找的表中元素可以是无序的。,下面以顺序表的形式来描述算法。,2顺序查找算法实现,const int n=maxn/n为表的最大长度struct nodeelemtype key;/key为关键字,类型设定为elemtype;int seqsearch(node Rn+1,elemtype k)/在表中查找关键字值为的元素R0.key=k;int i=n;/从表尾开始向前扫描while(Ri.key!=k)
6、i-;return i;,在函数seqsearch中,若返回的值为表示查找不成功,否则查找成功。函数中查找的范围从n到,为监视哨,起两个作用,其一,是为了省去判定 while循环中下标越界的条件i1,从而节省比较时间,其二,保存要找值的副本,若查找时,遇到它,表示查找不成功。若算法中不设立监视哨R0,程序花费的时间将会增加,这时的算法可写为下面形式。,int seqsearch(node Rn+1,elemtype k)int i=n;while(Ri.key!=k),当然上面算法也可以改成从表头向后扫描,将监视哨设在右边,这种方法请读者自己完成。,3.顺序查找性能分析,假设在每个位置查找的概
7、率相等,即有pi=1/n,由于查找是从后往前扫描,则有每个位置的查找比较次数Cn=1,Cn-1=2,C1=n,于是,查找成功的平均查找ASL=,即它 的时间复杂度为O(n)。这就是说,查找成功的平均比较次数约为表长的一半。若k值不在表中,则必须进行n+1次比较之后才能确定查找失败。另处,从ASL可知,当n较大时,ASL值较大,查找的效率较低。,顺序查找的优点是算法简单,对表结构无任何要求,无论是用向量还是用链表来存放结点,也无论结点之间是否按关键字有序或无序,它都同样适用。顺序查找的缺点是查找效率低,当n较大时,不宜采用顺序查找,而必须寻求更好的查找方法。,8.2.2二分查找1.二分查找的基本
8、思想,二分查找,也称折半查找,它是一种高效率的查找方法。但二分查找有条件限制:要求表必须用向量作存贮结构,且表中元素必须按关键字有序(升序或降序均可)。我们不妨假设表中元素为升序排列。二分查找的基本思想是:首先将待查值K与有序表R1到Rn的中点mid上的关键字Rmid.key进行比较,若相等,则查找成功;否则,若Rmid.keyk,则在R1到Rmid-1中继续查找,若有Rmid.keyk,则在Rmid+1到Rn中继续查找。每通过一次关键字的比较,区间的长度就缩小一半,区间的个数就增加一倍,如此不断进行下去,直到找到关键字为K的元素;若当前的查找区间为空(表示查找失败)。,从上述查找思想可知,每
9、进行一次关键字比较,区间数目增加一倍,故称为二分(区间一分为二),而区间长度缩小一半,故也称为折半(查找的范围缩小一半)。,2二分查找算法实现,int binsearch(node Rn+1,elemtype k)int low=1,high=n;while(lowk)high=mid-1;/在左子区间中查找else low=mid+1;/在右子区间中查找return 0;/查找失败,例如,假设给定有序表中关键字为8,17,25,44,68,77,98,100,115,125,将查找K=17和K=120的情况描述为图8-1及图8-2形式。,3.二分查找的性能分析,为了分析二分查找的性能,可以用
10、二叉树来描述二分查找过程。把当前查找区间的中点作为根结点,左子区间和右子区间分别作为根的左子树和右子树,左子区间和右子区间再按类似的方法,由此得到的二叉树称为二分查找的判定树。例如,图8-1给定的关键字序列8,17,25,44,68,77,98,100,115,125,的判定树见图8-3。,从图8-3 可知,查找根结点68,需一次查找,查找17和100,各需二次查找,查找8、25、77、115各需三次查找,查找44、98、125各需四次查找。于是,可以得到结论:二叉树第K层结点的查找次数各为k次(根结点为第1层),而第k层结点数最多为2k-1个。假设该二叉树的深度为h,则二分查找的成功的平均查
11、找长度为(假设每个结点的查找概率相等):,ASL=1/n 1/n(1+22+322+h2h-1),因此,在最坏情形下,上面的不等号将会成立,并根据二叉树的性质,最大的结点数n=2h-1,h=log2(n+1),于是可以得到平均查找长度ASL=(n+1)/n log2(n+1)-1。该公式可以按如下方法推出:,设s=20+2.21+3.22+(h-1).2h-2+h.2h-1则2s=21+2.22+(h-2).2h-2+h-1).2h-1+h.2hs=2s-s=h.2h-(20+21+22+2h-2+2h-1)=h.2h-(2h-1)=log2(n+1).(n+1)-n,所以,ASL=s/n=(
12、n+1)/n log2(n+1)-1。,当n很大时,ASL log2(n+1)-1 可以作为二分查找成功时的平均查找长度,它的时间复杂度为O(log2n)。,8.2.3 索引查找1.索引查找的思想,索引查找,又称分级查找,它既是一种查找方法,又是一种存贮方法,称为索引存贮。它在我们的日常生活中有着广泛的应用。例如,在汉语字典中查找某个汉字时,若知道某个汉字读者,则可以先在音节表中查找到对应正文中的页码,然后再在正文中所对应的页中查出待查的汉字;若知道该汉字的字形,但不知道读者,则可以先在部首表中根据字的部首查找到对应检字表中的页码,再在检字表中根据字的笔画找到该汉字所在的页码。在这里,整个字典
13、就是索引查找的对象,字典的正文是字典的主要部分,被称之为主表,而检字表,部首表和音节表都有是为了方便查找主表而建立的索引,所以被称之为索引表。,在索引查找中,主表只有一个,其中包含的是待查找的内容,而索引表可以有多个,包含一级索引,二级索引,所需的级数可根据具体问题而定。如刚才的利用读音查找汉字为一级索引,而 利用字形查找汉字为二级索引(部首表检字表汉字)。在此,我们仅讨论一级索引。,索引查找是在线性表(主表)的索引存贮结构上进行的,而索引存贮的基本思想是:首先将一个线性表(主表)按照一定的规则分成若干个逻辑上的子表,并为每个子表分别建立一个索引项,由所有这些索引项得到主表的一个索引表,然后,
14、可采用顺序或链接的方法来存储索引表和各个子表。索引表中的每个索引项通常包含三个域:一是索引值域,用来存储标识对应子表的索引值,它相当于记录的关键字,在索引表中由此索引值来唯一标识一个索引项(子表);二是子表的开始位置,用来存储对应子表的第一个元素的存储位置;三是子表的长度,用来存储对应子表的元素个数。,例如,设有一个学校部分教师档案表如表8-1所示,设编号为主关键字,则该表可以用一个线性表L=(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)来表示,其中ai(1in)表示第i位教师的信息(包含有编号,姓名,部门,职称),而它的索引表可以按部门进行,也可以按职称进行,按部门的索引表
15、中有4个子表,分别为:计算机系J=(a1,a2,a3,a4)电工系 D=(a5,a6,a7)管理系G=(a8,a9)成教部C=(a10),该4个子表示成一个索引表如表8-2所示。,表8-1 教师档案表,表8-2 按部门的索引表,index start length,若按职称进行索引,则得到的索引表中也有4个子表,分别为:Jiaosou=(a1,a8)FuJiaosou=(a3,a7,a10)Jiangshi=(a2,a5,a9)Zhujiao=(a4,a6),这时的主表用顺序存贮不太方便,因相同职称的教师没有连在一起,故用链式存储得到主表较方便。具体的存贮如图8-4所示。在图8-4中,箭头上面
16、的数字表示该元素在主表中的下标位置(指针),每个子表中最后个元素的指针为-1,表示为空指针。,于是,可以得到如表8-3所示的职称索引表。,表8-3 按职称的索引表 index start length,从刚才的两种索引表中,可以给出索引查找的基本思想如下:第一步,在索引表中按index域查找所给值K1,这时可得到子表起始位置start 和长度length,若找不到K1,结束查找,表示查找不成功。第二步,在主表的start位置开始,长度为length的范围内查找所给值K2,若找到,查找不成功,否则,查找不成功。,例如,对于按部门的索引查找,主表可以用顺序存贮,假设K1=“D”,“D”代电工系,K
17、2=“孙六”,则先在表8-2的索引表中找到的index域为“D”的项,得到start=4,length=3,然后从主表的第4个位置开始(即a5)找姓名为“孙六”的人,则在主表的第5个位置可以找到,故查找成功。若假设K1=“D”,K2=“杨九”,则索引表的查找与上面相同,然后在主表的第4个位置开始查找,没找到,进入第5个位置查找,还没找到进入第6位置查找,仍然没找到,但查找的length=3,既只允许3次查找,故查找不成功。若假设K1=“F”,K2=“张三”,则首先在索引表中就找不到“F”,故无需进入主表进行查找,查找不成功。,3.索引查找的性能分析,由于索引查找中涉及到两方面查找,第一个是索引
18、表的查找,第二个是主表的查找,假设两种查找都按顺序查找方式进行,则索引表的平均查找长度为(m+1)/2,主表中的平均查找长度为(s+1)/2,(m为索引表的长度,S为主表中相应子表的长度),则索引查找的平均查找长度为:ASL=(m+1)/2+(s+1)/2。若假定每个子表具有相同的长度,而主表的长度为n,则有n=m.s,这时当s=时,索引查找具有最小的平均查找长度,即ASL=1+。从该公式可以看出,索引查找的 性能优先顺序查找,但比二分查找要差,时间复杂度介于O(log2 n)O(n)之间。,8.2.4分块查找 1.分块查找 的思想,分块查找实际上就是一种索引查找,但查找的性能更优先于索引查找
19、。原因是分块查找的索引表是一个有序表,故可以用二分查找 来代替 顺序查找 实现索引 表的快速查找。具体实现如下:将一个含有n个元素的主表分成m个子表,但要求子表之间元素是按关键字有序排列的,而子表中元素可以无序的,然后建立索引表,索引表中索引域的值用每个子表最大关键字代替,则可以按索引查找思想找到表中元素。,例如,给定关键字序列如下:18,7,26,34,15,42,36,70,60,55,83,90,78,72,74,假设m=3,s=5,即将该序序分成3个子表,每个子表有5 个元素,则得到的主表和索引表如图8-5所 示。,3.分块查找的性能分析,分块查找实际上就是索引查找,但分块查找中索引的
20、域的类型与主表的关键字域的类型相同,且索引表按索引域递增(或递减)有序,故它的平均查找长度与索引查找接近,且优于索引查找。,83 树表查找,8.3.1二叉排序树查找1什么是二叉排序树,二叉排序树(Binary Sorting Tree),它或者是一棵空树,或者是一棵具有如下特征的非空二叉树:(1)若它的左子树非空,则左子树上所有结点的关键字均小于根结点的关键字;(2)若它的右子树非空,则右子树上所有结点的关键字均大于等于根结点的关键字;(3)左、右子树本身又都是一棵二叉排序树。,2二叉排序树的数据类型描述,和第六章类似,可以用一个二叉链表来描述一棵二叉排序树,具体为:struct Btreen
21、ode elemtype data;/代表关键字 Btreenode*left,*right;/代表左、右孩子;,3二叉排序树的基本运算,(1)二叉排序树的插入 若二叉排序树为空,则作为根结点插入,否则,若待插入的值小于根结点值,则作为左子树插入,否则作为右子树插入,算法描述为:,void Insert(Btreenode*BST,elemtype X)if(BST=NULL)Btreenode*p=new Btreenode;p-data=X;p-left=p-right=NULL;BST=p;else if(BST-data=X)Insert(BST-left,X);/在左子树中扦入els
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 描述 电子 教案
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-6578824.html