1、查找失败时,最多的关键字比较次树不超过判定树的深度,此处为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
2、f (g) h i j k p q第二次比较: b (c) d f g q第三次比较: a (b)c经过三次比较,查找成功。 (2)g的查找过程如下: a b c d e f (g) h i j k p q 一次比较成功。 (3)n的查找过程如下: 下标: 9 10 11 12 13 第一次比较: f (g) 第二次比较: a h i (j) k 第三次比较: j k (p) q 第四次比较: j k p 经过四次比较,查找失败。6.将(for, case, while, class, protected, virtual, public, private, do, template, con
3、st ,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 templateT的中序序列是:case class const do for if int private prote
4、cted public template virtual while的后序序列是:const class case for int if private template public virtual protected while do7.对给定的关键字集合,以不同的次序插入初始为空的树中,是否有可能得到同一棵二叉排序树? 有可能。如有两个序列:3,1,2,4 和 3,4,1,2,它们插入空树所得的二叉排序树是相同的。8.将二叉排序树T的先序序列中的关键字依次插入一空树中,所得和二叉排序树T与T否相同?为什么? 这两棵二叉树完全相同。9.设二叉排序树中关键字由1至1000的整数构成,现要查找
5、关键字为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.设二叉排序树中关
6、键字互不相同,则其中最小元必无左孩子,最大元必无右孩子。此命题是否正确?最小元和最大元一定是叶子吗?一个新结点总是插在二叉排序树的某叶子上吗?此命题正确。假设最小元有左孩子,则根据二叉排序树性质,此左孩子应比最小元更小,如此一来就产生矛盾了,因此最小元不可能有左孩子,对于最大元也是这个道理。但最大元和最小元不一定是叶子,它也可以是根、内部结点(分支结点)等,这得根据插入结点时的次序而定。新结点总是作为叶子插入在二叉排序树中的。11.在一棵m阶的B-树中,当将一关键字插入某结点而引起该结点的分裂时,此结点原有多少个关键字?若删去某结点中的一个关键字,而导致结点合并时,该结点中原有几个关键字?在一
7、棵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)
8、 插入52:(4) 插入60:(5) 插入68:(6) 插入70:(7)删去50:(8) 删去6814.画出依次插入z,v,o,p,w,y到图9.12(h)所示的5阶B-树的过程。 (1)插入z后:(2)插入v,o后 (3)插入p,w,y后16.为什么在内存中使用的B-树通常是3阶的,而不使用更高阶的B-树? 因为查找等操作的cpu时间在B-树上是O(lgn(m/lgt),而m/lgt1,所以m较大时它所费时间比平衡的二叉排序树上相应操作时间大得多,因此,仅在内存中使用的B-树通常取最小值317.为什么二叉排序树长高时,新结点总是一个叶子,而B-树长高时,新结点总是根?哪一种长高能保证树平衡?
9、 因为在二叉排序树中,关键字总是作为一个叶子结点插入以原来的树中,所以当树增高时,新结点总是一个叶子;而B-树中关键字插入总是插入到叶子结点内部,在叶结点中的关键字数目尚未超过它能够容纳的数目之前是不会增加结点的,当关键字数超过结点可容纳的数目时,叶结点就会发生分裂,产生一个新结点(但不一定引起树增高),并且将其中的中间结点传至上一层,只有当这种分裂操作传递至根结点并引起根结点的分裂时,才能引起树高增加,此时产生一个新的根结点。所以说B树长高时,新结点总是根。 显然,后一种长高总能保证树的平衡。19.对于一组给定的、固定不变的关键字序列,有可能设计出无冲突的散列函数H,此时称H为完备的散列函数
10、(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,H
11、eather),试为散列表0.6设计一个完备的散列函数。(提示:考虑每个字符串的第3个字符,即s2)(1) 一般情况下H不是完备的,如果说插入一个新的关键字它还是完备的,那么再插入一个呢?它岂不是永远是完备的散列函数了? 所以一般情况下它不能总是完备的,只有一些很少的情况下它还可能是完备的。(2)这个H是完备的,其函数值依次为:1,2,5,0,7,3,6,8,4。如果散列表长m=9时,它就是最小完备的。(3) 这个函数如下:int Hash (char key) return key2%7;20.设散列函数为h(key)=key%101,解决冲突的方法为线性探查,表中用-1表示空单元。若删去散列表HT中的304(即令HT1=-1)之后,在表HT中查找707将会发生什么?若将删去的表项标记为-2,查找时探查到-2继续向前搜索,探查到-1时终止搜索。请问用这种方法删304后能否正确地查找到707?0 1 2 3 100HT202 304 507 707 . 查找707时,首先根据散列函数计算得出该元素应在散列表中的0单元,但是在0单元没有找到,因此将向下一
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1