2010年第9题
已知一个长度为 16 的顺序表 L,其元素按关键字有序排列。若采用折半查找法查找一个 L 中不存在的元素,则关键字的比较次数最多的是( )
A. 4 \qquad B. 5 \qquad C. 6 \qquad D. 7
解析
本题主要考查折半查找(二分查找)中的判定树模型以及查找过程中的比较次数。
-
折半查找(二分查找)算法:
- 折半查找是一种在有序顺序表中查找特定元素的算法。它通过将目标关键字与顺序表中间元素的关键字比较,根据比较结果将查找范围缩小到左半部分或右半部分,重复此过程直到找到目标或确定目标不存在。
- 算法过程:
- 初始化查找范围:设
low = 1
(或low = 0
,取决于索引起始,但结果相同),high = n
(n 为表长)。 - 循环条件:
while low <= high
。 - 计算中间位置:
mid = (low + high) // 2
(整数除法,向下取整)。 - 比较目标关键字与
L[mid]
的关键字:- 若相等,查找成功。
- 若目标小于
L[mid]
,则high = mid - 1
。 - 若目标大于
L[mid]
,则low = mid + 1
。
- 重复直到
low > high
,此时查找失败。
- 初始化查找范围:设
- 特点:每次比较将查找范围减半,因此算法效率较高,时间复杂度为 O ( log 2 n ) O(\log_2n) O(log2n)。
-
判定树:
- 折半查找过程可以建模为一棵二叉决策树,即判定树,如下图所示:
如果查找成功,则停留在“圆圈”结点,即顺序表中存在的关键词;如果查找失败,则停留在“方形”结点。
-
对于长度 n 的顺序表,判定树有 n 个内部结点(查找成功时停留的结点)和 n+1 个外部结点(查找失败时停留的结点,对应 n+1 个可能失败区间:小于最小值、大于最大值、元素之间)。
-
具有 n n n 个内部结点(圆圈表示,即顺序表的长度为 n n n)的判定树的高度为 ⌊ log 2 n ⌋ + 1 \lfloor\log_2n\rfloor+1 ⌊log2n⌋+1 。
-
最坏情况时间复杂度与比较次数:
- 比较次数:指算法中目标关键字与顺序表元素关键字进行比较的总次数。本题关注“关键字的比较次数”,即元素关键字与目标关键字的比较。
- 最坏情况:当目标元素不存在时,算法需要尽可能多的比较次数才能确定失败。对于长度为 n 的顺序表,最坏情况比较次数取决于查找过程的最大深度。最坏情况比较次数为 ⌊ log 2 n ⌋ + 1 \lfloor \log_2 n \rfloor + 1 ⌊log2n⌋+1,即将某条路径上的所有内部结点对应的顺序表中元素都比较了一遍,也没有找到该目标元素。最终停留在外部结点(方形结点,但不需要跟方形结点中的元素比较)
对于本题,顺序表的长度为 16 ,即 n = 16 n=16 n=16 。根据前述 分析可知,由这些元素构成的判定树高度是 ⌊ log 2 16 ⌋ + 1 = 4 + 1 = 5 \lfloor\log_2 16\rfloor+1 = 4+1=5 ⌊log216⌋+1=4+1=5,所以,当查找失败时,关键字最多比较次数是 5。
本题答案:B