`

查找的一些练习题

阅读更多
1.对含有n个互不相同元素的集合,同时找最大元和最小元至少需进行多少次比较?
答:
  设变量max和min用于存放最大元和最小元(的位置),第一次取两个元素进行比较,大的放入max,小的放入min。从第2次开始,每次取一个元素先和max比较,如果大于max则以它替换max,并结束本次比较;若小于max则再与min相比较,在最好的情况下,一路比较下去都不用和min相比较,所以这种情况下,至少要进行n-1次比较就能找到最大元和最小元。
2.若对具有n个元素的有序的顺序表和无序的顺序表分别进行顺序查找,试在下述两种情况下分别讨论两者在等概率时的平均查找长度:
 (1)查找不成功,即表中无关键字等于给定值K的记录;
 (2)查找成功,即表中有关键字等于给定值K的记录。
答:
  查找不成功时,需进行n+1次比较才能确定查找失败。因此平均查找长度为n+1,这时有序表和无序表是一样的。
  查找成功时,平均查找长度为(n+1)/2,有序表和无序表也是一样的。因为顺序查找与表的初始序列状态无关。
3.画出对长度为18的有序的顺序表进行二分查找的判定树,并指出在等概率时查找成功的平均查找长度,以及查找失败时所需的最多的关键字比较次数。

答:
      
  等概率情况下,查找成功的平均查找长度为:
    ASL=(1+2*2+3*4+4*8+5*3)/18=3.556
  查找失败时,最多的关键字比较次树不超过判定树的深度,此处为5.
4.为什么有序的单链表不能进行折半查找?

答:
  因为链表无法进行随机访问,如果要访问链表的中间结点,就必须先从头结点开始进行依次访问,这就要浪费很多时间,还不如进行顺序查找,而且,用链存储结构将无法判定二分的过程是否结束,因此无法用链表实现二分查找。
5.设有序表为(a,b,c,e,f,g,i,j,k,p,q),请分别画出对给定值b,g和n进行折半查找的过程。
解:
 (1)查找b的过程如下(其中方括号表示当前查找区间,圆括号表示当前比较的关键字)

      下标:  1  2  3  4  5  6   7   8  9 10 11 12 13
   第一次比较: [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
   经过三次比较,查找成功。

  (2)g的查找过程如下:
      [a b c d e f (g) h i j k p q]
     一次比较成功。

  (3)n的查找过程如下:
         下标:  1  2  3  4  5  6  7   8  9 10 11 12  13
     第一次比较: [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]
   经过四次比较,查找失败。
6.将(for, case, while, class, protected, virtual, public, private, do, template, const ,if, int)中的关键字依次插入初态为空的二叉排序树中,请画出所得到的树T。然后画出删去for之后的二叉排序树T',若再将for 插入T'中得到的二叉排序树T''是否与T相同?最后给出T"的先序、中序和后序序列。
答:
  二叉排序树T如下图:
         
 
  删去for后的二叉排序树如下图:
  
  再插入结点for后的二叉排序树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
7.对给定的关键字集合,以不同的次序插入初始为空的树中,是否有可能得到同一棵二叉排序树?
答:
    有可能。如有两个序列:3,1,2,4 和 3,4,1,2,它们插入空树所得的二叉排序树是相同的。
8.将二叉排序树T的先序序列中的关键字依次插入一空树中,所得和二叉排序树T'与T否相同?为什么?
答:
    这两棵二叉树完全相同。
9.设二叉排序树中关键字由1至1000的整数构成,现要查找关键字为363的结点,下述关键字序列哪一个不可能是在二叉排序树上查找到的序列?
 (a) 2,252,401,398,330, 344,397,363;
 (b) 924, 220, 911, 244, 898, 258, 362, 363;
 (c) 925, 202, 911, 240, 912, 245, 363;
 (d) 2, 399, 387, 219, 266, 382, 381, 278, 363.

答:
  (c)是不可能查找到的序列。把这四个序列各插入到一个初始为空的二叉排序树中,结果可以发现,(c)序列所形成的不是一条路径,而是有分支的,可见它是不可能在查找过程中访问到的序列。
10.设二叉排序树中关键字互不相同,则其中最小元必无左孩子,最大元必无右孩子。此命题是否正确?最小元和最大元一定是叶子吗?一个新结点总是插在二叉排序树的某叶子上吗?
答:
  此命题正确。假设最小元有左孩子,则根据二叉排序树性质,此左孩子应比最小元更小,如此一来就产生矛盾了,因此最小元不可能有左孩子,对于最大元也是这个道理。
  但最大元和最小元不一定是叶子,它也可以是根、内部结点(分支结点)等,这得根据插入结点时的次序而定。
  新结点总是作为叶子插入在二叉排序树中的。
11.在一棵m阶的B-树中,当将一关键字插入某结点而引起该结点的分裂时,此结点原有多少个关键字?若删去某结点中的一个关键字,而导致结点合并时,该结点中原有几个关键字?
答:
  在一棵m阶的B-树中,若由于一关键字的插入某结点而引起该结点的分裂时,则该结点原有m-1个关键字。
  若删去某结点中一个关键字而导致结点合并时,该结点中原有┌m/2┐-1个关键字。
12.在一棵B-树中,空指针数总是比关键字数多一个,此说法是否正确?请问包含8个关键字的3阶B-树(即2-3树)最多有几个结点?最少有几个结点?画出这两种情况的B-树。
答:
  这个说法是正确的。包含8个关键字的3阶B-树最多有7个结点,最少有4个结点。
      
13.从空树开始,依次输入20,30,50,52,60,68,70,画出建立2-3树的过程。并画出删除50和68后的B-树状态。
答:过程如下:
 (1) 插入20,30:

   
  (2) 插入50:
   
 (3) 插入52:
   

 (4) 插入60:
   

 (5) 插入68:
   

 (6) 插入70:
   
 (7)删去50:
   
 (8) 删去68
   

14.画出依次插入z,v,o,p,w,y到图9.12(h)所示的5阶B-树的过程。
  

解:
  数据结构网站/数据结构参考网站/第九章查找答案.files/9141.gif">(1)插入z后:

 (2)插入v,o后
  
 (3)插入 p,w,y后
  
16.为什么在内存中使用的B-树通常是3阶的,而不使用更高阶的B-树?
答:
    因为查找等操作的cpu时间在B-树上是O(lgn·(m/lgt)),而m/lgt>1,所以m较大时它所费时间比平衡的二叉排序树上相应操作时间大得多,因此,仅在内存中使用的B-树通常取最小值3
17.为什么二叉排序树长高时,新结点总是一个叶子,而B-树长高时,新结点总是根?哪一种长高能保证树平衡?
答:
    因为在二叉排序树中,关键字总是作为一个叶子结点插入以原来的树中,所以当树增高时,新结点总是一个叶子;而B-树中关键字插入总是插入到叶子结点内部,在叶结点中的关键字数目尚未超过它能够容纳的数目之前是不会增加结点的,当关键字数超过结点可容纳的数目时,叶结点就会发生分裂,产生一个新结点(但不一定引起树增高),并且将其中的中间结点传至上一层,只有当这种分裂操作传递至根结点并引起根结点的分裂时,才能引起树高增加,此时产生一个新的根结点。所以说B树长高时,新结点总是根。
    显然,后一种长高总能保证树的平衡。
19.对于一组给定的、固定不变的关键字序列,有可能设计出无冲突的散列函数H,此时称H为完备的散列函数(perfect hashing function),若H能无冲突地将关键字完全填满散列表,则称H是最小完备(minimal perfect)的散列函数。通常找完备的散列函数非常困难,找最小完备的散列函数就更困难。请问:
  (1)若h是已知关键字集合K的完备的散列函数,若要增加一个新的关键字到集合K,一般情况下H还是完备的吗?
 (2)已知关键字集合为(81,129,301,38,434,216,412,487,234),散列函数为H(x)=(x+18)/63,请问H是完备的吗?它是最小完备的吗?
 (3)考虑由字符串构成的关键字集合(Bret,Jane,Shirley,Bryce,Michelle,Heather),试为散列表[0..6]设计一个完备的散列函数。(提示:考虑每个字符串的第3个字符,即s[2])
答:
 (1) 一般情况下H不是完备的,如果说插入一个新的关键字它还是完备的,那么再插入一个呢?它岂不是永远是完备的散列函数了? 所以一般情况下它不能总是完备的,只有一些很少的情况下它还可能是完备的。
 (2)这个H是完备的,其函数值依次为:1,2,5,0,7,3,6,8,4。如果散列表长m=9时,它就是最小完备的。
 (3) 这个函数如下:
   int Hash (char key[])
     { return key[2]%7;}
20.设散列函数为h(key)=key%101,解决冲突的方法为线性探查,表中用"-1"表示空单元。若删去散列表HT中的304(即令HT[1]=-1)之后,在表HT中查找707将会发生什么?若将删去的表项标记为"-2",查找时探查到-2继续向前搜索,探查到-1时终止搜索。请问用这种方法删304后能否正确地查找到707?

   0   1   2   3             100
  ┌──┬──┬──┬──┬───────────┬─┐
 HT│202 │304 │507 │707 │   ......       │ │
  └──┴──┴──┴──┴───────────┴─┘

答:
    查找707时,首先根据散列函数计算得出该元素应在散列表中的0单元,但是在0单元没有找到,因此将向下一单元探查,结果发现该单元是-1(为空单元),所以结束查找,这将导致707无法找到。
    如果改用"-2"作为删除标记,则可以正确找到707所在的结点。
分享到:
评论

相关推荐

    数据结构(查找)习题及答案

    1、顺序查找法等概率下查找成功时的平均查找长度为(),查找不成功时的比较次数为()。 2、对线性表进行折半查找时,要求线性表必须()。 3、设哈希表L长m=14,哈希函数H(key)=key%11,表中已...... ...........

    第9章(查找)-练习题.doc

    第9章(查找)-练习题

    二叉查找树练习

    findwords查找文件是否有某单词,这是一个二叉查找树的练习

    数据库关系代数练习习题.docx

    数据库关系代数练习习题.docx

    数据结构--折半查找

    数据结构习题---折半查找代码 void BinInsert(int A[],int &n,int item) { int j,low=1,high=n,mid; while(low) { /* 利用折半查找法查找合适位置*/ mid=(low+high)/2; /* 计算当前查找部分的中间位置*/ if...

    数据结构练习(含答案):第八章查找.doc

    数据结构练习(含答案):第八章查找.doc

    数据结构书面作业练习题

    数据结构书面作业练习题 内 容 简 介 在习题部分,既有选择题、判断题,也有用图表解答的练习题、算法设计题或综合解答分析题。并且配有部分练习题的答案供学生自学、练习、参考。

    SQL操作练习题(55题)

    55题SQL操作练习题,答案我也随即上传了

    SQL练习题及答案

    1. 写出建立BORROW表的SQL语句,要求定义主键完整性约束和引用完整性约束。  2. 找出借书超过5本的读者,输出借书卡号及所借图书册数。  3. 查询借阅了"水浒"一书的读者,输出姓名及班级。  4.... 5....

    linux练习题(含答案).doc

    简述GNOME面板的组成及各自的功能 使用shell命令完成如下功能 使用openoffice.org办公组件,如何实现下面的操作 如何将进程砍掉和重启?

    计算机网络模拟练习题.doc

    1、目前,最流行的以太网组网的拓扑结构是( C )。 A) 总线结构 B) 环型结构 C) 星型结构 D) 网状结构 2、公用电话交换网(PSTN)中的交换设备提供( D )交换方式。 A)分组 B)报文 C)信元 D)电路 ...

    蓝桥杯c++-蓝桥杯竞赛练习之基础练习题查找整数.zip

    蓝桥杯 蓝桥杯c++_蓝桥杯竞赛练习之基础练习题查找整数

    数据结构教程(第5版)练习题参考答案

    各章中除给出本章练习题的参考答案外,还总结了本章的知识体系结构,并补充了大量的练习题并予以解析。附录中给出了几份近年来本科生、研究生数据结构考试试题及参考答案。书中列出了全部的练习题,因此自成一体,...

    C#base程序设计基础练习题

    C#练习题 1.在控制台输入一个年份,判断该年份是否为闰年并输出结果,要求定义一个方法,bool IsLeapYear(int year) 实现闰年的判断。 编写C# 程序,统计一组数字中指定数字出现的个数。要求:在主方法中接收一组...

    学术搜索大赛练习题

    学术搜索大赛练习题,让你更快速的能够查找所需要的文献和资料

    数据结构题

    数据结构练习题,1.若在线性表中采用折半查找法查找元素,该线性表应该( )。(北方名校经典试题) A)元素按值有序 B)采用顺序存储结构 C)元素按值有序,且采用顺序存储结构 D)元素按值有序,且采用链式...

    高质量C语言练习题3--二维表查找

    已知前提条件有: 1. 内容是一个0到65535的数值. 2. 对应的二维表有很多个, 而且每个表的ROW COUNT和COLUMN COUNT都不固定. 3. 原始表格数据文件格式 a. 原始文件是文本格式, 文本行与上表相对应. ...

    数据结构和算法相关的一些练习和Leetcode的练习题.zip

    算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...

    各种经典算法实,程式练习题

    主要收集一些常見的程式練習題目,您可以藉這些題目培養一些程式設計邏輯的感覺,對題目的分類只是個大概,方便索引而已,實作的部份是使用 C 及 Java

Global site tag (gtag.js) - Google Analytics