1. 设置哨兵可以在数量级上提高顺序查找的时间性能,这个说法是否正确()。

  • A. 正确
  • B. 错误

答案:B. 错误

解析: 设置哨兵可以优化顺序查找,通过将循环内部的两个判断(一个判断是否越界,一个判断是否相等)减少到一个判断,从而提高效率。但这只是优化了常数时间,其时间复杂度仍然是O(n),并未在数量级上(例如从O(n)到O(log n))提高性能。

2. 假设数组元素升序排列,采用折半查找技术,将待查值k与区间[low, high]的中间元素相比,若k的值较小,则修改语句是( )。

  • A. low = mid
  • B. low = mid + 1
  • C. high = mid
  • D. high = mid - 1

答案:D. high = mid - 1

解析: 在升序排列的数组中进行折半查找,当待查值k小于中间元素 A[mid] 时,说明k若存在,必定在区间的左半部分 [low, mid-1] 中。因此,需要将查找区间的上界 high 修改为 mid - 1 以缩小查找范围。

3. 具有13个结点的折半查找判定树,第4层有()个结点。

  • A. 4
  • B. 5
  • C. 6
  • D. 7

答案:C. 6

解析: 折半查找的判定树是一棵形态上接近完全二叉树的二叉排序树。

  • 第1层有 21−1=1 个结点。
  • 第2层有 22−1=2 个结点。
  • 第3层有 23−1=4 个结点。
  • 前3层共有 1 + 2 + 4 = 7 个结点。
  • 总共有13个结点,所以剩下的 13 - 7 = 6 个结点位于第4层。

4. 折半查找的平均时间复杂度是()。

  • A. O(1)
  • B. O(n)
  • C. O(log₂n)
  • D. O(nlog₂n)

答案:C. O(log₂n)

解析: 折半查找(或称二分查找)的核心思想是每次将查找范围缩小一半。这种分治策略导致其查找次数与元素总数n的关系是对数级别的。因此,其平均时间复杂度和最坏情况下的时间复杂度都是O(log₂n)。

5. 若二叉排序树中关键码互不相同,则其中最小元素和最大元素一定是叶子结点,这个说法是否正确()。

  • A. 正确
  • B. 错误

答案:B. 错误

解析: 在二叉排序树中,最小元素是没有左子树的结点,但它可能有右子树。同理,最大元素是没有右子树的结点,但它可能有左子树。只有当最小元素的结点没有右子树,或最大元素的结点没有左子树时,它们才是叶子结点。所以这个说法不是绝对正确的。

6. 在闭散列表中有可能出现堆积,开散列表一定不会出现堆积,这个说法是否正确()。

  • A. 正确
  • B. 错误

答案:A. 正确

解析: “堆积”或“聚集”是指在散列表中,哈希到不同地址的元素,因冲突解决策略而竞争同一个后续空闲位置的现象。

  • 闭散列(开放地址法)如线性探测,当发生冲突时会探查下一个地址,这很容易导致关键字连成一片,形成堆积。
  • 开散列(链地址法)为每个哈希地址维护一个独立的链表,所有冲突的元素都放入同一个链表。不同哈希地址的冲突互不影响,因此不会产生堆积现象。

7. 静态查找与动态查找的根本区别在于()。

  • A. 它们的逻辑结构不一样
  • B. 施加在其上的操作不同
  • C. 数据元素的类型不一样
  • D. 存储实现不一样

答案:B. 施加在其上的操作不同

解析:

  • 静态查找表:数据集合是固定的,只进行查找操作。
  • 动态查找表:在查找过程中,还会涉及插入和删除元素的操作,数据集合是动态变化的。 因此,两者最根本的区别在于所支持的操作集合不同。

8. 能够有效实现动态查找的数据结构是()。

  • A. 有序表
  • B. 双链表
  • C. 循环链表
  • D. 二叉查找树

答案:D. 二叉查找树

解析: 动态查找要求数据结构能高效地支持查找、插入和删除。

  • 二叉查找树(及其平衡变种如AVL树、红黑树)在平均情况下的查找、插入、删除操作的时间复杂度都是O(log n),效率很高。
  • 有序表插入删除慢(O(n)),链表查找慢(O(n)),都不适合作为高效的动态查找结构。

9. 假定查找成功与不成功的可能性相同,在查找成功的情况下每个记录的查找概率相同,则顺序查找的平均查找长度为()。

  • A. 0.5(n+1)
  • B. 0.25(n+1)
  • C. 0.5(n-1)
  • D. 0.75n+0.25

答案:D. 0.75n+0.25

解析:

  1. 查找成功的平均查找长度 (ASL_succ):每个元素被查到的概率是1/n,查找第i个元素需要比较i次。所以 ASL_succ = (1+2+…+n)/n = (n(n+1)/2)/n = (n+1)/2。
  2. 查找不成功的平均查找长度 (ASL_unsucc):当查找不成功时,需要与所有n个元素都比较一遍才能确定,所以 ASL_unsucc = n。
  3. 综合平均查找长度 (ASL):题目假定成功和不成功的概率各为0.5。 ASL = P(成功) × ASL_succ + P(不成功) × ASL_unsucc ASL = 0.5 × ((n+1)/2) + 0.5 × n = (n+1)/4 + 2n/4 = (3n+1)/4 = 0.75n + 0.25。

10. 对具有14个元素的有序表R[14]进行折半查找,查找R[3]时比较需要比较()。

  • A. R[0] R[1] R[2] R[3]
  • B. R[6] R[2] R[4] R[3]
  • C. R[0] R[13] R[2] R[3]
  • D. R[6] R[4] R[2] R[3]

答案:B. R[6] R[2] R[4] R[3]

解析: 对有序表 R[0…13] 进行折半查找,目标是R[3]的值。

  1. low=0, high=13, mid = (0+13)//2 = 6。比较R[3]和R[6]。因为表有序,R[3] < R[6],所以查找范围变为左半部分。
  2. low=0, high=5, mid = (0+5)//2 = 2。比较R[3]和R[2]。R[3] > R[2],查找范围变为右半部分。
  3. low=3, high=5, mid = (3+5)//2 = 4。比较R[3]和R[4]。R[3] < R[4],查找范围变为左半部分。
  4. low=3, high=3, mid = (3+3)//2 = 3。比较R[3]和R[3]。找到。 依次比较的元素下标是6, 2, 4, 3。

11. 已知10个元素(54, 28, 16, 73, 62, 95, 60, 26, 43),按照依次插入的方法生成一棵二叉查找树,查找值为62的结点所需比较次数为()。

  • A. 2
  • B. 3
  • C. 4
  • D. 5

答案:B. 3

解析: 构造二叉查找树并查找62的过程如下:

  1. 插入54作为根。
  2. 插入28 (<54),成为54的左孩子。
  3. 插入16 (<28),成为28的左孩子。
  4. 插入73 (>54),成为54的右孩子。
  5. 插入62 (>54, <73),成为73的左孩子。 …后续插入不影响查找62的路径。 查找62:
  6. 与根结点54比较,62 > 54,查找右子树。(第1次比较)
  7. 与结点73比较,62 < 73,查找左子树。(第2次比较)
  8. 与结点62比较,找到该结点。(第3次比较) 共需比较3次。

12. 已知数据序列为 {34, 76, 45, 18, 26, 54, 92, 65},按照依次插入结点的方法生成一棵二叉查找树,该树的深度为()。

  • A. 5
  • B. 6
  • C. 7
  • D. 8

答案:A. 5

解析: 依次插入结点构造二叉查找树,并记录每个结点的深度(根为1):

  • 34 (深度1)
  • 76 (>34) -> 右孩子 (深度2)
  • 45 (<76) -> 左孩子 (深度3)
  • 18 (<34) -> 左孩子 (深度2)
  • 26 (>18) -> 右孩子 (深度3)
  • 54 (>45) -> 右孩子 (深度4)
  • 92 (>76) -> 右孩子 (深度3)
  • 65 (>54) -> 右孩子 (深度5) 最长的路径是 34 -> 76 -> 45 -> 54 -> 65,包含了5个结点,因此树的深度为5。

13. 在二叉查找树上查找关键码为28的结点(假设存在),则依次比较的关键码有可能是()。

  • A. 30, 36, 28
  • B. 38, 48, 28
  • C. 48, 18, 38, 28
  • D. 60, 30, 50, 40, 38, 36

答案:C. 48, 18, 38, 28

解析: 在二叉查找树中查找必须遵循“小则向左,大则向右”的规则。

  • 选项A:28<30应向左,但下一个是36,不符。
  • 选项B:28<38应向左,但下一个是48,不符。
  • 选项C:比较48 (28<48,向左) -> 比较18 (28>18,向右) -> 比较38 (28<38,向左) -> 比较28 (找到)。此路径完全符合规则。
  • 选项D:比较60 (28<60,向左) -> 比较30 (28<30,应向左),但下一个是50,不符。

14. 设散列表表长m=14,散列函数H(k) = k mod 11。表中已有15、38、61、84四个元素,用线性探测法处理冲突,则元素49的存储地址是()。

  • A. 8
  • B. 3
  • C. 5
  • D. 9

答案:A. 8

解析:

  1. 先确定已存在元素的地址(表下标0-13):
    • H(15) = 15 mod 11 = 4. T[4] = 15
    • H(38) = 38 mod 11 = 5. T[5] = 38
    • H(61) = 61 mod 11 = 6. T[6] = 61
    • H(84) = 84 mod 11 = 7. T[7] = 84
  2. 插入元素49:
    • H(49) = 49 mod 11 = 5。
    • 地址5被占用(冲突)。线性探测下一个地址:(5+1)%14 = 6。
    • 地址6被占用(冲突)。线性探测下一个地址:(6+1)%14 = 7。
    • 地址7被占用(冲突)。线性探测下一个地址:(7+1)%14 = 8。
    • 地址8为空,存入49。所以地址是8。

15. 为一组关键码(87, 73, 25, 55, 90, 28, 31, 17, 101, 22, 3, 62)构造散列表,设散列函数为H(key) = key mod 11,在用链地址法处理后位于同一链表中的是()。

  • A. 81, 90
  • B. 31, 101
  • C. 3, 78
  • D. 62, 73

答案:D. 62, 73

解析: 链地址法将哈希地址相同的关键字放在同一个链表中。我们只需计算选项中哪一组关键码的 mod 11 余数相同即可。

  • A. H(81)=4, H(90)=2
  • B. H(31)=9, H(101)=2
  • C. H(3)=3, H(78)=1
  • D. H(62) = 62 mod 11 = 7, H(73) = 73 mod 11 = 7。两者哈希值相同。 因此,62和73会位于同一个链表中。

本站由 Lynn 使用 Stellar 1.30.0 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。