数据结构与算法教学课件ppt作者王曙燕chapter8查找.ppt
《数据结构与算法教学课件ppt作者王曙燕chapter8查找.ppt》由会员分享,可在线阅读,更多相关《数据结构与算法教学课件ppt作者王曙燕chapter8查找.ppt(72页珍藏版)》请在冰豆网上搜索。
1,数据结构与算法,8.1概述,第8章查找,8.2基于线性表的查找法,8.3基于树的查找法,8.4散列,8.5算法总结,2,8.1概述,第8章查找,查找表是由同一类型的数据元素(或记录)构成的集合。
由于“集合”中的数据元素之间存在着松散的关系,因此查找表是一种应用灵便的结构。
数据结构与算法,3,第8章查找,对查找表常进行的操作:
1)查询某个“特定的”数据元素是否在查找表中,3)在查找表中插入一个数据元素,2)检索某个“特定的”数据元素的各种属性,4)从查找表中删去某个数据元素,数据结构与算法,8.1概述,4,第8章查找,查找表的分类,仅作查询和检索操作,静态查找表,“不在查找表中”的数据元素插入到查找表中;删除其“查询”结果为“在查找表中”的数据元素。
动态查找表,查找还可分为:
内查找和外查找。
8.1概述,5,第8章查找,关键字:
是数据元素(或记录)中某个数据项的值,用以标识(识别)一个数据元素(或记录)。
主关键字:
可以识别唯一的一个记录的关键字。
次关键字:
可以识别若干记录的关键字。
8.1概述,6,根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(记录)。
查找,若查找表中存在这样一个记录,则称“查找成功”。
查找结果给出整个记录的信息,或指示该记录在查找表中的位置;否则称“查找不成功”。
查找结果给出“空记录”或“空指针”。
第8章查找,8.1概述,7,由于查找表中的数据元素之间不存在明显的组织规律,因此不便于查找。
为了提高查找的效率,需要在查找表中的元素之间人为地附加某种确定的关系,换句话说,用另外一种结构来表示查找表。
如何进行查找?
查找的方法取决于查找表的结构。
第8章查找,8.1概述,8,8.2基于线性表的查找,第8章查找,顺序查找,折半查找,分块查找,9,数据结构,8.2基于线性表的查找,第8章查找,顺序查找,key=64,key=60,结果:
查找成功,返回位置7,结果:
查找不成功,intSeqSearch(RecordListl,KeyTypek)inti;i=l.length;while(i=1,10,8.2基于线性表的查找,第8章查找,顺序查找,key=64,key=60,结果:
查找成功,返回位置7,结果:
查找不成功,64,60,intSeqSearch(RecordListl,KeyTypek)inti;l.r0.key=k;/*标识边界*/i=l.length;while(l.ri.key!
=k)i-;return(i);,技巧:
r0起到监视哨兵的作用,可免去检查表是否查完,且提高算法的执行效率,但并不是真正的待查找记录。
11,8.2基于线性表的查找,第8章查找,顺序查找,分析查找的时间性能:
查找算法的平均查找长度(AverageSearchLength),为确定记录在查找表中的位置,需和给定值进行比较的关键字个数的期望值(查找成功时),12,在等概率查找的情况下,顺序表查找成功的平均查找长度为:
Pi=1/n,对顺序表而言,Ci=n-i+1,ASL=nP1+(n-1)P2+2Pn-1+Pn,8.2基于线性表的查找,第8章查找,若查找概率无法事先测定,则查找过程采取的改进办法是,附设一个访问频度域或者在每次查找之后,将刚刚查找到的记录直接移至表尾的位置上。
顺序查找,13,8.2基于线性表的查找,第8章查找,数据结构,折半查找,顺序查找的查找算法简单,但平均查找长度较大,特别不适用于表长较大的查找表。
若以有序表表示查找表,则查找过程可以基于“折半”进行。
14,8.2基于线性表的查找,第8章查找,折半查找,1.首先确定查找表的中间位置;,2.然后将待查的值与中间位置的值进行比较,若相等,则查找成功并返回此位置,否则须确定新的查找区间,继续二分查找。
基本思想:
15,8.2基于线性表的查找,第8章查找,折半查找,例1:
key=64的查找过程如下:
low=1,low指示查找区间的下界,high=11,mid=(1+11)/2=6,keymid指向的记录值,low=mid+1=7,mid=(7+11)/2=9,keymid指向的记录值,high=mid-1=8,mid=(8+7)/2=7,key=mid所指向的记录值查找成功,举例:
high指示查找区间的上界,mid=(low+high)/2,70,highlow查找不成功,16,8.2基于线性表的查找,第8章查找,折半查找,算法,intBinSrch(RecordListl,KeyTypek)intlow=1,high=l.length,mid;while(low=high)mid=(low+high)/2;if(k=l.rmid.key)returnmid;elseif(kl.rmid.key)high=mid-1;elselow=mid+1;return0;,17,8.2基于线性表的查找,第8章查找,折半查找,先看一个具体的情况,假设:
n=11,判定树,3,4,2,3,4,1,3,4,2,3,4,3,1,4,9,6,7,10,2,8,11,5,找到有序表中任一记录的过程就是走了一条从根结点到与该记录相应的结点的路径,给定值进行比较的关键字个数恰是该结点在判定树上的层次数。
ASLsuccss=(11+22+43+44)/11=33/11ASLunsucc=(44+85)/12=56/12折半查找的判定树是唯一的。
平均查找长度,18,8.2基于线性表的查找,第8章查找,折半查找,平均查找长度,一般情况下,表长为n的折半查找的判定树的深度和含有n个结点的完全二叉树的深度相同。
假设n=2h-1并且查找概率相等,则,=(n+1)/n*log2(n+1)-1,在n50时,可得近似结果log2(n+1)-1,折半查找只适用于有序表,且限于顺序存储结构,19,8.2基于线性表的查找,第8章查找,分块查找,(索引顺序查找),基本思想:
1、把线性表分成若干块,每块包含若干个记录,在每一块中记录的存放是任意的,但块与块之间必须有序。
(分块有序),2、建立一个索引表,把每块中的最大关键字值及每块的第一个记录在表中的位置和最后一个记录在表中的位置存放在索引项中。
20,索引表,8.2基于线性表的查找,第8章查找,分块查找,(索引顺序查找),21,8.2基于线性表的查找,第8章查找,分块查找,(索引顺序查找),索引顺序表的查找过程:
1)由索引确定记录所在区间(块);,2)在某个区间(块)内进行顺序查找。
注意:
索引可以根据查找表的特点来构造。
可见,分块查找的过程也是一个“缩小区间”的查找过程。
分块查找的平均比较次数=查找“索引”的平均比较次数+查找“块内”的平均比较次数,22,第8章查找,8.2基于线性表的查找,线性表的三种查找方法比较,因此,对于不同的表长n、不同的表结构和表存储结构,应采用不同的查找方法。
23,第8章查找,8.3基于树的查找,二叉排序树,二叉平衡树,B-树,B+树,键树,24,第8章查找,8.3基于树的查找,二叉排序树,定义:
二叉排序树或者是一棵空树;或者是具有如下特性的二叉树:
1.若它的左子树不空,则左子树上所有结点的值均小于根结点的值;,3.它的左、右子树也都分别是二叉排序树。
2.若它的右子树不空,则右子树上所有结点的值均大于根结点的值;,25,第8章查找,8.3基于树的查找,例如:
是二叉排序树。
66,不,二叉排序树,26,第8章查找,8.3基于树的查找,二叉排序树,查找算法,若给定值等于根结点的关键字,则查找成功;若给定值小于根结点的关键字,则继续在左子树上进行查找;若给定值大于根结点的关键字,则继续在右子树上进行查找。
否则,,若二叉排序树为空,则查找不成功;,在二叉排序树上进行查找,类似折半查找,27,第8章查找,8.3基于树的查找,例如:
二叉排序树,查找关键字,=50,35,90,95,30,80,20,90,85,40,35,88,32,50,50,30,40,35,50,80,90,二叉排序树,查找算法,失败,28,第8章查找,8.3基于树的查找,从上述查找过程可见,在查找过程中,生成了一条查找路径:
从根结点出发,沿着左分支或右分支逐层向下直至关键字等于给定值的结点;,从根结点出发,沿着左分支或右分支逐层向下直至指针指向空树为止。
查找成功,查找不成功,二叉排序树,查找算法,29,BSTreeSearchBST(BSTreebst,KeyTypekey)if(!
bst)returnNULL;elseif(bst-key=key)returnbst;elseif(keykey)returnSearchBST(bst-lchild,key);elsereturnSearchBST(bst-rchild,key);,第8章查找,8.3基于树的查找,二叉排序树,查找算法,-递归,30,二叉排序树,查找算法,-非递归,第8章查找,8.3基于树的查找,BSTreeSearchBST(BSTreebst,KeyTypekey)BSTreeq;q=bst;while(q)if(q-key=k)returnq;if(keydata.key)q=q-lchild;elseq=q-rchild;returnNULL;,31,二叉排序树,插入算法,第8章查找,8.3基于树的查找,根据动态查找表的定义,“插入”操作在查找不成功时才进行;,若二叉排序树为空树,则新插入的结点为新的根结点;否则,新插入的结点必为一个新的叶子结点,其插入位置由查找过程得到。
32,48,二叉排序树,插入算法,第8章查找,8.3基于树的查找,设key=30,30,48,33,二叉排序树,插入算法,第8章查找,8.3基于树的查找,voidInsertBST(BSTree*bst,KeyTypekey)BiTrees;if(*bst=NULL)s=(BSTree)malloc(sizeof(BSTNode);s-key=key;s-lchild=NULL;s-rchild=NULL;*bst=s;elseif(keykey)InsertBST(,34,二叉排序树,生成算法,第8章查找,8.3基于树的查找,例如:
设关键字输入顺序为:
45,24,53,12,28,90,28,12,53,24,45,90,24,45,53,90,12,28,28,90,45,12,24,53,所以,二叉排序树的形态完全由一个输入序列决定,一个无序序列可以通过构造一棵二叉排序树而得到一个有序序列。
35,voidCreateBST(BSTree*bst)KeyTypekey;*bst=NULL;scanf(%d,二叉排序树,生成算法,第8章查找,8.3基于树的查找,36,二叉排序树特点:
1.中序遍历二叉排序树可得到关键字有序序列。
2.在构造二叉排序树时,每次插入的新结点都是新的叶子结点,则进行插入时,不必移动其它结点。
3.二叉排序树不但拥有类似于折半查找的特性,又采用了链表作存储结构,因此是动态查找表的一种适宜表示。
中序遍历:
10,20,23,25,30,35,40,48,第8章查找,8.3基于树的查找,37,二叉排序树,删除算法,第8章查找,8.3基于树的查找,和插入相反,删除在查找成功之后进行,并且要求在删除二叉排序树上某个结点之后,仍然保持二叉排序树的特性。
可分三种情况讨论:
(1)被删除的结点是叶子;,
(2)被删除的结点只有左子树或者只有右子树;,(3)被删除的结点既有