知识大全 数据结构第九章(查找)习题参考答案

Posted 结点

篇首语:从来没有说忘就忘这回事,只有假装的冷漠和偷偷想念的心。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 数据结构第九章(查找)习题参考答案相关的知识,希望对你有一定的参考价值。

  一 基础知识题

   对含有n个互不相同元素的集合 同时找最大元和最小元至少需进行多少次比较?

  答 我们可以设立两个变量max和min用于存放最大元和最小元(的位置) 第一次取两个元素进行比较 大的放入max 小的放入min 从第 次开始 每次取一个元素先和max比较 如果大于max则以它替换max 并结束本次比较;若小于max则再与min相比较 在最好的情况下 一路比较下去都不用和min相比较 所以这种情况下 至少要进行n 次比较就能找到最大元和最小元 (顺便说一下 最坏情况下 要进行 n 次比较才能得到结果)

   若对具有n个元素的有序的顺序表和无序的顺序表分别进行顺序查找 试在下述两种情况下分别讨论两者在等概率时的平均查找长度 ( )查找不成功 即表中无关键字等于给定值K的记录;( )查找成功 即表中有关键字等于给定值K的记录

  答 查找不成功时 需进行n+ 次比较才能确定查找失败 因此平均查找长度为n+ 这时有序表和无序表是一样的

  查找成功时 平均查找长度为(n+ )/ 有序表和无序表也是一样的 因为顺序查找对表的原始序列的有序性不感兴趣

   画出对长度为 的有序的顺序表进行二分查找的判定树 并指出在等概率时查找成功的平均查找长度 以及查找失败时所需的最多的关键字比较次数

  答 请看题图

  等概率情况下 查找成功的平均查找长度为

  ASL=( + * + * + * + * )/ =

  也可以用公式代 大约为 ASL=( + )lg( + )/ =

  查找失败时 最多的关键字比较次树不超过判定树的深度 此处为 如图

   为什么有序的单链表不能进行折半查找?

  答 因为链表无法进行随机访问 如果要访问链表的中间结点 就必须先从头结点开始进行依次访问 这就要浪费很多时间 还不如进行顺序查找 而且 用链存储结构将无法判定二分的过程是否结束 因此无法用链表实现二分查找

   设有序表为(a b c e f g i j k p q) 请分别画出对给定值b g和n进行折半查找的过程

  解 b的查找过程如下(其中括号表示当前查找区间 圆括号表示当前比较的关键字)

  下标

  第一次比较 [a b c d e f (g) h i j k p q]

  第二次比较 [a b (c)d e f] g h i j k p q

  第三次比较 [a(b)]c d e f g h i j k p q

  经过三次比较 查找成功

  g的查找过程如下

  [a b c d e f (g) h i j k p q]

  一次比较成功

  n的查找过程如下

  下标

  第一次比较 [a b c d e f (g) h i j k p q]

  第二次比较 a b c d e f g [h i (j) k p q]

  第三次比较 a b c d e f g h i j [k (p) q]

  第四次比较 a b c d e f g h i j [k] p q]

  经过四次比较 查找失败

   将(for case while class protected virtual public private do template const if int)中的关键字依次插入初态为空的二叉排序树中 请画出所得到的树T 然后画出删去for之后的二叉排序树T 若再将for 插入T 中得到的二叉排序树T 是否与T相同?最后给出T 的先序 中序和后序序列

  答 见题图:

  T 的先序序列是 do case class const while protected private if for int virtual public template

  T 的中序序列是 case class const do for if int private protected public template virtual while

  T 的后序序列是 const class case for int if private template public virtual protected while do

  二叉排序树T如下图

  删去for后的二叉排序树如下图 圈内的for表示再插入后的结点

   对给定的关键字集合 以不同的次序插入初始为空的树中 是否有可能得到同一棵二叉排序树?

  答 有可能 如有两个序列 和 它们插入空树所得的二叉排序树是相同的

   将二叉排序树T的先序序列中的关键字依次插入一空树中 所得和二叉排序树T 与T 是否相同?为什么?

  答 这两棵二叉树完全相同

   设二叉排序树中关键字由 至 的整数构成 现要查找关键字为 的结点 下述关键字序列哪一个不可能是在二叉排序树上查找到的序列?

  (a) ;

  (b) ;

  (c) ;

  (d)

  答 (c)是不可能查找到的序列 我们可以把这四个序列各插入到一个初始为空的二叉排序树中 结果可以发现 (c)序列所形成的不是一条路径 而是有分支的 可见它是不可能在查找过程中访问到的序列

   设二叉排序树中关键字互不相同 则其中最小元必无左孩子 最大元必无右孩子 此命题是否正确?最小元和最大元一定是叶子吗?一个新结点总是插在二叉排序树的某叶子上吗?

  答 此命题正确 假设最小元有左孩子 则根据二叉排序树性质 此左孩子应比最小元更小 如此一来就产生矛盾了 因此最小元不可能有左孩子 对于最大元也是这个道理

  但最大元和最小元不一定是叶子 它也可以是根 内部结点(分支结点)等 这得根据插入结点时的次序而定 如 这个集合 根据不同的插入次序可以得到不同的二叉排序树

  ○

  / \\

  ○ ○

  \\

  ○

  ○

  / \\

  ○ ○

  \\

  ○

  ○

  \\

  ○

  \\

  ○

  \\

  ○

  ○

  / \\

  ○ ○

  /

  ○

  新结点总是插入在二叉排序树的某个叶子上的

   在一棵m阶的B 树中 当将一关键字插入某结点而引起该结点的分裂时 此结点原有多少个关键字?若删去某结点中的一个关键字 而导致结点合并时 该结点中原有几个关键字?

  答 在此树中 若由于一关键字的插入某结点而引起该结点的分裂时 则该结点原有m 个关键字

  若删去某结点中一个关键字而导致结点合并时 该结点中原有┌m/ ┐ 个关键字

   在一棵B 树中 空指针数总是比关键字数多一个 此说法是否正确?请问包含 个关键字的 阶B 树(即 树)最多有几个结点?最少有几个结点?画出这两种情况的B 树

  答 这个说法是正确的

  包含 个关键字的 阶B 树最多有 个结点 最少有 个结点

  见题图 :图如下

   在含有n个关键字的m阶B 树中进行查找 至多读盘多少次?完全平衡的二叉排序树的读盘次数大约比它大多少倍?

  答 在含有n个关键字的m阶B 树中进行查找至多读盘次数不超过B 树高h 即logt((n+ )/ )+ (注 此处t为底 值是除根外的每个内部结点的最小度数┌m/ ┐)

  完全平衡的二叉树高为lgn 所以它的读盘次数至多也是lgn 它与上述B 树的读盘次数的比值约为lgt倍(此处底是 )

   为什么在内存中使用的B 树通常是 阶的 而不使用更高阶的B 树?

  答 因为查找等操作的cpu时间在B 树上是O(lgn·(m/lgt)) 而m/lgt> 所以m较大时它所费时间比平衡的二叉排序树上相应操作时间大得多 因此 仅在内存中使用的B 树通常取最小值

   为什么二叉排序树长高时 新结点总是一个叶子 而B 树长高时 新结点总是根?哪一种长高能保证树平衡?

  答 因为在二叉排序树中 关键字总是作为一个叶子结点插入以原来的树中 所以当树增高时 新结点总是一个叶子;而B 树中关键字插入总是插入到叶子结点内部 在叶结点中的关键字数目尚未超过它能够容纳的数目之前是不会增加结点的 当关键字数超过结点可容纳的数目时 叶结点就会发生分裂 产生一个新结点(但不一定引起树增高) 并且将其中的中间结点传至上一层 只有当这种分裂操作传递至根结点并引起根结点的分裂时 才能引起树高增加 此时产生一个新的根结点 所以说B树长高时 新结点总是根

  显然 后一种长高总能保证树的平衡

   已知关键字序列为(PAL LAP PAM MAP PAT PET SET SAT TAT BAT)试为它们设计一个散列函数 将其映射到区间[ n ]上 要求碰撞尽可能的少 这里n=

  解 我的设计的散列函数是这样的 把关键字串中的每一个字符按其所在位置分别将其ASCII值乘以一个不同的数 然后把这些值相加的和去对n求余 余数即为散列表中的位置 函数如下

  int Hash (char key[])

  

  return (int)(key[ ]+key[ ]* +key[ ]* )%n;

  

  我们可以设计一个程序来看看用这个散列函数得到的所有关键字映射到区间的位置

  #include

  #define n file://先 用 来代入 我们可以用 依次代入验证

  int Hash (char key[])

  

  return (int)(key[ ]+key[ ]* +key[ ]* )%n;

  file://此 处我用了系数 和 你也可以用其他的数代入看有没有更好的系数

  

  void main()

  

  char s[ ][ ]= PAL LAP PAM MAP PAT PET SET SAT TAT BAT ;

相关参考

知识大全 数据结构考研分类复习真题 第九章 答案[19]

  .  ()  ()查找关键字H(k)=MOD=依次与比较  ()查找关键字H(k)=MOD=散列地址内为空查找失败  ()ASLsucc=/ cha138/Article/pr

知识大全 数据结构考研分类复习真题 第九章 答案[9]

  .由于装填因子为关键字有个所以表长为/=  ()用除留余数法哈希函数为H(key)=key%  ()  ()计算查找失败时的平均查找长度必须计算不在表中的关键字当其哈希地址为i(≤i≤m)时的查找

知识大全 数据结构考研分类复习真题 第九章 答案[13]

  .()    值得指出对用拉链法求查找失败时的平均查找长度有两种观点其一认为比较到空指针算失败以本题为例哈希地址和均为比较次失败而哈希地址和比较次失败其余哈希地址均为比较次失败因此查找失败时的平均

知识大全 数据结构考研分类复习真题 第九章 集合[5]

  对大小均为n的有序表和无序表分别进行顺序查找在等概率查找的情况下对于查找失败它们的平均查找长度是(())对于查找成功他们的平均查找长度是(())供选择的答案:【上海海运学院二(分)】  A相同的&

知识大全 数据结构复习总结第九章查找

  第九章查找  *************************************************************************************  查找的同

知识大全 数据结构考研分类复习真题 第九章 答案[16]

  .  .查找时对关键字各比较一次对各比较两次 cha138/Article/program/sjjg/201311/22819

知识大全 数据结据第九章(查找)串讲+复习要点

  本章介绍了线性表树和散列表的查找方法算法实现以及各种查找方法的时间性能分析重点是顺序查找二分查找二叉树查找以及散列表上查找的基本思想和算法实现  一基本概念(识记)  查找的同时对表做修改操作(如

知识大全 数据结构考研分类复习真题 第九章 答案[4]

  .k(k+)/  .(块内顺序查找)  .()顺序存储或链式存储 ()顺序存储且有序()块内顺序存储块间有序()散列存储  .(n+)/  .(n+)/n*log(n+)  .结点的左子

知识大全 数据结构考研分类复习真题 第九章 集合[1]

  第九章 集合  一选择题  若查找每个记录的概率均等则在具有n个记录的连续顺序文件中采用顺序查找法查找一个记录其平均查找长度ASL为(   )【北京航空航天

知识大全 数据结构考研分类复习真题 第九章 答案[8]

  .评价哈希函数优劣的因素有能否将关键字均匀影射到哈希空间上有无好的解决冲突的方法计算哈希函数是否简单高效由于哈希函数是压缩映像冲突难以避免解决冲突的方法见上面题  .哈希方法的平均查找路长主要取决