数据结构 总结8 查找

    • 基础知识
    • 练习题
      • 二叉排序树
      • 散列表(哈希表)
        • 构造散列函数
        • 解决地址冲突

基础知识

练习题

  1. 顺序查找n个元素的顺序表,若查找成功,则比较关键字的次数最多为 ___ 次
    答案:n
  2. 顺序查找n个元素的顺序表,若查找成功,当使用监视哨时,若查找失败,则比较关键字的次数为 ___ 次
    答案:n+1
  3. 动态查找表和静态查找表的重要区别在于前者包含有插入和删除运算,而后者不包含这两种运算(√)
  4. 在任意一棵非空二叉排序树中,删除某结点后又将其插入,则所得二叉排序树与原二叉排序叉树相同(❌)
    解析:原先具有左右子树的结点,再次插入后,在二叉树中作为叶子节点存在
  5. 对一棵二叉排序树按前序方法遍历得出的结点序列是从小到大的序列(❌)
    解析:中序遍历的结果是由小到大的序列
  6. 负载因子 (装填因子)是散列表的一个重要参数,它反映散列表的装满程度(√)
  7. Hash表的平均查找长度与处理冲突的方法无关(❌)
  8. 假定有k个关键字互为同义词,若用线性探测法把这k个关键字存入散列表中,至少要进行多少次探测?
    答案: k(k+1)/2次
  9. 若采用链地址法构造散列表,散列函数为H(key)=key MOD 17,则需 ___ 个链表。这些链的链首指针构成一个指针数组,数组的下标范围为 ___
    答案:17、[0,16]
  10. 不存在特别好与坏的哈希函数,要视情况而定(√)
  11. 设有一组记录的关键字为{19,14,23,1,68,20,84,27,55,11,10,79},用链地址法构造散列表,散列函数为H(key)=key MOD 13,散列地址为1的链中有 ___ 个记录
    答案:4
  12. 二叉排序树的查找效率与二叉树的 ___ 有关,在 ___ 时其查找效率最低
    答案:树型、呈单枝树
  13. 当在一个有序的顺序存储表上查找一个数据时,即可用折半查找,也可用顺序查找,但前者比后者的查找速度
    A. 必定快
    B. 不一定
    C. 在大部分情况下要快
    D. 取决于表递增还是递减
  14. 下面关于二分查找的叙述正确的是 ( )
    A. 表必须有序,表可以顺序方式存储,也可以链表方式存储
    B. 表必须有序,而且只能从小到大排列
    C. 表必须有序且表中数据必须是整型,实型或字符型
    D. 表必须有序,且表只能以顺序方式存储
  15. 若查找每个记录的概率均等,则在具有n个记录的连续顺序文件中采用顺序查找法查找一个记录,其平均查找长度ASL为
    A. (n-1)/2
    B. n/2
    C. (n+1)/2
    D. n
  16. n个结点的二叉排序树下,查找某一关键字的时间复杂度为
    A. O(log2n)
    B. O(n)
    C. O(nlog2n)
    D. O(n2)
  17. 如果索引表长度为b,每块平均长度为L,则索引查找的平均查找长度是 ___
    答案:(b+1)/2+(L+1)/2
    解析:索引表长度为b(把顺序表分成b块)每块平均长度为L(每块有L个元素),平均查找长度 = 索引表平均查找长度 + 每块平均查找长度 = ∑ i = 1 b i + ∑ j = 1 L j \sum_{i=1}^{b}i + \sum_{j=1}^{L}j i=1bi+j=1Lj = ( b + 1 ) / 2 + ( L + 1 ) / 2 (b+1)/2+(L+1)/2 (b+1)/2+(L+1)/2
  18. 分块检索中,若索引表和各块内均用顺序查找,则有900个元素的线性表分成 ___ 块最好,若分成25块,其平均查找长度为 ___
    答案:30、31.5
    解析:分块检索中,n个元素的线性表分成 n \sqrt {n} n 块最好;900个元素分成25块,每块36个元素,则平均查找长度为 ( b + 1 ) / 2 + ( L + 1 ) / 2 (b+1)/2+(L+1)/2 (b+1)/2+(L+1)/2 = (25+36+2)/2 = 31.5
  19. n个节点的用于折半查找的判定树,表示查找失败的外部结点共有 ___ 个
    答案:n+1
    解析:n结点二叉判定树的外部节点有 2n0+n1 = n0+n1+n2+1 = n+1 个
  20. 请证明折半查找的时间复杂度为O(log2n)
    答案:2i-1代表第 i 层有几个节点,i 代表节点的层数,也代表这一层各个节点都被查找 i 次,即第 i 层各个节点的查找次数都相同(i 次),这样的节点有 2i-1
    推导过程:
    当 n 很大时,可近似为log2(n+1)-1
    其中 1*20+2*21+3*22+…+j*2j-1的求法如下:
    设 S = 1*20 + 2*21 + 3*22 + … + j*2j-1,则 2S = 1*21 + 2*22 + 3*23 + … + (j-1)*2j-1 + j*2j,则 2S - S = - (20+21+22+…+2j-1) + j*2j,即 S = - (2j-1) + j*2j,代入化简即可

二叉排序树

散列表(哈希表)

元素存储位置 p 与 关键字 key 建立对应关系 H,使得 p = H(key),H为散列函数

构造散列函数

  1. 直接定址法:H(key) = a * key + b
    地址集合大小 == 关键字集合大小
  2. 数字分析法
    能预先估计出全体关键字的每一位上各种数字出现的频度
  3. 平方取中法
    关键字中每一位都有某些数字重复出现频度很高
  4. 折叠法
    关键字的数字位数特别多
  5. 除留余数法:H(key) = key MOD p
    其中 p ≤ length(表长) 并且 p 应该为 不大于 length 的素数
  6. 随机数法

解决地址冲突

  • 开放定址法
    当关键字 key 的散列地址 p= H(key)出现冲突时,以 p 为基础,产生另一个散列地址 p1,如果 p1仍然冲突,再以 p 为基础,产生另一个散列地址 p2… 直到找到不冲突的地址
    H = ( H ( k e y ) + d i ) % m , i = 1 , 2 , . . . , n H = (H(key)+d_{i})\%m,i = 1,2,...,n H=(H(key)+di)%mi=1,2,...,n

    1. 线性探测 di = 1,2,3,…,length-1
      发生冲突后,顺序查看散列表中下一单元,直到找出空单元或查遍全表
    2. 二次探测 di = ±12,±22,±32,…,±k2 (k ≤m/2)
      发生冲突后,在表的左右进行跳跃式探测,比较灵活
    3. 伪随机探测
  • 链地址法:将所有散列地址为 i 的元素构成一个称为同义词链的单链表,并将单链表的头指针存在散列表的第 i 个单元中,因而查找、插入和删除主要在同义词链中进行

  • 公共溢出区:将散列表分为基本表和溢出表,产生冲突的元素一律填入溢出表

你可能感兴趣的:(数据结构,笔记,数据结构,算法)