第八章 查找
数据结构课件第八章查找优秀课件
low
mid
high
1 2 3 4 5 6 7 8 9 10 11
5 13 19 21 37 56 64 75 80 88 92
low mid high 1 2 3 4 5 6 7 8 9 10 11 5 13 19 21 37 56 64 75 80 88 92
查找第i个元素: n+1-i
查找失败:
n+1
iii 比较次数=5
顺序查找方法的ASL
n
对含 n个 有记录的 AS表 L , pici i1
设表中每个元 概素 率的 相 pi查 等 1n找
n
则AS L
i1
pici
1 n i ni1
1n(n1) n2
n1 2
7.2.2 折半查找
1. 折半查找的基本思想 折半查找要求查找表用顺序存储结构存放且各数 据元素按关键字有序(升序或降序)排列,也就是说 折半查找只适用于对有序顺序表进行查找。
查找——也叫检索,是根据给定的某个值,在表中确定一 个关键字等于给定值的记录或数据元素
关键字——是数据元素中某个数据项的值,它可以标识一 个数据元素
查找方法评价
查找速度
占用存储空间多少
算法本身复杂程度
平均查找长度ASL(Average Search Length):为确定记 录在表中的位置,需和给定值进行比较的关键字的个 数的期望值叫查找算法的~
7.2 静态查找
正如本章第一节所述:静态查找是指在静态查找 表上进行的查找操作,在查找表中查找满足条件的数 据元素的存储位置或各种属性。本节将讨论以线性结 构表示的静态查找表及相应的查找算法。
7.2.1 顺序查找
1. 顺序查找的基本思想
第8章 查找
•
• 查找的分类
1. 按查找条件分为按记录的主关键字查找和多 关键字组合查找
2. 按查找数据在外存或者内存分为外部查找和 内部查找 3. 按目的分为静态查找和动态查找。
4. 静态查找就是在查找表中查找满足条件的记 录是否存在。 5. 动态查找是确定待查记录查找的位置,进而 进行插入或删除操作。
8.2 静态查找
8.1 查找的基本概念
• 查找表:在计算机中,被查找的数据对象是 由同一类型的数据元素(或记录)构成的集 合,可称之为查找表。
• 关键字:在实际应用问题中,每个记录一般 包含有多个数据域,查找是根据其中某一个 或几个指定的域进行的,这个作为查找依据 的域称为关键字。
• 主关键字与次关键字:在所有关键字中,我 们将能唯一标识一个数据元素的关键字称为 主关键字;而其它关键字称为辅助关键字或 次关键字。 • 查找:又称检索,它是根据给定的关键字值 ,在查找表中找出其关键字等于给定值的数 据元素。若有这样一个记录,则查找成功, 查找结果可输出该记录内容或给出该记录在 文件中的位置;若不存在这样的记录,返回 特定的值,查找不成功。
• 8.2.1 顺序表上的顺序查找 • 8.2.2折半查找 • 8.2.3 分块查找
8.2.1 顺序表上的顺序查找
顺序查找的基本思想
从顺序表的一端开始,依次将每个元素的关键 字同给定值K进行比较。若某个关键字值为K, 则查找成功,返回元素所在下标i;若所有元素 都比较完,仍找不到,则查找失败,返回0。
顺序查找算法-结点定义(适用于顺序查 找和折半查找)
#define MAXSIZE 100 typedef struct { int key; // 关键字项 } Sselement; typedef struct { SSELEMENT r[MAXSIZE]; int len; // 顺序表长度 } SSTable; // 顺序表类型
第8章_查找
{
int low,mid,high;
low=0;
/*确定起始区间低下界位置*/
high=n-1;
/*确定起始区间高下界位置*/
while(low<=high)
{
mid=(low+high)/2;
/*求区间范围的中间位置*/
if(a[mid].key==k) return mid;
/*比较中间位置上的关键字与给定值*/ /*查找成功,返回查找到的记录的下标*/
精选2021版课件
6
8.2.2 折半查找
一、折半查找 又称为二分查找。使用该查找算法的前提条件是:查找表
中记录顺序存储且相应的关键字值有序。
例8-1 设顺序表中有8个记录,它们的关键字依次为{8,11,18,28, 45,55,63,80},用折半查找的方法在该顺序表中查找关键字为55 和20的记录。查找关键字为55的记录的过程见图:
8.2.3 分块查找
一、分块查找
分块查找(又称为索引顺序查找),是顺序查找的一种改进方法。
在分块查找时,把表内的记录按某种属性分成n(n>1)个块(子表),且 块间有序,块内无序。然后建立一个相应的“索引表”,索引表由若 干个索引记录组成,每个索引记录对应一个块。索引记录包含两个数 据项,即对应块内最大关键字值和块中第一个记录位置的地址指针。
个关键字能确定多个记录,称该关键字为次关键字。 查找(Searching):给定一个确定的值,在查找表中确定
一个记录,其相应的关键字等于给定值的操作。
精选2021版课件
2
根据对查找表进行的不同操作,把查找表分为静态 查找表和动态查找表两种。
• 静态查找表是指只查询给定的记录是否存在于查找 表中或检索某个特定记录的有关属性。
数据结构-查找分析
第八章查找一、填空题1.线性有序表(a1,a2,a3,…,a256)是从小到大排列的,对一个给定的值k,用二分法检索表中与k相等的元素,在查找不成功的情况下,最多需要检索次。
设有100个结点,用二分法查找时,最大比较次数是。
2.折半查找有序表(4,6,12,20,28,38,50,70,88,100),若查找表中元素20,它将依次与表中元素比较大小。
3. 在各种查找方法中,平均查找长度与结点个数n无关的查找方法是。
4、对线性表进行二分查找时,要求线性表必须以方式存储,且结点按关键字排列。
5.顺序查找n个元素的顺序表,若查找成功,则比较关键字的次数最多为_ __次;当使用监视哨时,若查找失败,则比较关键字的次数为__ 。
6.在有序表A[1..12]中,采用二分查找算法查等于A[12]的元素,所比较的元素下标依次为____ _____。
7. 在有序表A[1..20]中,按二分查找方法进行查找,查找长度为5的元素个数是_8. 已知二叉排序树的左右子树均不为空,则_______上所有结点的值均小于它的根结点值,________上所有结点的值均大于它的根结点的值。
9、中序遍历二叉排序树得到的序列是序列(填有序或无序)。
10、从有序表(10,16,25,40,61,28,80,93)中依次二分查找40和61元素时,其查找长度分别为和。
二、单项选择题()1.在表长为n的链表中进行顺序查找,它的平均查找长度为A. ASL=n; B. ASL=(n+1)/2;C. ASL=n+1; D. ASL≈log2(n+1)-1()2.折半查找有序表(4,6,10,12,20,30,50,70,88,100)。
若查找表中元素58,则它将依次与表中比较大小,查找结果是失败。
A.20,70,30,50 B.30,88,70,50C.20,50 D.30,88,50()3.对22个记录的有序表作折半查找,当查找失败时,至少需要比较次关键字。
数据结构之查找课件PPT课件
索引表的定义
struct indexterm {
keytype key; int low, high; }; typedef struct indexterm index[MAXITEM]; 这里的keytype可以是任何相应的数据类型, 如int、float、或char等,在算法中,我们规 定keytype缺省是int类型。
int blksearch (sqlist r, index idx, int k, bn)
{
/*bn为块的个数*/
int i, j, mid, low=1, high=bn, find=0;
while (low<=high && !find)
{
➢ 顺序查找的优点是算法简单、适应面广,且 不要求表中数据有序。缺点是平均查找长度 较大,特别是当n较大时,查找效率较低, 不宜采用。
2.折半查找
➢ 折半查找又称二分查找(Birary search)。 ➢ 假设记录在查找表R[1…n]中按关键字排列有
序。首先用k与查找表中间元素的关键字比 较,。。。。。。
➢ 在实际应用问题中,每个记录一般包含 有多个数据域,查找是根据其中某一个 指定的域进行的,这个作为查找依据的 域称为关键字(key)。
➢ 顺序查找的线性表定义如下:
Typedef struct rectype {
keytype key; itemtype item1 …… }rectype;
➢ 比较结果有三种可能:
⑴ 如果r[m].key>k,说明如果存在欲查找的元素, 该元素一定在数组的前半部分,查找范围缩小了 一半,修改查找范围的的上界high=m-1,继续对 数组的前半部分进行二分查找;
第八章查找——精选推荐
查找一.选择题1.若查找每个元素的概率相等,则在长度为n 的顺序表上查找到表中任一元素的平均查找长度为_____________。
A. nB. n+1C. (n-1)/2D. (n+1)/2分析:本题主要考查顺序表的平均查长度的计算,在等概率下,ASLsucc=nP1+(n-1)P2+……+2Pn-1 +Pn=[n+(n-1)+ ……+1]/n = (n+1)/2,其中:Pi 为查找第i 个元素的概率。
所以答案为D。
2.折半查找的时间复杂度_____________。
A.O(n*n)B.O(n)C. O(nlog2n)D. O(log2n)分析:本题考查折半查找的基本思想和对应的判定树。
因为对n 个结点的线性表进行折半查找,对应的判定树的深度是 log2n +1,折半查找的过程就是走了一条从判定树的根到末端结点的路径,所以答案为D。
3.采用分块查找时,数据的组织方式为_____________。
A. 把数据分成若干块,每块内数据有序B. 把数据分成若干块,块内数据不必有序,但块间必须有序,每块内最大(或最小)的数据组成索引表C. 把数据分成若干块,每块内数据有序,每块内最大(或最小)的数据组成索引表D. 把数据分成若干块,每块(除最后一块外)中的数据个数相等分析:本题主要考查分块查找的数据组织方式特点。
在分块查找时,要求块间有序,块内或者有序或者无序。
这样,在查找记录所在的块时,可以采用折半查找。
所以答案为B。
4.二叉排序树的查找效率与二叉排序树的(1)有关,当(2)时,查找效率最低,其查找长度为n。
(1) A.高度B.结点的个数C.形状D.结点的位置(2) A.结点太多B.完全二叉树C.呈单叉树D.结点的结构太复杂分析:本题主要考查二叉排序树的查找效率与二叉排序树形存在一定的关系。
当二叉排序树的前 log2n 层是满二叉树时,其查找效率最高,其查找长度最大为 log2n +1;当二叉排序树呈单叉树时,其查找效率最低,其查找长度最大为n,此时相当于顺序查找。
数据结构第8章 查找 答案
第8章 查找 测试题 及答案一、填空题1. 在数据的存放无规律而言的线性表中进行检索的最佳方法是 顺序查找(线性查找) 。
2. 线性有序表(a 1,a 2,a 3,…,a 256)是从小到大排列的,对一个给定的值k ,用二分法检索表中与k 相等的元素,在查找不成功的情况下,最多需要检索 8 次。
设有100个结点,用二分法查找时,最大比较次数是 7 。
3. 假设在有序线性表a[20]上进行折半查找,则比较一次查找成功的结点数为1;比较两次查找成功的结点数为 2 ;比较四次查找成功的结点数为 8 ;平均查找长度为 3.7 。
解:显然,平均查找长度=O (log 2n )<5次(25)。
但具体是多少次,则不应当按照公式)1(log 12++=n nn ASL 来计算(即(21×log 221)/20=4.6次并不正确!)。
因为这是在假设n =2m -1的情况下推导出来的公式。
应当用穷举法罗列:全部元素的查找次数为=(1+2×2+4×3+8×4+5×5)=74; ASL =74/20=3.7 !!!4.【计研题2000】折半查找有序表(4,6,12,20,28,38,50,70,88,100),若查找表中元素20,它将依次与表中元素 28,6,12,20 比较大小。
5. 在各种查找方法中,平均查找长度与结点个数n 无关的查找方法是 散列查找 。
6. 散列法存储的基本思想是由 关键字的值 决定数据的存储地址。
7. 有一个表长为m 的散列表,初始状态为空,现将n (n<m )个不同的关键码插入到散列表中,解决冲突的方法是用线性探测法。
如果这n 个关键码的散列地址都相同,则探测的总次数是 n(n-1)/2=( 1+2+…+n-1) 。
(而任一元素查找次数 ≤n-1)二、单项选择题( B )1.在表长为n的链表中进行线性查找,它的平均查找长度为A. ASL=n; B. ASL=(n+1)/2;C. ASL=n +1; D. ASL≈log2(n+1)-1( A )2.折半查找有序表(4,6,10,12,20,30,50,70,88,100)。
第八章 查找
B.折半查找方法适用于按值有序的顺序表的查找
C.折半查找方法适用于按关键字值大小有序排列的顺序文件的查找
D.折半查找方法适用于排序连续顺序文件的查找
(5)在有序表(k1,k2,...,k9,)中采用折半查找方法查找99次,其中,至少有一个元素被比较了99次,该元素是--。
A.参加比较的关键字值的多少
B.被查找的关键字值在关键字序列中的位置
C.关键字序列中是否存在被查找关键字值
D.关键字值的平均比较次数的多少
(2)顺序查找方法的优点之一是- 。 ·
A.对于被查找对象几乎没有限制 B.适合排序连续顺序文件的查找
(1)按该线性表中元素的顺序构造出一棵二叉排序树;
(2)若每个元素的查找概率均等,查找此二叉排序树中任意一个结点的平均查找长度ASL是多少?
(3)若对线性表的元素按字典顺序从小到大排列以后,再用折半查找方法,则查找其中任意一个元素的平均查找长度ASL是多少?
(4)画出相应的平衡二叉树。
A.K99 B.k50 C.K49 D.k1
(6)为了实现分块查找,线性表必须采用--结构。
A.顺序存储 B.链式存储
C.索引存储 D.散列存储
(7)只能在顺序存储结构上才能实现的查找方法是 法。
A.顺序查找 B.树型查找
(11)索引文件包括--和--两个部分。
(12)索引表的特点是--,并且--。
(13)在索引文件中查找一个记录的过程是先查--,然后--。
(14)具有144项的表分成--块最好,若每块的最佳长度为8,则平均查找长度为--
(15)在3阶B-树上,每个分支结点包含的子树的数目最多为--,最少为--。
第8章 查找
72
85
88
90
11
[ 35 ↑ ↑ low mid [ 35 ↑ low
64
72
85
88
90
98
5
11
23 ] ↑ high
64
72
85
88
90
98
(b) 查找K=30的过程(三次关键字比较后查找失败)
6 3 9
1
4
7
10
•不成功:从根到叶子或度1结点
2
5
8
11
二、算法实现
(略)
三、性能分析
•最坏:不超过树高, log2(n + 1) •平均:ASL≈(n+1)/n*log2(n+1)-1 ≈log2(n+1)-1=O(log2n) 。
第8章 查找
8.1 8.2 8.3 8.4 基本概念 静态查找表 树表的查找 散列表
查找就是在数据集合中寻找满足某种条件的数据对象。
知识点结构
查找的基本概念 查找结构 查找算法的时间性能
静态表的查找技术 顺序查找 二分查找
树表的查找技术 二叉排序树
散列表的查找技术 散列的基本思想
插值查找
斐波那契查找
6 3 9
1
4
7
10
2
5
8
11
例
10个结点的有序表,用二分查找,成功和不成功的ASL=?
首先,建立判定树:mid=(low+high)/2
5 2 1 3 4 6 7 8 9 10
查找成功时:ASL=(1×1+2×2+3×4+4×3)/10 不成功时:ASL=(3×5+4×6)/11
数据结构练习第八章-查找
数据结构练习第八章查找1.若有18个元素的有序表存放在一维数组A[19]中,第一个元素放A[1]中,现进行二分查找,则查找A[3]的比较序列的下标依次为< >A. 1,2,3B. 9,5,2,3C. 9,5,3D. 9,4,2,32.设二叉排序树中有n个结点,则在二叉排序树的平均平均查找长度为〔〕.A.O<1>B. O<log2n>C.O<n>D.O<n2>3.在二叉排序树中插入一个结点的时间复杂度为〔〕.A.O<1>B.O<n>C. O<log2n> D.O<n2>4.设有序顺序表中有n个数据元素,则利用二分查找法查找数据元素X的最多比较次数不超过〔〕.A. log2n+1B. log2n-1C. log2n D. log2<n+1>5.设有序表中有1000个元素,则用二分查找查找元素X最多需要比较〔〕次.A. 25B.10C. 7D. 16.顺序查找不论在顺序线性表中还是在链式线性表中的时间复杂度为〔〕.A. O<n>B. O<n2>C. O<n1/2>D. O<1og2n>7.设二叉排序树上有n个结点,则在二叉排序树上查找结点的平均时间复杂度为〔〕.A. O<n>B. O<n2>C. O<nlog2n> D. O<1og2n>8.〔〕二叉排序树可以得到一个从小到大的有序序列.A. 先序遍历B.中序遍历C. 后序遍历D. 层次遍历9.设一组初始记录关键字序列为<13,18,24,35,47,50,62,83,90,115,134>,则利用二分法查找关键字90需要比较的关键字个数为〔〕.A. 1B.2C. 3D. 410.设某散列表的长度为100,散列函数H<k>=k % P,则P通常情况下最好选择〔〕.A.99B.97C. 91D. 9311.在二叉排序树中插入一个关键字值的平均时间复杂度为〔〕.A. O<n>B. O<1og2n>C. O<nlog2n>D. O<n2>12.设一个顺序有序表A[1:14]中有14个元素,则采用二分法查找元素A[4]的过程中比较元素的顺序为< >.A. A[1],A[2],A[3],A[4]B.A[1],A[14],A[7],A[4]C.A[7],A[3],A[5],A[4]D. A[7],A[5] ,A[3],A[4]13.设散列表中有m个存储单元,散列函数H<key>= key%p,则p最好选择〔〕.A. 小于等于m的最大奇数B.小于等于m的最大素数C. 小于等于m的最大偶数D. 小于等于m的最大合数14.设顺序表的长度为n,则顺序查找的平均比较次数为〔〕.A. nB. n/2C. <n+1>/2D. <n-1>/215.设有序表中的元素为<13,18,24,35,47,50,62>,则在其中利用二分法查找值为24的元素需要经过〔〕次比较.A. 1B.2C. 3D. 416.设顺序线性表的长度为30,分成5块,每块6个元素,如果采用分块查找,则其平均查找长度为〔 〕.A. 6B.11C. 5 D . 6.517.设有一组初始记录关键字序列为<34,76,45,18,26,54,92>,则由这组记录关键字生成的二叉排序树的深度为〔 〕.A . 4B.5 C. 6 D. 718.二叉排序树中左子树上所有结点的值均〔 〕根结点的值.A .<B.>C.=D.!=19.设有n 个关键字具有相同的Hash 函数值,则用线性探测法把这n 个关键字映射到HASH 表中需要做〔 〕次线性探测.A. n 2B. n<n+1>C. n<n+1>/2 D . n<n-1>/220.用散列函数求元素在散列表中的存储位置时,可能会出现不同的关键字得到相同散列函数值的冲突现象.可用于解决上述问题的是< >A.线性探测法B.除留余数法C.平方取中法D.折叠法21.22.在线性表的散列存储中,若用m 表示散列表的长度,n 表示待散列存储的元素的个数,则装填因子α等于〔 〕.A .n/mB .m/nC .n/<n+m>D .m/<n+m>23.从一棵B_树删除元素的过程中,若最终引起树根结点的合并,则新树高度是〔 〕.A .原树高度加1B .原树高度减1C .原树高度D .不确定24.向二叉搜索树中插入一个元素时,其时间复杂度大致为〔 〕.A.O 〔log 2n 〕 B. O<n>C. O<1> D. 0<nlog 2n>25.5阶B 树中,每个结点最多有〔〕个关键码.A .2B .3C .4D .526.对一棵二叉排序树采用中根遍历进行输出的数据一定是〔 〕A.递增或递减序列B.递减序列C.无序序列D.递增序列27.一个有序表为{1,3,9,12,32,41,45,62,75,77,82,95,100},当二分查找值为82的结点时,查找成功时的比较次数为〔 〕A.1B.2C.4D.828.若构造一棵具有n 个结点的二叉排序树,最坏的情况下其深度不超过< > A. 2n B. n C. 21n + D. n+1 29.闭散列表中由于散列到同一个地址而引起的"堆积〞现象,是< >A.由同义词之间发生冲突引起的B.由非同义词之间发生冲突引起的C.由同义词之间或非同义词之间发生冲突引起的D.由散列表"溢出〞引起的30.在对查找表的查找过程中,若被查找的数据元素不存在,则把该数据元素插入到集合中.这种方式主要适合于< >A.静态查找表B.动态查找表C.静态查找表与动态查找表D.静态查找表或动态查找表31.设一组记录的关键字key值为{62,50,14,28,19,35,47,56,83},散列函数为H<key>=key mod13,则它的开散列表中散列地址为1的链中的结点个数是〔〕A.1B.2 C.3 D.432.已知一个有序表为〔13,18,24,35,47,50,62,83,90,115,134〕,当二分检索值为90的元素时,检索成功需比较的次数是〔〕A.1B.2C.3D.433.闭散列表中由于散列到同一个地址而引起的"堆积〞现象,是由〔〕A.同义词之间发生冲突引起的B.非同义词之间发生冲突引起的C.同义词与非同义词之间发生冲突引起的D.散列地址"溢出〞引起的34.在最坏的情况下,查找成功时二叉排序树的平均查找长度〔〕A.小于顺序表的平均查找长度B.大于顺序表的平均查找长度C.与顺序表的平均查找长度相同D.无法与顺序表的平均查找长度比较35.闭散列表中由于散列到同一个地址而引起的"堆积〞现象,是由〔〕A.同义词之间发生冲突引起的B.非同义词之间发生冲突引起的C.同义词之间或非同义词之间发生冲突引起的D.散列表"溢出〞引起的36.设有100个元素,用二分法查找时,最大比较次数是〔〕.A.25 B.7C.10 D.137.设有1000个元素,用二分法查找时,最小比较次数为〔〕A.0 B.1C.10 D.50038.在一个长度为n的顺序线性表中顺序查找值为x的元素时,查找成功时的平均查找长度〔即x与元素的平均比较次数,假定查找每个元素的概率都相等〕为< >.A.nB. n/2C. <n+1>/2D. <n-1>/239.对有14个数据元素的有序表R[14]进行折半搜索,搜索到R[3]的关键码等于给定值,此时元素比较顺序依次为〔〕.A.R[0],R[1],R[2],R[3] B.R[0],R[13],R[2],R[3] C.R[6],R[2],R[4],R[3] D.R[6],R[4],R[2],R[3] 40.在一个有N个元素的有序单链表中查找具有给定关键字的结点,平均情况下的时间复杂性为< B >A.O<1>B.O<N>C.0〔N2〕D.O<NlogN>41.对线性表进行二分查找时,要求线性表必须〔B〕A.以顺序方式存储B.以顺序方式存储,且数据元素有序C.以方式存储D.以方式存储,且数据元素有序42.下列二叉排序树中查找效率最高的是< A >A.平衡二叉树B.二叉查找树C.没有左子树的二叉排序树D.没有右子树的二叉排序树43.如果要求一个线性表既能较快地查找,又能适应动态变化的要求,可以采用下列哪一种查找方法.AA. 分块B. 顺序C. 折半D. 哈希44.分别以下列序列构造二叉排序树,与用其它三个序列所构造的结果不同的是< C >A.<100,80,90,60,120,110,130>B.<100,120,110,130,80,60,90>C.<100,60,80,90, 20,110,130>D.<100,80,60,90,120,130,110>45.下面关于B和B+树的叙述中,不正确的是<C >A. B树和B+树都是平衡的多叉树.B. B树和B+树都可用于文件的索引结构.C. B树和B+树都能有效地支持顺序检索.D. B树和B+树都能有效地支持随机检索.46.m阶B-树是一棵< B >A. m叉排序树B. m叉平衡排序树C. m-1叉平衡排序树D.m+1叉平衡排序树47.在一棵含有n个关键字的m阶B-树中进行查找,至多读盘< C >次.48.一棵3阶B-树中含有2047个关键字,包括叶子结点层,该树的最大深度为< B >.A, 11 B. 12 C. 13 D. 1449.关于杂凑查找说法不正确的有几个< B > 〔1〕采用链地址法解决冲突时,查找一个元素的时间是相同的〔2〕采用链地址法解决冲突时,若插入规定总是在链首,则插入任一个元素的时间是相同的〔3〕用链地址法解决冲突易引起聚集现象〔4〕再哈希法不易产生聚集A. 1B. 2C. 3D. 450.设哈希表长M=14,哈希函数H<KEY>=KEY MOD 11.表中已有4个结点:ADDR<15>=4, ADDR<38>=5,ADDR<61>=6,ADDR<84>=7,其余地址为空,如用二次探测再散列处理冲突,关键字为49的结点的地址是< D >.A. 8B. 3C. 5D. 951.散列函数有一个共同的性质,即函数值应当以< D >取其值域的每个值.A. 最大概率B. 最小概率C. 平均概率D. 同等概率52.将10个元素散列到100000个单元的哈希表中,则〔C〕产生冲突.A. 一定会B. 一定不会C. 仍可能会53.长度为10的按关键字有序的查找表采用顺序组织方式.若采用折半查找方法,则在等概率情况下,查找失败时的ASL值是〔D〕A.24/10B.24/11C.39/10D.39/1154.在采用拉链法处理冲突所构成的开散列表上查找某一关键字,在查找成功的情况下,所探测的这些位置上的键值〔A〕A.一定都是同义词B.不一定都是同义词C.都相同D.一定都不是同义词55.二叉查找树的查找效率与二叉树的树型有关, 在 <C >时其查找效率最低.A. 结点太多B. 完全二叉树C. 呈单枝树D. 结点太复杂.56.具有12个关键字的有序表,折半查找的平均查找长度〔A〕A. 3.1B. 4C. 2.5D. 557.哈希查找中k个关键字具有同一哈希值,若用线性探测法将这k个关键字对应的记录存入哈希表中,至少要进行< C >次探测.A. k B. k+1 C. k<k+1>/2 D.1+k<k+1>/258.对线性表进行二分查找时,要求线性表必须〔B〕A.以顺序方式存储B.以顺序方式存储,且数据元素有序C.以方式存储D.以方式存储,且数据元素有序59.若查找每个元素的概率相等,则在长度为n 的顺序表上查找任一元素的平均查找长度为< D> .A. nB. n+1C. <n-1>/2D. <n+1>/260.对长度为10 的顺序表进行查找,若查找前面 5 个元素的概率相同,均为1/8 ,查找后面 5 个元素的概率相同,均为3/40 ,则查找任一元素的平均查找长度为< C> .A.5.5B.5C.39/8D.19/461.对长度为3 的顺序表进行查找,若查找第一个元素的概率为1/2 ,查找第二个元素的概率为1/3 ,查找第三个元素的概率为1/6 ,则查找任一元素的平均查找长度为< A> .A .5/3B .2 C. 7/3 D. 4/362.对长度为n 的单链有序表,若查找每个元素的概率相等,则查找任一元素的平均查找长度为< B> .A. n/2 B . <n+1>/2 C. <n-1>/2 D. n/463.对于长度为9 的顺序存储的有序表,若采用二分查找,在等概率情况下的平均查找长度为< A> 的9 分之一.A .20 B. 18 C. 25 D. 2264.对于长度为18 的顺序存储的有序表,若采用二分查找,则查找第15 个元素的查找长度为< B> .A. 3B. 4C. 5D. 665.对于顺序存储的有序表<5,12,20,26,37,42,46,50,64> ,若采用二分查找,则查找元素26 的查找长度为< C> .A .2 B. 3 C. 4 D. 566.对具有n 个元素的有序表采用二分查找,则算法的时间复杂性为< D> .A. O <n>B. O <n 2 >C. O <1>D. O <log 2 n>67.在索引查找中,若用于保存数据元素的主表的长度为n ,它被均分为k 个子表,每个子表的长度均为n/k ,则索引查找的平均查找长度为< D> .A. n+kB. k+n/kC. <k+n/k>/2D. <k+n/k>/2+168.在索引查找中,若用于保存数据元素的主表的长度为n ,它被均分为若干个子表,每个子表的长度均为s ,则索引查找的平均查找长度为< B > .A. <n+s>/2B. <n/s+s>/2+1C. <n+s>/2+1 D . <n/s+s>/269.在索引查找中,若用于保存数据元素的主表的长度为144 ,它被均分为12 子表,每个子表的长度均为12 ,则索引查找的平均查找长度为< A> .A .13 B. 24 C. 12 D. 7970.在索引查找中,若用于保存数据元素的主表的长度为117 ,它被均分为9 子表,则索引查找的平均查找长度为< B> .A. 11B. 12 C .13 D. 971.在一棵深度为h 的具有n 个元素的二叉排序树中,查找所有元素的最长查找长度为< D> .A. nB. log 2 nC. <h+1>/2D.h72.从具有n 个结点的二叉搜索树中查找一个元素时,在平均情况下的时间复杂性大致为< C> .A. O <n>B. O <1>C. O <log 2 n>D. O <n 2 >73.从具有n 个结点的二叉搜索树中查找一个元素时,在最坏情况下的时间复杂性为< A> .A. O <n>B. O <1>C. O <log 2 n>D. O <n 2 >74.向具有n 个结点的二叉搜索树中插入一个元素时,其时间复杂性大致为< B > .A. O <1> B .O <log 2 n > C. O <n> D. O < n log 2n >75.根据n 个元素建立一棵二叉搜索树时,其时间复杂性大致为< D> .A. O <n> B .O <log 2 n > C. O <n 2 > D .O < n log 2n >76.在一棵平衡二叉排序树中,每个结点的平衡因子的取值范围是< A> .A .-1 ~ 1 B. -2 ~ 2 C. 1 ~ 2 D. 0 ~ 177.若根据查找表<23,44,36,48,52,73,64,58> 建立开散列表,采用h<K>=K%13 计算散列地址,则元素64 的散列地址为< C> .A. 4B. 8C. 12D. 1378.若根据查找表<23,44,36,48,52,73,64,58> 建立开散列表,采用h<K>=K%7 计算散列地址,则散列地址等于 3 的元素个数< B> .A.1 B .2 C. 3 D. 479.若根据查找表<23,44,36,48,52,73,64,58> 建立开散列表,采用h<K>=K%7 计算散列地址,则同义词元素个数最多为< C> .A. 1B. 2C. 3D. 480.若根据查找表建立长度为m 的闭散列表,采用线性探测法处理冲突,假定对一个元素第一次计算的散列地址为 d ,则下一次的散列地址为<D> .A. dB. d+1C. <d+1>/mD. <d+1>%m81.若根据查找表建立长度为m 的闭散列表,采用二次探测法处理冲突,假定对一个元素第一次计算的散列地址为 d ,则第四次计算的散列地址为< C> .A. <d+1>%mB. <d-1>%m C . <d+4>%m D. <d-4>%m82.在采用线性探测法处理冲突的闭散列表上,假定装填因子 a 的值为0.5 ,则查找任一元素的平均查找长度为<B> .A. 1B. 1.5C. 2 D .2.583.在采用法处理冲突的开散列表上,假定装填因子 a 的值为 4 ,则查找任一元素的平均查找长度为< A> .A. 3B. 3.5C. 4D. 2.584.在散列查找中,平均查找长度主要与< C> 有关.A.散列表长度B.散列元素的个数C.装填因子D.处理冲突方法85.对顺序表进行二分查找时,要求顺序表必须:A.以顺序方式存储B.以顺序方式存储,且数据元素有序C.以方式存储D.以方式存储,且数据元素有序[解答]B86.下列二叉排序树中查找效率最高的是:A.平衡二叉树B.二叉查找树C.没有左子树的二叉排序树D.没有右子树的二叉排序树[解答]A二、填空题1.假定一个线性表为<12,23,74,55,63,40>,若按Key % 4条件进行划分,使得同一余数的元素成为一个子表,则得到的四个子表分别为_____________、___________、________和___________.〔12,40〕,〔〕,〔74〕,〔23,55,63〕2.向一棵B_树插入元素的过程中,若最终引起树根结点的分裂,则新树比原树的高度___________.增加13. 为了能有效地应用HASH查找技术,必须解决的两个问题是________________和_____________________.构造一个好的HASH函数,确定解决冲突的方法4.设查找表中有100个元素,如果用二分法查找方法查找数据元素X,则最多需要比较________次就可以断定数据元素X是否在查找表中.75.下列算法实现在顺序散列表中查找值为x的关键字,请在下划线处填上正确的语句.struct record{int key; int others;};int hashsqsearch<struct record hashtable[ ],int k>{int i,j; j=i=k % p;while <hashtable[j].key!=k&&hashtable[j].flag!=0>{j=<____> %m; if <i==j> return<-1>;}if <_______________________ > return<j>; else return<-1>;} j+1,hashtable[j].key==k6.下列算法实现在二叉排序树上查找关键值k,请在下划线处填上正确的语句.typedef struct node{int key; struct node *lchild; struct node *rchild;}bitree;bitree *bstsearch<bitree *t, int k>{if <t==0 > return<0>;else while <t!=0>if <t->key==k>_____________;else if <t->key>k> t=t->lchild;else_____________;} return<t>,t=t->rchild7.根据初始关键字序列<19,22,01,38,10>建立的二叉排序树的高度为____________.38.设散列函数H<k>=k mod p,解决冲突的方法为链地址法.要求在下列算法划线处填上正确的语句完成在散列表hashtalbe中查找关键字值等于k的结点,成功时返回指向关键字的指针,不成功时返回标志0.typedef struct node {int key; struct node *next;} lklist;void createlkhash<lklist *hashtable[ ]>{int i,k; lklist *s;for<i=0;i<m;i++>_____________________;for<i=0;i<n;i++>{s=<lklist *>malloc<sizeof<lklist>>; s->key=a[i];k=a[i] % p; s->next=hashtable[k];_______________________;}}hashtable[i]=0,hashtable[k]=s9.下面程序段的功能是实现二分查找算法,请在下划线处填上正确的语句.struct record{int key; int others;};int bisearch<struct record r[ ], int k>{int low=0,mid,high=n-1;while<low<=high>{________________________________;if<r[mid].key==k> return<mid+1>;else if<____________> high=mid-1;else low=mid+1;}return<0>;} mid=<low+high>/2,r[mid].key>k10.设需要对5个不同的记录关键字进行排序,则至少需要比较_____________次,至多需要比较_____________次.4,1011.设在长度为20的有序表中进行二分查找,则比较一次查找成功的结点数有_________个,比较两次查找成功有结点数有_________个.1,212.设二叉排序树的高度为h,则在该树中查找关键字key 最多需要比较_________次.h13.设散列表的长度为8,散列函数H<k>=k %7,用线性探测法解决冲突,则根据一组初始关键字序列<8,15,16,22,30,32>构造出的散列表的平均查找长度是________.8/314.设一组初始记录关键字序列为<20,12,42,31,18,14,28>,则根据这些记录关键字构造的二叉排序树的平均查找长度是_______________________________.19/715.下面程序段的功能是实现在二叉排序树中插入一个新结点,请在下划线处填上正确的内容.typedef struct node{int data;struct node *lchild;struct node *rchild;}bitree;void bstinsert<bitree *&t,int k>{if<t==0>{____________________________;t->data=k;t->lchild=t->rchild=0;} else if <t->data>k> bstinsert<t->lchild,k>;else__________________________;} t=<bitree *>malloc<sizeof<bitree>>,bstinsert<t->rchild,k>16.解决散列表冲突的两种方法是________________和__________________.开放定址法,链地址法17.在一棵m 阶B_树上,每个非树根结点的关键字数目最少为_______个,最多为_____个,其子树数目最少为______,最多为____.⎡⎤12/-m 、m-1 、⎡⎤2/m 、 m18.从一棵二叉搜索树中查找一个元素时,若元素的值等于根结点的值,则表明_______,若元素的值小于根结点的值,则继续向________查找,若元素的大于根结点的值,则继续向________查找.查找成功、左子树、右子树19.对于二分查找所对应的判定树,它既是一棵_____,又是一棵__________.二叉搜索树、理想平衡树20.二叉搜索树的中序遍历得到的结点序列为________. 有序序列21.从有序表〔12,18,30,43,56,78,82,95〕中依次二分查找43和56元素时,其查找长度分别为___________和__________.1 , 322.假定对长度n=144的线性表进行索引查找,并假定每个子表的长度均为n,则进行索引查找的平均查找长度为__________,时间复杂度为___________.13, O<n>23.一棵B-树中的所有叶子结点均处在_____________上.同一层24.每次从无序表中顺序取出一个元素,把它插入到有序表中的适当位置,此种排序方法叫做_______排序;每次从无序表中挑选出一个最大或最小元素,把它交换到有序表中的一端,此种排序方法叫做_________排序.插入选择25.对于线性表〔18,25,63,50,41,32,90,66〕进行散列存储时,若选用H〔K〕=K%11作为散列函数,则散列地址为0的元素有______个,散列地址为3的元素有______个,散列地址为8的元素有______个.1 1 226.在一个具有n个结点的单链表中查找值为m的某结点,若查找成功,则需平均比较的结点数为____<n+1>/2________.27.在一棵二叉排序树上按_____中序_______遍历得到的结点序列是一个有序序列.28.实现二分查找的存储结构仅限于顺序存储结构,且其中元素排列必须是____有序的.29.设顺序表的表长为n,且查找每个元素的概率相等,则采用顺序查找法查找表中任一元素,在查找成功时的平均查找长度为___<n+1>/2_______.30.在索引顺序表上的查找分两个阶段:一是查找_____索引表_____,二是查找块.31.一棵平衡二叉树中任一结点的平衡因子只可能是__-1,0,1_____.n>_____.32.二分查找的时间复杂度为__O<log233.查找表的数据结构有别于线性表、树型结构等,其逻辑结构为____集合______.34.长度为L的顺序表,采用设置岗哨方式顺序查找,若查找不成功,其查找长度为__L+1_______.35.在开散列表上查找某元素时,通常分两步进行,首先必须计算该键值的散列地址,然后在地址指针所指_________同义词子表_______中查找该结点.36.对二叉排序树进行__中序______遍历,可得到排好序的递增结点序列. 37.采用折半查找方法进行查找的数据序列应为____顺序存储____且___有序_____.38.查找表的逻辑组织结构实际上是____集合____________结构.39.对于具有n个元素的数据序列,采用顺序查找法,其平均查找长度为____<n+1>/2______.40.快速排序算法在最差的情况下其时间复杂度是.O<n2>41.在线性表的________存储中,对每一个元素只能采用顺序查找.链式42.采用顺序查找方法查找长度为n的线性表时,每个元素的平均查找长度为________________.〔n+1〕/243.以顺序查找方法从长度为n的线性表中查找一个元素时,平均查找长度为________,时间复杂度为________.<n+1>/2、O<n>44.以二分查找方法从长度为n的线性有序表中查找一个元素时,平均查找长度小于等于________,时间复杂度为________.O<log2n>45.以二分查找方法从长度为12的有序表中查找一个元素时,平均查找长度为________.37/1246.以二分查找方法查找一个线性表时,此线性表必须是________存储的________表.顺序、有序47.从有序表<12,18,30,43,56,78,82,95>中依次二分查找43和56元素时,其查找长度分别为________和________.1、348.对于二分查找所对应的判定树,它既是一棵_______,又是一棵________.二叉搜索树、理想平衡树49.假定对长度n=50的有序表进行二分查找,则对应的判定树高度为________,判定树中前5层的结点数为________,最后一层的结点数为________.6、31、19 50.在索引表中,每个索引项至少包含有________域和________域这两项.索引、开始地址51.假定一个线性表为<12,23,74,55,63,40,82,36>,若按Key % 3条件进行划分,使得同一余数的元素成为一个子表,则得到的三个子表分别为________、________和________.<12,63,36>、<55,40,82>、<23,74>52.假定一个线性表为<〞abcd〞,〞baabd〞,〞bcef〞,〞cfg〞,〞ahij〞,〞bkwte〞,〞ccdt〞,〞aayb〞>,若按照字符串的第一个字母进行划分,使得同一个字母被划分在一个子表中,则得到的a,b,c三个子表的长度分别为________、________和________.3、3、253.在线性表的________存储中,无法查找到一个元素的前驱或后继元素.散列54.在线性表的________存储中,对每一个元素只能采用顺序查找.55.假定对线性表<38,25,74,52,48>进行散列存储,采用H<K>=K % 7作为散列函数,若分别采用线性探查法和法处理冲突,则对各自散列表进行查找的平均查找长度分别为_______和________.2、7/556.假定要对长度n=100的线性表进行散列存储,并采用法处理冲突,则对于长度m=20的散列表,每个散列地址的单链表的长度平均为________.557.在线性表的散列存储中,处理冲突有________和________两种方法.开放定址、58.对于线性表<18,25,63,50,42,32,90>进行散列存储时,若选用H<K>=K % 9作为散列函数,则散列地址为0的元素有________个,散列地址为5的元素有________个.3、259.在堆排序的过程中,对任一分支结点进行筛运算的时间复杂度为_________,整个堆排序过程的时间复杂度为________________.O〔log2n〕、O<nlog2n>;60.顺序查找n个元素的顺序表,若查找成功,则比较关键字的次数最多为__ __次;当使用监视哨时,若查找失败,则比较关键字的次数为__ __.n n+161.在各种查找方法中,平均查找长度与结点个数n无关的查找方法是.哈希查找62.在有序表A[1..12]中,采用二分查找算法查等于A[12]的元素,所比较的元素下标依次为__________.6,9,11,1263.己知有序表为<12,18,24,35,47,50,62,83,90,115,134>当用二分法查找90时,需__________次查找成功,47时__________成功,查100时,需__________次才能确定不成功.2,4,364.平衡二叉树又称_________,其定义是________.AVL树<高度平衡树,高度平衡的二叉排序树>,或为空二叉树,或二叉树中任意结点左子树高度与右子树高度差的绝对值小于等于1.65.在哈希函数H〔key〕=key%p中,p值最好取_________.小于等于表长的最大素数或不包含小于20的质因子的合数66.有一个2000项的表,欲采用等分区间顺序查找方法进行查找,则每块的理想长度是__<1>___,分成__<2>___块最为理想,平均查找长度是__<3>___.<1>45 <2>45 <3>46<块内顺序查找>67.假定有k个关键字互为同义词,若用线性探测再散列法把这k个关键字存入散列表中,至少要进行__________次探测.k<k+1>/268.查找是非数值程序设计的一个重要技术问题,基本上分成__<1>__查找,__<2>__查找和__<3>__查找.处理哈希冲突的方法有__<4>__、__<5>__、__<6>__和__<7>__.<1>顺序表 <2>树表 <3>哈希表 <4>开放定址方法<1><5>链地址方法 <6>再哈希 <7>建立公共溢出区69.在含有n个结点的二叉排序树中查找一个关键字,进行关键字比较次数最大值是.n70.一棵深度为k的平衡二叉树,其每个非终端结点的平衡因子均为0,则该树共有个结点.2k-171.假定查找有序表A[1..12]中每个元素的概率相等,则进行二分查找时的平均查找长度为__________ 37/1272.动态查找表和静态查找表的重要区别在于前者包含有__________和__________运算,而后者不包含这两种运算.插入删除73.对于具有144 个记录的文件,若采用分块查找法,且每块长度为8,则平均查找长度为__________. 1474.以顺序查找方法从长度为n 的顺序表或单链表中查找一个元素时,平均查找长度为________ ,时间复杂性为________ .<n+1>/2 O<n>75.假定一个顺序表的长度为40 ,并假定查找每个元素的概率都相同,则在查找成功情况下的平均查找长度________ ,在查找不成功情况下的平均查找长度________ .20.5 4176.以二分查找方法从长度为50 的有序表中查找一个元素时,其查找长度不超过________ .677.以二分查找方法在一个查找表上进行查找时,该查找表必须组织成________ 存储的________ 表.顺序有序78.从有序表<12,18,30,43,56,78,82,95> 中分别二分查找43 和56 元素时,其查找长度分别为________ 和________ .1 379.二分查找所对应的判定树,既是一棵_______ ,又是一棵________ .二叉排序。
第8章 查找 习题参考答案
习题八 参考答案一、选择题1.对线性表进行二分查找时,要求线性表必须( B )A.以顺序方式存储B.以顺序方式存储,且结点按关键字值有序排列C.以链接方式存储D.以链接方式存储,且结点按关键字值有序排列2. 用二分查找法查找具有n 个结点的顺序表时,查找每个结点的平均比较次数是( D )A.O(n 2)B.O(nlog 2n)C.O(n)D.O(log 2n)3. 对长度为4的顺序表进行查找,若查找第一个记录的概率为1/24, 查找第二个记录的概率为1/6, 查找第三个记录的概率为2/3, 查找第四个记录的概率为1/8,则查找任意一个记录的平均查找长度为( A )A.23/8B.20/8C.17/8D.14/84. 若有一个长度为64的有序表,现用二分查找方法查找某一记录,则查找不成功,最多需要比较( B )次。
A.9B.7C.5D.35. 当采用分块查找时,数据的组织方式为( C )A.数据必须有序B.数据不必有序C.数据分成若干块,每块内数据不必有序,但块间必须有序D.数据分成若干块,每块内数据必须有序,但块间不必有序6. 一棵深度为k 的平衡二叉树,其每个非终端结点的平衡因子均为0,则该平衡二叉树共有( C )个结点。
A.2k-1-1B.2k-1+1C.2k -1D.2k +17. 具有5层结点的平衡二叉树至少有( B )个结点。
A.10B.12C.15D.178. 若结点的存储地址与其关键字之间存在某种映射关系,则称这种存储结构为( D )A.顺序存储结构B.链式存储结构C.索引存储结构D.散列存储结构9. 以下有关m 阶B-树的叙述中,错误的是( B )。
A.根结点至多有m 棵子树B.每个结点至少有⎥⎥⎤⎢⎢⎡2m 棵子树 C.所有叶子结点都在同一层上 D.每个结点至多有m-1个关键字10.哈希表的地址区间为0~17,哈希函数为h(key)=K%17。
采用线性探测法处理冲突,并将关键字序列{26,25,72,38,8,18,59}依次存储到哈希表中,则在哈希表中查找元素59需要搜索的次数为( C )。
程序设计基础(C语言)第8章 查找和排序算法
8.2.3二分查找的实际应用
• 【例8.3】用二分法求下面的
一元三次方程 x3 x 1 0
在区间[1, 3]上误差不大于 10-6的根。先从键盘输入迭 代初值 x0和允许的误差 , 然后输出求得的方程根和所 需的迭代次数。
//函数功能:用二分法计算并返回方程的根 double Iteration(double x1, double x2, double eps) {
8.1.2线性查找算法的程序实现
#include <stdio.h>
#define N 40
int ReadRecord(int num[], int weight[]);
int LinSearch(int num[], int key, int n);
//主函数
int main(void)
{
int num[N], weight[N], n, pos, key;
double x0; do{
return BinSearch(num, key, mid+1, high); //在后一子表查找 } else if (key < num[mid]) {
return BinSearch(num, key, low, mid-1); //在前一子表查找 } return mid; //找到,返回找到的位置下标 }
序排列的。
int BinSearch(int num[], int key, int low, int high) {
int mid = (high + low) / 2; //取数据区间的中点 if (low > high) //递归结束条件 {
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
比较次数=5
顺序查找方法的ASL
对含有n个记录的表, ASL pi ci
i 1 n
1 设表中每个元素的查找 概率相等pi n n 1 n 1 n(n 1) n 1 则ASL成功 pi ci (n 1 i ) n i 1 n 2 2 i 1
9.1.2 折半查找(二分查找)
查找过程:每次将待查记录所在区间缩小一半 适用条件:采用顺序存储结构的有序表 算法实现
设表长为n,low、high和mid分别指向待查元素所在 区间的上界、下界和中点,k为给定值 初始时,令low=1,high=n,mid=(low+high)/2 让k与mid指向的记录比较 若k==r[mid].key,查找成功 若k<r[mid].key,则high=mid-1 若k>r[mid].key,则low=mid+1 重复上述操作,直至查找成功或 low>high时查找失败
找21
例
1 5 low
1 5
2 13
3 19
4 21
5 37
6 56
mid
7 64
8 75
9 80
10 88
11 92
high
2 13
3 19
4 21
5 37
6 56
7 64
8 75
9 80
10 88
11 92
low 1 2 5 13
mid 3 4 19 21
high 5 6 37 56
7 64
8 75
查找方法评价
查找速度
所需辅助存储空间 算法本身复杂程度
平均查找长度ASL(Average Search Length):为 确定记录在表中的位置,需和给定值进行比较 的关键字的个数的期望值叫查找算法的~
对含有n个记录的表,ASL pi ci
i 1 n
其中:pi为查找表中第i个元素的概率, pi 1
i 1
n
ci为找到表中第i个元素所需比较次数
§9.1 静态查找表 9.1.1 顺序查找 查找过程:从表的一端开始逐个进行记录的关键 找64 字和给定值的比较
例 0 1 25 2 13 3 19 4 75 5 37 6 88 7 64 8 21 9 80 10 56 11 92
int Search_Seq(SSTable ST, KeyType key)
算法9.6
例 {10, 18, 3, 8, 12, 2, 7}
10
10 18
10
10 18
10 18
3
3
8
3
18 8 12
10
3 2 18 3 2
10
18
8 12
8 12 7
中序遍历二叉排序树可得到一个关键字的有序序列
二叉排序树的删除
p为叶子结点,只需修改p双亲f的指针 f->lchild=NULL 或 f->rchild=NULL p只有左子树或右子树 p只有左子树,用p的左孩子代替p (1)(2) p只有右子树,用p的右孩子代替p (3)(4) p左、右子树均非空 沿p左子树的根C的右子树分支找到S,S的右 子树为空,将S的左子树成为S的双亲Q的右子树, 用S取代p (5) 若C无右子树,用C取代p (6)
}SSTable;
算法描述 算法9.1
// 否则为0。
int Search_Seq(SSTable ST, KeyType key) //若找到,则函数值为该元素在表中的位置,
{ ST.elem[0].key=key; return i; } // "哨兵" // 从后往前找 //找不到时,i为0
9 80
10 88
11 92
low mid high
查找成功!
找70
例 1 5 2 13 3 19 4 21 5 37 6 56 7 64 8 75 9 80 10 88 11 92 high 11 92
low 1 2 5 13
3 19
4 21
5 37
mid 6 7 56 64 low
8 75
9 80
查找过程:将表分成几块,块内无序,块间有 序;先确定待查记录所在块,再在块内查找 适用条件:索引顺序表 算法实现
用数组存放待查记录,每个数据元素至少含有关键 字域,表分块有序 建立索引表,每个索引表结点含有最大关键字域和 指向本块第一个结点的指针
索引顺序表的查找 表分块有序 索引表中每个索引表结点含有最大关键字域和指向本块 第一个结点的指针 查找过程需分两步:先确定待查记录所在的块(子表), 然后在块中顺序查找。
S Q P
Q
S PR
PR 中序遍历:Q S P PR (4)
中序遍历:Q S PR
中序遍历:CL C ……QL Q SL S P PR F F F
P
C CL QL SL F P C CL 中序遍历:CL C P PR F (6) PR CL
S PR
Q S (5) C PR Q QL SL
CL
中序遍历:CL C ……QL Q SL S PR F F
第九章 查找
查找表——被查找的对象称作查找表,是由同一 类型的数据元素(或记录)构成的集合。 关键字——是数据元素中某个数据项的值,它可 以标识一个数据元素。
查找——也叫检索,是根据给定的某个值, 在查找表中找一个其关键字等于给定值的 记录的操作。
查找的结果——若查到其关键字等于给定值的记 录,则称“查找成功”,否则,称“查找失败”。
10 88
1 5
2 13
3 19
4 21
5 37
6 56
7 64
mid high 8 9 10 11 75 80 88 92
low mid high 1 5 2 13 3 19 4 21 5 37 6 56 7 64 8 75 9 80 10 88 11 92
low high mid
1 5
2 13
查找方法比较
顺序查找 ASL 表结构 存储结构 最大 折半查找 最小 分块查找 两者之间 分块有序表
有序表、无序表 有序表 顺序存储结构 线性链表
顺序存储结构 顺序存储结构 线性链表
作业:《习题集》p54
9.3
9.9(2)
§9.2 动态查找表
9.2.1 二叉排序树
定义:二叉排序树或是一棵空树,或是具有下列性质 的二叉树: 若它的左子树不空,则左子树上所有结点的值均小 于它的根结点的值 若它的右子树不空,则右子树上所有结点的值均大 于或等于它的根结点的值 它的左、右子树也分别为二叉排序树 二叉排序树的查找过程 当二叉排序树不空时,首先将给定值和根结点的关 键字比较,若相等,则查找成功,否则将依据给定 值和关键字之间的大小关系,分别在左子树或右子 树上继续查找。 算法9.5(a)
8 25
4 13
4
9.2.2 B-树和B+树
B-树是一棵平衡的多路查找树,主要用作文件索引。 定义: 一棵m阶的B-树,或为空树,或为满足下列特性的m叉树: (1)树中每个结点至多有m棵子树; (2)若根结点不是叶结点,则至少有两颗子树; (3)除根结点之外的所有非终端结点至少有m/2 棵子树; (4)所有的非终端结点都包含以下信息数据: (n,A0,K1,A1,K2,„,Kn,An) 其中,n(m/2 1≤n≤m 1)为关键字的个数, Ki(1≤i≤n)为关键字,且Ki<Ki+1(1≤i≤n-1), Ai(0≤i≤n)为指向子树根结点的指针,且指针Ai所指 子树中所有结点的关键字均小于Ki+1大于Ki。 (5)所有叶结点都出现在最低层上,并且不带信息。
二叉排序树的插入
插入原则:若二叉排序树为空,则插入结点应为新 的根结点;否则,继续在其左、右子树上查找,直 至某个叶子结点的左子树或右子树为空为止,则插 入结点应为该叶子结点的左孩子或右孩子 二叉排序树生成:从空树出发,经过一系列的查找、 插入操作之后,可生成一棵二叉排序树
插入算法 算法9.5(b)
1 5
判定树:
3
1 2
9
4 5 7 8 10 11
折半查找法在查找过程中进行的比较次数最多不超过 其判定树的深度,即不超过log2n+1 查找概率相等情况下,其平均查找长度为
n 1 log 2 (n 1) 1 log 2 (n 1) 1 n
9.1.3 分块查找(索引顺序表的查找)
C PR
中序遍历:CL C PR F
删除算法 算法9.7 算法9.8
80
例 50
80 120 60 110 150
删除50
60 55 53
120 70 110
80
删除60 150
55 53
120
55
53
70
70 110
150
10 4 8 13 5 25 删除10 4 4
8
25 5 13 删除5 4
要删除二叉排序树中的p结点,分三种情况:
S P Q
S PL Q
PL 中序遍历:PL P S Q (1) S Q P
中序遍历:PL S Q
S Q PL
PL 中序遍历:Q S PL P (2)
中序遍历:Q S PL
S P PR 中序遍历:P PR S Q (3) Q
S PR Q
中序遍历:PR S Q
3 19
4 21
5 37
6 56
7 64
8 75
9 80
10 88
11 92
high low
查找失败