A 顺序表
B 双链表
C 带头结点的双循环链表
D 单循环链表
答案:A
解析:线性表最常用得操作是存取任一指定序号的元素和在最后进行插入和删除运算;
进行任意位置存取,这个最省时省力的就是数组了,也就是顺序表。
而且元素是在最后的位置进行插入和删除运算,也就不涉及其他元素进行位移的额外操作,最多涉及的就是去扩展空间了。
A 队列
B 循环队列
C 栈
D 顺序表
答案:C
解析:栈的特点是先进后出,所以对一个栈进行出栈操作,出来的元素肯定是最后存入栈中的元素,所以栈有记忆功能
素。初始时为空,下列判断队空和队满的条件中,正确的是()
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
解析:
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次调用
A 47
B 48
C 49
D 50
答案: C
解析:完全二叉树对于偶数节点其父节点编号为其编号除以2,奇数节点其父节点编号为(其编号-1)/2
A 红黑树插入操作的平均时间复杂度为O(logn),最坏时间复杂度为O(logn)
B B+树插入操作的平均时间复杂度为O(logn),最坏时间复杂度为O(logn)
C Hash表插入操作的平均时间复杂度为O(logn),最坏时间复杂度为O(n)
D 排序链表插入操作的平均时间复杂度为O(n),最坏时间复杂度为O(n)
答案:C
解析:
A 快速排序
B 冒泡排序
C 简单插入排序
D 简单选择排序
答案:A
解析:在数据元素的序列中,对于某个元素,如果其后存在一个元素小于它,则称之为存在一个逆序。