`

查找的一些练习题

阅读更多
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所在的结点。
分享到:
评论

相关推荐

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

    本题主要涉及了多种查找方法,包括顺序查找、折半查找、哈希查找以及B-树和二叉排序树的构建与操作。以下是这些知识点的详细说明: 1. **顺序查找**: - 平均查找长度:当等概率查找时,如果查找成功,平均查找...

    数据结构练习题 1800道

    本资料包含1800道数据结构练习题,旨在帮助学习者深入理解和掌握数据结构的原理与应用。下面我们将针对数据结构的一些关键知识点进行详细解释。 1. **数组**:是最基础的数据结构,它是一系列相同类型元素的集合,...

    java 集合练习题

    在这个“java集合练习题”中,我们主要关注如何使用Java集合框架来处理数据,特别是对于学生信息的存储、排序和输出。以下是对这个练习题的详细解析: 1. **集合框架简介**: Java集合框架是Java API的一部分,它...

    二叉查找树练习

    在这个“二叉查找树练习”中,我们关注的是`findwords`函数,它的目标是检查一个文件是否包含特定的单词。这个功能通常用于文本处理、搜索算法或者数据分析。二叉查找树在此场景下的应用是为了快速定位和比较单词,...

    查找练习题(答案).docx

    【知识点详解】 ...以上是关于查找算法的详细解释,包括顺序查找、折半查找、索引查找、二叉排序树查找以及哈希查找的相关知识点,涉及它们的平均查找长度、时间复杂度、具体应用及解决冲突的方法。

    WORD文字排版练习题

    "WORD文字排版练习题"这个主题涵盖了多个关键知识点,包括文字输入、排版设置、效果调整、表格创建及计算功能的运用。以下将详细阐述这些内容。 1. **文字输入**:这是Word的基础操作,包括打字、编辑、复制、粘贴...

    经典EXCEL练习题

    "经典EXCEL练习题"这个资源提供了丰富的练习机会,旨在帮助用户深入理解和熟练应用Excel中的公式与复杂计算。以下是一些重要的Excel知识点,结合描述和提供的文件,我们可以进行深入的学习: 1. **公式基础**:...

    python从零开始学算法-查找排序练习题部分代码

    这里是专栏第十篇练习题所对应的代码文件,特别分出来希望可以对大家有帮助。三道练习题都可以在了LeetCode上找到,如果学会了就快去动手练一练吧。希望可以帮助大家更好的学习,但我也是一个菜鸟,还有很多不足,...

    大学课堂《C++练习题》

    7. **算法**:C++练习题往往包含排序(如冒泡排序、选择排序、快速排序等)、查找(线性查找、二分查找等)和图、树等数据结构相关的算法。 8. **异常处理**:理解如何使用try-catch块来处理运行时可能出现的错误,...

    数据结构书面作业练习题

    在数据结构书面作业练习题中,我们还可以看到一些重要的知识点,例如: * 数据结构的定义:数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象、关系、运算等的学科。 * 线性表的顺序存储结构:线性表...

    linux练习题

    练习题可能涵盖ls、cd、mkdir、rm、cp、mv等基本命令的使用,以及find、grep、sed、awk等高级查找和文本处理命令。了解如何组合使用这些命令可以提高你在Linux环境中的效率。 2. **文件系统管理**:Linux的文件系统...

    华为-华为od题库练习题之查找兄弟单词.zip

    【华为OD题库练习题之查找兄弟单词】是华为公司为应聘者或内部员工准备的一套练习题目,旨在考察和提升他们在数据处理和算法分析方面的能力。OD(Organizational Development)通常指的是组织发展,此处可能是指华为...

    c程序设计期末的练习题

    "c程序设计期末的练习题"通常涵盖了C语言的基础概念、语法结构、逻辑控制以及一些高级特性。以下是对这些练习题可能涉及的知识点的详细解析: 1. **基础语法**:C语言的基础包括变量定义、数据类型(如int, char, ...

    数据结构练习题

    以下是一些关键的知识点,涵盖了这些练习题可能涉及的内容: 1. **线性数据结构**:线性数据结构包括数组、链表、栈和队列。数组是最基本的数据结构,提供了随机访问元素的能力;链表则允许动态调整大小,但访问...

    office办公软件word操作练习题

    "Office办公软件Word操作练习题"旨在帮助用户提升对Word的基本操作技能,包括文本输入、格式调整、页面布局、图形插入以及文档管理等方面。通过实践这些练习题,用户可以更熟练地掌握Word的各项功能,从而提高工作...

    C++课程习题与考试练习题

    ### C++课程习题与考试练习题解析 #### 题目1:猜数字游戏 在本题中,目标是让计算机随机生成一个1到2000之间的整数,玩家通过猜测尝试找到这个数字。游戏会根据玩家的猜测提供反馈,告知猜测的数字是太大还是太小...

    130道python练习题.zip

    "130道python练习题.zip"这个压缩包提供了丰富的Python基础练习题目,对于巩固Python知识和入门学习非常有帮助。 这些练习题覆盖了Python的基础知识点,包括但不限于以下方面: 1. **变量与数据类型**:Python支持...

    CTF-入门练习题

    这个“CTF-入门练习题”很可能包含了一系列这样的挑战,旨在帮助初学者提升在网络安全领域的技能。 【网络攻防】 网络攻防是CTF中的核心部分,涉及攻击者与防御者的对抗。攻击者可能试图寻找系统漏洞,进行SQL注入...

    50道java程序练习题

    下面,我们将深入探讨这些练习题可能涵盖的知识点,并给出一些关键概念的解释。 1. **基础语法**:练习题可能包括变量声明、数据类型(如整型、浮点型、字符型、布尔型)、运算符(算术、比较、逻辑、赋值等)、...

Global site tag (gtag.js) - Google Analytics