数据结构第六章

更新时间:2023-12-31 01:53:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

一、 单项选择题

1.已知一个长度为16的顺序L,气元素按关键字有序排列,或采用折半查找法查找一个不在L中存在的元素,则关键字的比较次数最多的是( )。

A.4 B. 5 C. 6 D. 7

2.顺序查找适合于存储结构为( )的线性表。

A.顺序存储结构或链式存储结构 B.散列存储结构 C.索引存储结构 D.压缩存储结构

3.对长度为n的有序单链表,若查找每个元素的概率相等,则顺序查找表中任意一个元素的查找成功的平均查找长度为( )。

A.n/2 B.(n+1)/2 C.(n-1)/2 D.n/4

4.对长度为3的顺序表进行查找,若查找的第一个元素概率为1/2,查找第二个元素的概率为1/3,查找第三个元素的概率为1/6,则查找表中任意一个元素的平均查找长度为( )。

A.5/3 B.2 C.7/3 D.4/3

5.当采用分块查找时,数据的组织方式为( )。 A.数据分成若干块,每块内数据有序

B.数据分成若干块,每块内数据不必有序,但块间必须有序,每块内最大(或最小)的数据组成索引块

C. 数据分成若干块,每块内数据有序,每块内最大(或最小)的数据组成索引块

D. 数据分成若干块,每块(除最后一块外)中数据个数需相同 6.下列关于二分查找的叙述中,正确的是( )。

A.表必须有序,表可以顺序方式存储,也可以链表方式存储 B. 表必须有序且表中数据必须是整型,实型或字符型 C. 表必须有序,而且只能从小到大排列 D.表必须有序,且表只能以顺序方式存储

7.使用二分(折半)查找元素的速度比用顺序法( )。 A.必然快 B.必然慢 C.相等 D.不能确定

8.已知一个长度为16的顺序表,其元素按关键字有序排列,若采用折半查找查找一个不存在的元素,则比较的次数至少是( ),至多是( )。

A.4 B.5 C.6 D.7

9.已知一个有序表(13,18,24,35,47,50,62,83,90,115,134),当二分查找值为90的元素师,查找成功的比较次数为( )。

A.1 B.2 C.4 D.6

10.折半查找过程所对应的判定树是一颗( )。 A.最小二叉树 B.平衡二叉树 C.完全二叉树 D.满二叉树

11.在有11个元素的 有序表A[1,2,3,?,11]中折半查找(??(low?high)/2??),查找元素为A[11]时,被比较元素的下标依次是( )。

A.6,8,10,11 B.6,9,10,11 C.6,7,9,11 D.6,8,9,11

12.具有12个关键字的有序表中,对每个关键字的查找概率相同,遮半查找查找成功的平均查找长度为( ),折半查找查找失败的平均查找长度为( )。

A.37/12 B.35/12 C.39/13 D.49/13

13.对有2500个记录的索引顺序表(分块表)进行查找,最理想的块长为( )。 A.50 B.125 C.500 D. ??log22500??

14.为提高查找效率,对有65025个元素的有序顺序表建立索引顺序结构,在最好情况下查找到表中已有元素最多需要执行( )次关键字比较。

A.10 B.14 C.16 D.21

15.设顺序存储的某线性表共有123个元素,按分块查找的要求等分为3块。若对索引表采用顺序查找法来确定子块,且确定的字块中也采用顺序查找法,则在等概率情况下,分块查找成功的平均查找长度为( )。

A.21 B.23 C.41 D.62

16.对长为n的有序表进行折半查找,其判定树的高度为( )。 A. ??log2(n?1)?? B. ??log2(n?1)???1 C. ??log2n???1 ?log2n?? D. ?17.下列叙述中,不符合m介B树定义要求的是( )。

A.根节点最多的有m课子树 B.所有叶节点都在同一层上

C.各节点内关键字均升序或者降序排列 D.叶节点之间通过指针连接 18.下列关于m介B-树的说法错误的是( )。 A.根节点至多有m棵子树 B.所有节点都在用一层次上

C.非叶节点至少有m/2(m为偶数)或m/2+1(m为奇数)棵子树 D.根节点中的数据是有序的

19.当在一颗m阶B树中做插入操作时,若一个结点中的关键字等于( ),则必须分裂成两个结点,当向一颗树m阶的B树做删除操作时,若一个结点中的关键字个数等于( ),则可能需要同它的做兄弟或有兄弟结点合并成一个结点。

A. m,??m/2???2 B. m?1,??m/2???2 C. m?1,??m/2???1 ?m/2?? D. m/2,?20.下列关于m阶B树的说法正确的是( )。 I. II. III. IV.

每个结点至少有两颗非空子树 树中每个结点至多有m-1个关键字 所有叶结点都在同一层

当插入一个元素引起B树结点分裂后,树长高一层

A.I、II B.II、III C.III 、IV D.I、II、IV 21.下列关于B树和B+树叙述中,不正确的是( )。 A. B树和B+树都能有效支持顺序查找 B. B树和B+树都能有效支持随机查找 C. B树和B+树都是平衡的多叉树 D. B树和B+树都可以用于文件索引结构

22.含有n个非叶结点的m阶B-树中至少包含( )个关键字。 A. n(m?1) B. n

C. n???m/2???1??1 ?m/2???1? D. (n?1)??23.已知一课3阶B树中有2047个关键字,则此B树的最大高度为( ),最小高度为( )。

A.11 B.10 C.8 D.7

24.高度为5的3阶B树至少有( )个结点,至少有( )个结点。 A.32 B.31 C.120 D.121

25.已知一棵5阶B树中共有53个关键字,则树的最大高度为( ),最小

高度为( )。

A.2 .B.3 C.4 D.5

26.具有n个关键字的m阶B-树,应有( )个叶结点。 A.n+1 B.n-1 C.mn D.nm/2

27.设有一个含有200个表项的散列表,用线性探测法解决冲突,按关键字查询时找到一个表项的平均探测次数不超过1.5,则散列表项应能够容纳( )个表项。(设查找成功的平均查找长度为ASL??1?1/(1??)?/2,其中?填装因子)

A.400 B. 526 C.624 D. 676

28.在开址法中散列到同一个地址而引起的“堆积”问题是由于( )引起的。

A.同义词之间发生冲突 B. 同义词之间发生冲突之间发生冲突 C.同义词或同义词之间发生冲突之间发生冲突 D.散列表“溢出”

29.Hash查找一般适用于( )情况下的查找。 A.查找表为链表 B. 查找表为有序表

C.关键字集合比地址集合大得多 D. 关键字集合比地址集合存在对应关系 30.假定有K个关键字互为同义词,若用线性探测法把这K个关键字填入Hash表中,至少要进行( )次探测。

A.K-1 B. K C.K+1 D. K(K+1)/2 B A B A 二 综合应用题

1.若对有N个元素的有序顺序表和无序顺序表进行顺序查找,试就下列三种情况讨论两者在相等查找概率时的平均查找长度是否相同? 1).查找失败。

2).查找成功,且表中只有一个关键字等于给定值k的元素。

3).查找成功,且表中只有若干个关键字等于给定值k的元素,要求一次能查找所有的元素。

2.设有序顺序表中的元素依次为017、094、154、170、275、503、509、512、553、612、677、765、897、908。

1) 试画出对其进行折半查找的判定树。

2) 若查找275或684的元素,将依次与表中那些元素比较? 3) 计算查找成功的平均查找长度和查找不成功的平均查找长度。

3.已知一个有序顺序表A[0...8N?1] 的表厂为8N,并且表中没有关键字相同的数据元素。假设按如下所述的方法查找一个关键字值等于给定值X的数据元素:先在A[7],A[15],A[23],?,A[8K-1],?,A[8N-1]中进行顺序查找,若查找成功,则算法报告成功位置并返回;若不成功,A?8K?1??X?A[8?(K?1)?1]时,则可以确定一个缩小的查找范围A?8K?A[8?(K?1)?2],然后可以再这个范围内执行折半查找。特殊情况:若X?A[8N?1]的关键字,则查找失败。 1)画出上述查找过程的判定树。

2)计算相等查找概率下查找成功的平均查找长度。

4.类比二分查找法,设计K分查找法(k为大于2的整数)如下:首先检查n/k处(n为查找表的长度)的元素是否等于要搜索的值,然后检查2n/k处的元素?这样,或者找到要查找的元素,或者把集合缩小到原来的1/k,如果未找到要查找的元素,则继续在得到的集合上进行K分查找;如此进行,直到找到要查找的元素或者查找失败。试求,查找成功和查找失败的时间复杂度。

5.线性表中各结点的检索概率不等,则可用如下策略提高顺序检索的效率:若找到指定的结点,将该结点和其前驱结点交换,使经常被检索的结点尽量位于表的前端。是设计在顺序结构和链式结构的线性表实现上述策略的顺序检索算法。

6.一个长度为L(L?1)的升序序列S,处在第??n/2??个位置的数为S的中位数。例如,若序列S1=(11,13,15,17,19),则S1的中位数是15,两个序列的中位数是含他们所有元素的的升序序列的中位数。例如,若S2=(2,4,6,8,20),则S1和S2的中位数是11。现在有两个等长升序序列A和B,试设计一个在时间和空间两方面都尽可能高效的算法,找出两个序列A和B的中位数。要求: (1)给出算法的基本思想。

(2)根据设计思想,采用C或者C++或JAVA语言描述算法,关键之处给注释。 (3)说明你所涉及的算法的时间复杂度和空间复杂度。

7.写出折半查找的递归算法。初始调用时,low为1,high为ST.length

8.利用B树做文件索引时,若假设磁盘的页块的大小是4000字节(实际应该是2的次幂,为了计算方便),指示磁盘地址的指针需要五个字节。现有20000000个记录构成的文件,每个记录为200字节,其中包括五个关键字节。

试问在次采用B树做索引的文件中,B树的阶数应为多少?假定文件数据部分未按关键字有序排列,则索引部分需要占多少磁盘页块?

9.假定把关键字key散列到有n个表项(从0到n-1编址)的散列表中。对于下面的每一个散列函数H(key)(key为整数),这些函数能够当做散列函数吗?如果能够,他是好的散列函数吗?请说明理由。设函数random(n)返回一个0到n-1之间的随机整数

1)H(key)=key/n。 2)H(key)=1.

3)H(key)=(key+random(n))%n。

4)H(key)=key%p(n);其中p(n)是不大于n的最大素数。

10.使用散列函数H(key)=key,把一个整数值转换成散列列表的下标,现在要把数据{1,13,34,38,33,27,22}依次插入到散列表中。

1)使用线性探测在散列法来构造散列表。 2)使用链表地址法构造散列表。

答案部分 一、 选择题

1-10 B A B A B D D AB B B 11-20 B AD A C B A D C A B 21-30 A D AD BD CB A A C D D

二、 综合题

1解答:(1)平均查找长度不同。因为有序顺序表查找到其关键字值比要查找值大的元素时就停止查找,并报告失败信息,不必查找到表尾;而无需表必须查找到表尾才能确定查找失败。

(2)平均查找长度相同。两者查找到表中元素的关键字值等于给定值时就停止查找。

(3)平均查找长度不同。有序顺序表中关键字相等的元素相继排列在一起,只要查找到第一个就可以连续查找到其他关键字相同的元素。而无序顺序表必须查找全部表中元素才能才能确定相同关键字的元素都找出来,所需时间就不相同了。

2解答:1)判定树如下图所示。

509154667017275553897094170503512612765908

2)若查找元素275,依次与表中元素509、154、275进行比较,共比较3次。若查找684,依次与表中元素509、677、897、765进行比较,共进行四次。 3)在查找功能时,会找到图中某个圆形结点,其平均长度为

ASLsucc114145 ??Ci?(1?2?2?3?4?4?7)?14i?11414在查找失败时,会找到图中某个方形结点,但这个结点是虚构的,最后一次的比

较元素为其父节点(圆形结点),故其平均长度为

ASLunsucc115'159??Ci?(3?1?4?14)? 15i?125151. 解答:1)相应的判定树如下图所示。其中,每个关键字下的数字为其查找成

功时的关键字比较次数。

71321304244453648594105125113134145n+3n+3n+3n+3n+31528N-1nn+3n+3

2)查找成功的平均查找长度为

ASLsuccn?1n?2n?318n?11?n??C?i?i?2i?4i?i8n??????8ni?0i?3i?4??i?1i?21?n????(i?(i?1)?2(i?2)?4(i?3))?8n?i?1?1?n?n?117???8i?17???8n?i?128?

4解答:与二分法查找类似,k分查找法可用k叉树来描述。K分查找法在查找成功时进行比较的关键字个数最多不超过根的深度,而具有n个结点的k叉树的深度为?所以k分查找法在查找成功时和给定值比较的关键?logkn???1,字个数至多为??logkn???1,即时间复杂度为O(logkn)。同理,查找不成功时,和给定值进行比较的关键字个数至多为??logkn???1,故时间复杂度也为

O(logkn)。

5 解答:算法的基本思想:检索时可从开头开始向后顺序扫描,若找到指定结点,将该结点和其前驱结点(若存在)交换。采用顺序结构的存储结构的

算法实现如下:

int seqsrch(RcdType R[],ElemType k){

//顺序查找线性表,找到后和前面的元素交换 Int i=0;

While ((R[i].key!=k)&&(i

i++

if(i0){ //找到 ,交换 temp=R[i];

R[i]=R[i-1]; R[i-1]=temp;

Return –-i; //返回交换后位置 }

else return -1; //查找失败 }

链表的实现方式类比这个方式自己完成。 6 解答:(1)算法的基本思想如下:

分别求出序列A和B的中位数,设为a和b,求序列A和B的中位数的过程如下:1)若a=b,则a或者b即为所求的中位数,算法结束。

2)若a

3)若a>b,则舍弃序列A中较大的一半,同时舍弃B中较小一半,要求舍弃长度相等。

在保留两个升序序列中,重复过程1,2,3,直到两个序列中只含一个元素为止,较小者即为所求的中位数。

(2)算法实现如下:

Int M_search(int A[],int B[],int n) int s1=0,d1=n-1,m1,s2=1,d2=n-1,m2;

//分别表示序列A和B中的首位数、末尾数和中位数 While (s1!=d1||s2!=d2){ m1=(s1+d1)/2; m2=(s2+d2)/2;

if(A[m1])==B[m1])

return A[m1]; //满足条件1

if(A[m1])

if((s1+d1)%2==0){ //若元素个数为奇数

s1=m1;//舍弃A中间点以前的部分且保留中间点 d2=m2;//舍弃 B中间点以后的部分且保留中间点 }

else{ //元素个数为偶数

s1=m1+1; //舍弃A中间点及中间点以前的部分 d2=m2; //舍弃B中间点以后的部分且保留中间点

}

}

else{ //满足条件3

if((s1+d1)%2==0){//若元素为奇数

d1=m1; //舍弃A中间点以后的部分且保留中间点 s2=m2; //舍弃B中间点以前的部分且保留中间点 }

else{ //元素个数为偶数

d1=m1+1; //舍弃A中间点以前的部分且保留中间点 s2=m2; //舍弃B中间点及中间点的以前部分 } } }

return A[s1]

(3) 算法的时间复杂度为O(log2n),空间复杂度O(1)。

7 解答:算法的基本思想:根据查找的起始位置和终止位置,将查找序列一分为二,判断所查找的关键在那一部分,然后用新的序列起始位置和终止位置递归求解。

算法代码:

Typedef struct{//查找表的数据结构

ElemType *elem; //存储空间基址,建表时按实际长度分配,0号留空

int length;//表的长度 }SSTable

Int BinsearchRec(SSTable ST, ElemType key ,int low,int high){

//在有序表中递归折半查找其关键字为key的元素,返回在表中的序号 If(low>high) return 0;

mid=(low+high)/2; //取中间位置

if(key>ST.elem[mid]) //向后半部分查找 Search(ST,key,mid+1,high);

Else if (key< ST.elem[mid]) //向前半部分查找 Search(ST,key,low,mid-1);

Else //查找成功 Return mid; }

算法把规模为n复杂问题经过多次递归调用转化我规模减半的子问题求解。时间复杂度为O(log2n),算法中用到了一个递归工作栈,其规模于递归深度有关,也是O(log2n)

8 解答:根据B树的概念,一个索引结点应适应操作系统一次读写的物理记录大小,其大小应取不超过单最接近一个磁盘页块的大小。假设B树为M阶,一个B树最多存放m-1个关键字(5个字节)和对应的记录地址(5字节)、m

个子树指针(5个字节)和一个指示结点中实际关键字个数的整数(2字节)。则有:(2?(m?1)?m)?5?2?4000

计算结果,m?267。

一个索引结点最多可存放m-1=256个索引项,最少可存放??m/2???1?133个索

引项。全部有n=20000000个记录,每个记录占用空间200个字节,每个页块可存放4000/200=20个记录,则全部记录分布在20000000/20=1000000页块中,最多需要占用1000000/133=7519个磁盘页块作为B树的索引,最少占用1000000/266=3759个磁盘页块作为B树索引。

9 解答:1)不能当做散列函数,因为key/n可能大于n,这样无法找到合适的位置。

2)能当做散列函数,但不是一个好的散列函数,因为所有的关键字都映射到同一位置,造成大量的冲突机会。

3)不能当做散列函数,因为该函数的返回值不确定,这样无法进行正常查找。 4)能当做散列函数,是一个好的散列函数。 10 解答:1)由装载因子0.7,数据总数为7,得一维数组大小为7/0.7=10,数组下标为0-9。所构造的散列函数值如下所示: Key 7 8 30 11 18 9 14 H(key) 0 3 6 5 5 6 0 采用线性探测法处理冲突,所构造的散列表为: 地址 0 1 2 3 4 5 6 7 8 9 关键字 7 14 8 11 30 18 9 2)查找成功时,在等概率情况下,查找每个表中元素的概率时相等的,因此,是根据表中元素个数来计算平均查找长度,各关键字的比较次数为: Key 7 8 30 11 18 9 14 次数 1 1 1 1 3 3 2 故,ASL=查找次数/元素个数=(1+2+1+1+1+3+3)/7=12/7 在计算查找失败时的平均查找长度时,要特别注意防止定势。在查找失败时既不是根据表中元素个数,也不是根据表长来计算平均查找长度的。

查找失败时,在概率相等情况下,经过散列函数计算后只可能映射到表中0-6位置,且映射到0-6中任一位置的概率是相等的。因此,是根据散列函数(MOD后面的数字)来计算平均查找长度。在等概率下,查找失败的比较次数为: H(key) 0 1 2 3 4 5 6 次数 3 2 1 2 1 5 4 故,ASL(不成功)=查找次数/散列后的地址个数 =(3+2+1+2+1+5+4)/7=18/7

个子树指针(5个字节)和一个指示结点中实际关键字个数的整数(2字节)。则有:(2?(m?1)?m)?5?2?4000

计算结果,m?267。

一个索引结点最多可存放m-1=256个索引项,最少可存放??m/2???1?133个索

引项。全部有n=20000000个记录,每个记录占用空间200个字节,每个页块可存放4000/200=20个记录,则全部记录分布在20000000/20=1000000页块中,最多需要占用1000000/133=7519个磁盘页块作为B树的索引,最少占用1000000/266=3759个磁盘页块作为B树索引。

9 解答:1)不能当做散列函数,因为key/n可能大于n,这样无法找到合适的位置。

2)能当做散列函数,但不是一个好的散列函数,因为所有的关键字都映射到同一位置,造成大量的冲突机会。

3)不能当做散列函数,因为该函数的返回值不确定,这样无法进行正常查找。 4)能当做散列函数,是一个好的散列函数。 10 解答:1)由装载因子0.7,数据总数为7,得一维数组大小为7/0.7=10,数组下标为0-9。所构造的散列函数值如下所示: Key 7 8 30 11 18 9 14 H(key) 0 3 6 5 5 6 0 采用线性探测法处理冲突,所构造的散列表为: 地址 0 1 2 3 4 5 6 7 8 9 关键字 7 14 8 11 30 18 9 2)查找成功时,在等概率情况下,查找每个表中元素的概率时相等的,因此,是根据表中元素个数来计算平均查找长度,各关键字的比较次数为: Key 7 8 30 11 18 9 14 次数 1 1 1 1 3 3 2 故,ASL=查找次数/元素个数=(1+2+1+1+1+3+3)/7=12/7 在计算查找失败时的平均查找长度时,要特别注意防止定势。在查找失败时既不是根据表中元素个数,也不是根据表长来计算平均查找长度的。

查找失败时,在概率相等情况下,经过散列函数计算后只可能映射到表中0-6位置,且映射到0-6中任一位置的概率是相等的。因此,是根据散列函数(MOD后面的数字)来计算平均查找长度。在等概率下,查找失败的比较次数为: H(key) 0 1 2 3 4 5 6 次数 3 2 1 2 1 5 4 故,ASL(不成功)=查找次数/散列后的地址个数 =(3+2+1+2+1+5+4)/7=18/7

本文来源:https://www.bwwdw.com/article/pjmx.html

Top