数据结构
2019年
选择题
1.设n是描述问题规模的非负整数,下列程序段的时间复杂度是
x = 0;
while(n >= (x+1)*(x+1))
x = x+1;
解析: n > = ( x + 1 ) 2 n>=(x+1)^2 n>=(x+1)2,则 x + 1 < = n x+1<=\sqrt{n} x+1<=n
- A. O ( l o g n ) O(log\space n) O(log n)
- B. O ( n 1 / 2 ) O(n^{1/2}) O(n1/2)
- C. O ( n ) O(n) O(n)
- D. O ( n 2 ) O(n^2) O(n2)
2.若将一棵树T转化为对应的二叉树BT,则下列对BT的遍历中,其遍历序列与T的后根遍历序列相同的是
- A.先序遍历
- B.中序遍历
- C.后序遍历
- D.按层遍历
解析:
二叉树 | 先序 | 中序 |
---|---|---|
树 | 先根 | 后根 |
森林 | 先序 | 后序 |
3.对n个互不相同的符号进行哈夫曼编码。若生成的哈夫曼树共有115个结点,则n的值是
- A.56
- B.57
- C.58
- D.69
解析:有n个数,生成2n-1个哈夫曼结点;有n-1个度为2的结点。
4.在任意一棵非空平衡二叉树(AVL树)T 1 _1 1中,删除某结点v后形成平衡二叉树T 2 _2 2,再将v插入T 2 _2 2形成平衡二叉树T 3 _3 3。下列关于T 1 _1 1与T 3 _3 3的叙述中,正确的是
I.若v是T 1 _1 1的叶结点,则T 1 _1 1与T 3 _3 3可能不相同
II.若v不是T 1 _1 1的叶结点,则T 1 _1 1与T 3 _3 3一定不相同
III.若v不是T 1 _1 1的叶结点,则T 1 _1 1与T 3 _3 3一定相同
- A.仅I
- B.仅II
- C.仅I、II
- D.仅I、III
解析:
对于I:
若删除3,则再插入3,二叉树前后不变
对于II:
对于III:
5.下图所示的AOE网表示一项包含8个活动的工程,活动d的最早开始时间和最迟开始时间分别是
- A.3和7
- B.12和12
- C.12和14
- D.15和15
解析:
a、b、c都完成才能开始执行d,所以最早开始为8+4=12;
现在计算完成6的时间:
完成1、2、4、6花16个时间
完成1、2、5、6花18个时间
完成1、3、2、4、6花25个时间
完成1、3、2、5、6花27个时间
完成1、3、5、6花27个时间
所以,完成6的时间应该取最大的时间27,再从g=6,d=7反推到d,得27-6-7=14
6.用有向无环图描述表达式(x+y)*((x+y)/x),需要的顶点个数至少是
- A.5
- B.6
- C.8
- D.9
解析:表达式共有x,y,+,*,/五种符号,如果每个符号可以装进一个顶点内,则需要5个顶点
7.选择一个排序算法时,除算法的时空效率外,下列因素中,还需要考虑的是
I.数据的规模 II.数据的存储方式
III.算法的稳定性 IV.数据的初始状态
- A.仅III
- B.仅I、II
- C.仅II、III、IV
- D.I、II、III、IV
8.现有长度为11且初始为空的散列表HT,散列函数是 H ( k e y ) = k e y % 7 H(key)=key \% 7 H(key)=key%7,采用线性探查(线性探测再散列)法解决冲突,将关键字序列87,40,30,6,11,22,98,20依次插入到HT后,HT查找失败的平均查找长度是
- A.4
- B.5.25
- C.6
- D.6.29
解析:
假如查找0,算出在0的位置,对比后发现是98而非0,继续往右探测,对比到8的位置,发现为空,停止对比,共对比9次(即0,1,2,3,4,5,6,7,8);
假如查找1,算出在1的位置,对比后发现是22而非1,一直往右对比到8的位置,发现为空,停止对比,共对比8次(1,2,3,4,5,6,7,8);
假如查找2,……,共对比7次;
……
假如查找6,……,共对比3次;
以上查找总共失败了9+8+7+……+3=42次
因为函数 % 7 \% 7 %7,计算的范围只能是0~6的范围,所以7个数据,共比较失败了42次,查找失败的平均查找长度42/7=6次
9.设主串T=“abaabaabcabaabc”,模式串S=“abaabc”,采用KMP算法进行模式匹配,到匹配成功时为止,在匹配过程中进行的单个字符间的比较次数是
- A.9
- B.10
- C.12
- D.15
解析:
子串序号:从1开始编号
next值:第1位写0,第2位写1,第n位看n-1的最大匹配长度,再加1;
nextval值:第1位为0,第2位与第1位相同则为0,否则为1;第3位看它的next值,定位到next值对应的序号的字符,若两者不同,则nextval的值就是字符本身的next值;如果两者相同,填入next值对应序号的nextval;
注:若序号从0开始,则以上值都相应减1
第一次比较了6次,发现a与c不匹配:
第二次从序号6开始比较(子串使用next值跳到3的位置),7,8,9比较完成后匹配,共比较4次:
共比较6+4=10次
10.排序过程中,对尚未确定最终位置的所有元素进行一遍处理称为一“趟”。下列序列中,不可能是快速排序第二趟结果的是
- A.5,2,16,12,28,60,32,72
- B.2,16,5,28,12,60,32,72
- C.2,12,16,5,28,32,72,60
- D.5,2,12,28,16,32,72,60
解析:
快排的思路是选一个枢轴,小的放枢轴左边,大的放枢轴右边。
A的第一趟枢轴是72、第二趟是28
B的第一趟枢轴是72、第二趟是2
C的第一趟枢轴是28、第二趟是2和32
综合题
41.设线性表L=(a 1 _1 1,a 2 _2 2,a 3 _3 3,…,a n − 2 _{n-2} n−2,a n − 1 _{n-1} n−1,a n _n n)采用带头结点的单链表保存,链表中结点定义如下:
typedef struct node{
int data;
struct node*next;
}NODE;
请设计一个空间复杂度为 O ( 1 ) O(1) O(1)且时间上尽可能高效的算法,重新排列L中的各结点,得到线性表L`=(a 1 _1 1,a n _n