1. 若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用()存储方式最节省时间。
A 顺序表
B 双链表
C 带头结点的双循环链表
D 单循环链表
答案:A
解析:线性表最常用得操作是存取任一指定序号的元素和在最后进行插入和删除运算;
进行任意位置存取,这个最省时省力的就是数组了,也就是顺序表。
而且元素是在最后的位置进行插入和删除运算,也就不涉及其他元素进行位移的额外操作,最多涉及的就是去扩展空间了。
2. 下列数据结构具有记忆功能的是?
A 队列
B 循环队列
C 栈
D 顺序表
答案:C
解析:栈的特点是先进后出,所以对一个栈进行出栈操作,出来的元素肯定是最后存入栈中的元素,所以栈有记忆功能
3. 循环队列放在一维数组A[0…M-1]中,end1指向队头元素,end2指向队尾元素的后一个位置。假设队列两端均可进行入队和出队操作,队列中最多能容纳M-1个元
素。初始时为空,下列判断队空和队满的条件中,正确的是()
A 队空:end1end2;队满:end1(end2+1) mod M
B 队空:end1end2;队满:end2(end1+1) mod (M-1)
C 队空:end2==(end1+1) mod M;队满:end1==(end2+1) mod M
D 队空:end1==(end2+1) mod M;队满:end2==(end1+1) mod (M-1)
答案:A
解析:
- end1指向队头元素,可知出队操作是先从A[end1]读数,然后end1再加1。
end2指向队尾元素的后一个位置,可知入队操作是先存数到A[end2],然后end2再加1。
若用A[0]存储第一个元素,队列初始时,入队操作是先把数据放到A[0]中,然后end2自增,即可知end2初值为0;
而end1指向的是队头元素,队头元素在数组A中的下标为0,所以得知end1的初值也为0,可知队空条件为end1== end2; - 然后考虑队列满时,因为队列最多能容纳M-1个元素,假设队列存储在下标为0到M-2的M-1个区域,队头为A[0],队尾为A[M-2],此时队列满,考虑在这种情
况下end1和end2的状态,end1指向队头元素,可知end1=0,end2指向队尾元素的后一个位置,可知end2=M-2+1=M-1,所以可知队满的条件为
end1==(end2+1)mod M,选A。
4. 对递归程序的优化的一般的手段为()
A 尾递归优化
B 循环优化
C 堆栈优化
D 停止值优化
答案:A
解析:尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。 尾递归调用时,如果做了优化,栈不会增长,因此,无论多少次调用也不会导致栈溢出。
举个例子:
以斐波那契数列为例子
普通的递归版本
int fab(int n){
if(n<3)
return 1;
else
return fab(n-1)+fab(n-2);
}
具有"线性迭代过程"特性的递归---尾递归过程
int fab(int n,int b1=1,int b2=1,int c=3){
if(n<3)
return 1;
else {
if(n==c)
return b1+b2;
else
return fab1(n,b2,b1+b2,c+1);
}
}
以fab(4)为例子
普通递归fab(4)=fab(3)+fab(2)=fab(2)+fab(1)+fab(2)=3 6次调用
尾递归fab(4,1,1,3)=fab(4,1,2,4)=1+2=3 2次调用
5. 将一颗有 100 个结点的完全二叉树从根这一层开始,每一层从左到右依次对结点进行编号,根节点编号为 1 ,则编号为 98 的节点的父节点编号为()
A 47
B 48
C 49
D 50
答案: C
解析:完全二叉树对于偶数节点其父节点编号为其编号除以2,奇数节点其父节点编号为(其编号-1)/2
6. 下列说法中错误的是()
A 红黑树插入操作的平均时间复杂度为O(logn),最坏时间复杂度为O(logn)
B B+树插入操作的平均时间复杂度为O(logn),最坏时间复杂度为O(logn)
C Hash表插入操作的平均时间复杂度为O(logn),最坏时间复杂度为O(n)
D 排序链表插入操作的平均时间复杂度为O(n),最坏时间复杂度为O(n)
答案:C
解析:
7. 下列排序法中,每经过一次元素的交换会产生新的逆序的是( )
A 快速排序
B 冒泡排序
C 简单插入排序
D 简单选择排序
答案:A
解析:在数据元素的序列中,对于某个元素,如果其后存在一个元素小于它,则称之为存在一个逆序。
- 冒泡排序只交换相邻元素,但不是每次移动都产生新的逆序。
- 简单插入排序每一次比较后最多移掉一个逆序。
- 快速排序每一次交换移动都会产生新的逆序,因为当不会有新的逆序产生时,本轮比较结束。
- 简单选择排序的基本思想是先从所有 n 个待排序的数据元素中选择最小的元素,将该元素与第一个元素交换,再从剩下的 n-1 个元素中选出最小的元素与第 2 个元素交换,这样做不
会产生逆序。