第17讲 线性表的查找 课堂互动 隐藏答案 | 返回首页

作者:欧新宇(Xinyu OU)

最后更新:2023-12-18


【课前自测17】

【课堂互动17.1】顺序查找

1. 顺序查找适合于存储结构为( )的线性表。
A. 顺序存储结构或链式存储结构
B. 散列存储结构
C. 索引存储结构
D. 压缩存储结构

答案及解析:A
顺序查找是指从表的一端开始向另一端查找。它不要求查找表具有随机存取的特性,可以是顺序存储结构或链式存储结构。

2. 由 n 个数据元素组成的两个表: 一个递增有序, 一个无序。采用顺序查找算法,对有序表从头开始查找,发现当前元素已不小于待查元素时,停止查找,确定查找不成功,已知查找任意一个元素的概率是相同的,则在两种表中成功查找( )。
A. 平均时间后者小
B. 平均时间两者相同
C. 平均时间前者小
D. 无法确定

答案及解析:B
对于顺序查找,成功查找的比较次数只与位置相关。因此,无论线性表是否有序,其平均查找时间 t 都等于 (1+2+...+n)/n=(n+1)/2。

3. 对长度为n 的有序单链表,若查找每个元素的概率相等,则顺序查找表中任意一个元素的查找成功的平均查找长度为( )。
A.n/2
B.(n+1)/2
C.(n-1)/2
D.n/4

答案及解析:B
在有序单链表上做顺序查找,查找成功的平均查找长度与在无序顺序表或有序顺序表上做顺序查找的平均查找长度相同,都是 (1+2+...+n)/n=(n+1)/2。

4. 对长度为3的顺序表进行查找,若查找第一个元素的概率为1/2,查找第二个元素的概率为1/3,查找第三个元素的概率为1/6,则查找任意一个元素的平均查找长度为( )。
A. 5/3
B. 2
C. 7/3
D. 4/3

答案及解析:A
在长度为3的顺序表中,查找第一个元素的查找长度为1(一个元素),查找第二个元素的查找长度为2(两个元素),查找第三个元素的查找长度为3(三个元素),故有:ASL成功=12×1+13×2+16×3=53ASL_{成功} = \frac{1}{2}×1 + \frac{1}{3}×2 + \frac{1}{6}×3 = \frac{5}{3}

【课堂互动17.2】折半查找

1. 下列关于二分查找的叙述中,正确的是( )。
A. 表必须有序,表可以顺序方式存储,也可以链表方式存储
B. 表必须有序且表中数据必须是整型、实型或字符型
C. 表必须有序,而且只能从小到大排列
D. 表必须有序,且表只能以顺序方式存储

答案及解析:D
二分查找通过下标来定位中间位置元素,故应采用顺序存储,且二分查找能够进行的前提是查找表是有序的,但具体是从大到小还是从小到大的顺序则不做要求。

2. 在有11个元素的有序表A[1,2,…,11]中进行折半查找 (low+high)/2\lfloor (low+high)/2 \rfloor,查找元素A[11] 时,被比较的元素下标依次是( )。
A. 6, 8, 10, 11
B. 6, 9, 10, 11
C. 6, 7, 9, 11
D. 6, 8, 9, 11

答案及解析:B
依据折半查找算法的思想,当key>mid时,low = mid+1; 当key<mid时,high = mid - 1,由此可得:
第一次 mid = (1+11/2)=6\lfloor (1+11/2) \rfloor = 6
第二次 mid = (7+11/2)=9\lfloor (7+11/2) \rfloor = 9
第三次 mid = (10+11/2)=10\lfloor (10+11/2) \rfloor = 10
第四次 mid = (11+11/2)=11\lfloor (11+11/2) \rfloor = 11

3. 已知有序表(13,18,24,35,47,50,62,83,90,115,134),当二分查找值为90的元素时,查找成功的元素比较次数为( )。
A. 1
B. 2
C. 4
D. 6

答案及解析:B
本题中包含11个元素,第一次对比的元素mid为第 (1+11)/2 = 6 个元素,即50;此时,90>50,因此,low = mid+1=7,第二次对比的元素mid为 (7+11)/2 = 9 个元素,即90,等于带查询元素,完成查询。

4. 已知一个长度为16的顺序表,其元素按关键字有序排列,若采用折半查找算法查找一个不存在的元素,则比较的次数至少和至多分别是( )。
A. 3 4
B. 4 5
C. 5 6
D. 5 5

答案及解析:B

  1. 直接绘制一棵判定树进行计算
  2. 根据折半查找的规律,树高为 log2(n+1)\lceil log_2(n+1) \rceil = 5。且此时位于第5层的元素刚好只有1个。因此,由于元素不存在,因此必须完成折半查找才能判定元素不存在。所以最大比较次数即为树高5,而最小比较次数为5-1。
    注意,若要求查找成功或查找失败的平均查找长度,则需要画出判定树进行求解。此外,对长度为n的有序表,采用折半查找时,查找成功和查找失败的最多比较次数相同,均为log2(n+1)\lceil log_2(n+1) \rceil

5. 具有12个关键字的有序表中,对每个关键字的查找概率相同,折半查找算法查找成功的平均查找长度为( )。
A. 37/12
B. 35/12
C. 39/13
D. 49/13

答案及解析:A
假设有序表中元素为 A[0…11], 不难画出对它进行折半查找的判定树如下图所示,圆圈是查找成功结点,方形是虚构的查找失败结点。从而可以求出查找成功的 ASL=(1+2×2+3×4+4×5/12=37/12。 🏷️Img_Lec1702


6.【2010统考真题】已知一个长度为16的顺序表L,其元素按关键字有序排列,若采用折半查找法查找一个L中不存在的元素,则关键字的比较次数最多是( )。
A. 4
B. 5
C. 6
D. 7

答案及解析:B
根据折半查找的规律,折半查找查找不成功时的次数等于树的高度,即 log2(n+1)\lceil log_2(n+1) \rceil = 5。注意:在折半查找判定树中的方形结点是虚构的,它并不计入比较的次数中。

7.【2015统考真题】下列选项中,不能构成折半查找中关键字比较序列的是( )。
A. 500, 200, 450, 180
B. 500, 450, 200, 180
C. 180, 500, 200, 450
D. 180, 200, 500, 450

答案及解析:A
此题只需要根据关键字绘制出判定树,然后根据判定树的规则进行判断即可。根据二叉判定树的规则:左子树永远比根小,右子树永远比根大。可以得出结论,选项A是错误的。🏷️Img_Lec1703


【课堂互动17.3】分块查找

1. 采用分块查找时,数据的组织方式为( )。
A. 数据分成若干块,每块内数据有序
B. 数据分成若干块,每块内数据不必有序,但块间必须有序,每块内最大(或最小) 的数据组成索引块
C. 数据分成若干块,每块内数据有序,每块内最大(或最小)的数据组成索引块
D. 数据分成若干块,每块(除最后一块外)中数据个数需相同

答案及解析:B
本题为分块查找的定义描述,只有选项B是准确的。

2. 对有2500个记录的索引顺序表(分块表)进行查找,最理想的块长为( )。
A. 50
B. 125
C. 500
D.「log₂2500]

答案及解析:A
S为每块内部的记录个数,n/s 即块的数目,当 s=ns=\sqrt{n} 时,性能的最理想的,此时平均查找长度为 s=n+1s=\sqrt{n}+1

3. 设顺序存储的某线性表共有123个元素,按分块查找的要求等分为3块。若对索引表采用顺序查找法来确定子块,且在确定的子块中也采用顺序查找法,则在等概率情况下,分块查找成功的平均查找长度为( )。
A. 21
B. 23
C. 41
D. 62

答案及解析:B
若顺序表包含123个元素,等分成三块,每块元素个数为41。此时,平均查找长度 ASL=ASL索引表+ASL块内=(1+3)/2+(1+41)/2=23ASL = ASL_{索引表} + ASL_{块内} = (1+3)/2 + (1+41)/2 = 23

4. 为提高查找效率,对有65025个元素的有序顺序表建立索引顺序结构,在最好情况下查找到表中已有元素最多需要执行( )次关键字比较。
A. 10
B. 14
C. 16
D. 21

答案及解析:C
为提高查找效率,分块查找的块数 s=n=65025=255s = \sqrt{n} = \sqrt{65025} = 255,此时每块的元素数量也为255。在最好情况下,对索引表和块内都使用折半查找,其最多比较次数等于log2(n+1)+log2(n+1)=8+8=16\lceil log_2(n+1) \rceil + \lceil log_2(n+1) \rceil = 8+8 = 16

【扩展练习17】

1. 折半查找和二叉排序树的时间性能( )。
A. 相同
B. 有时不相同
C. 完全不同
D. 无法比较

答案及解析:B
折半查找的性能分析可以用二叉判定树来衡量,平均查找长度和最大查找长度都是O(log₂n); 二叉排序树的查找性能与数据的输入顺序有关,最好情况下的平均查找长度与折半查找相同,但最坏情况即形成单支树时,其查找长度为O(n)。

2. 具有12个关键字的有序表中,对每个关键字的查找概率相同,折半查找查找失败的平均查找长度为( )。
A. 37/12
B. 35/12
C. 39/13
D. 49/13

答案及解析:D
假设有序表中元素为 A[0…11], 不难画出对它进行折半查找的判定树如下图所示,圆圈是查找成功结点,方形是虚构的查找失败结点。从而可以求出查找失败的 ASL=(3×3+4×10)/13=49/13。注 意:对于本类题目,应先根据所给n的值,画出如上图的折半查找判定树。另外,查找失 败结点的ASL不是图中的方形结点,而是方形结点上一层的圆形结点,方形结点只是一个虚拟结点。🏷️Img_Lec1702


3. 在一个顺序存储的有序线性表上查找一个数据时,既可以采用折半查找,也可以采用顺序查找,但前者比后者的查找速度( )。
A. 必然快
B. 取决于表是递增还是递减
C. 在大部分情况下要快
D. 必然不快

答案及解析:C
折半查找的快体现在一般情况下,在大部分情况下要快,但是对于某些特殊情况,顺序查找 可能会快于折半查找。例如,查找一个含1000个元素的有序表中的第一个元素时,顺序查找的比较次数为1次,而折半查找的比较次数却将近10次。此外,党当线性表不完全有序时,折半查找可能也不如顺序查找有效。

4. 对表长为n的有序表进行折半查找,其判定树的高度为( )。
A. log2(n+1)\lceil log_2(n+1) \rceil
B. log2(n+1)1\lfloor log_2 (n+1) \rfloor - 1
C. log2n\lceil log_2 n \rceil
D. log2n1\lfloor log_2 n \rfloor - 1

答案及解析:A
对 n 个结点的判定树,设结点总数 n=2h1n=2^{h-1},则树高 h=log2(n+1)\lceil log_2(n+1) \rceil。此外,可以使用特殊值代入法。当n=1时,选项AC正确,当n=2时,仅有A满足要求。

5.【2017统考真题】下列二叉树中,可能成为折半查找判定树(不含外部结点)的是( )。 🏷️Img_Lec1701

答案及解析:A
折半查找判定树是一棵二叉平衡树。此题,可以根据结点的数量在树节点上依次填上相应的序号,然后判定其是否符合判定树的规则。🏷️Img_Lec1701B


6. 折半查找过程所对应的判定树是一棵( )。
A. 最小生成树
B. 平衡二叉树
C. 完全二叉树
D. 满二叉树

答案及解析:B
本题是一个概念题,可以直接选择选项B。此外,也可以通过分析获得答案。首先,选项A中的最小生成树是由图获得,显然错误。其次,待排序数据元素,通常不可能非常均匀地分布在中心元素的两侧,这与完全二叉树,特别是满二二叉树的定义不符,因此,选项CD也是错误的。

7.【2016统考真题】在有n(n>1000)个元素的升序数组A中查找关键字x。查找算法的伪代码如下所示。

k=0;
while(k<n 且 A[k]<x)
    k = k + 3;
if(k<n 且 A[k]==x)
    查找成功;
else if(k-1<n  且 A[k-1]==x)
    查找成功;
else if(k-2<n  且 A[k-2]==x)
    查找成功;
else
    查找失败;

本算法与折半查找算法相比,有可能具有更少比较次数的情形是( )。
A. 当 x 不在数组中
B. 当 x 接近数组开头处
C. 当 x 接近数组结尾处
D. 当 x 位于数组中间位置

答案及解析:B
本题算法的基本思想是跳跃式顺序查找,即每次移动后,比较3次。其基本原理和顺序查找类似。因此,在升序数组中,若带查询元素位于数组开头处,其效率高于折半查找,即x越靠前,查询越快。

第17讲 线性表的查找 课堂互动 隐藏答案 | 返回首页