1.下列函数(B)
int func ( int n )
{ int i = 0, sum = 0;
while ( sum < n ) sum += ++i;
return i;
}
的时间复杂度是:
A.O(logn)
B.O(n1/2)
C.O(n)
D.O(nlogn)
解析:
对于不是for循环形式的题目,可以列出变量的变化过程,观察它是大致以什么速率增加的。
2.下面代码段的时间复杂度是()。
x=0; for( i=1; i<n; i++ ) for ( j=1; j<=n-i; j++ ) x++;
A.O(n)
B.O(n2)
C.O(n3)
D.O(2n)
3.(neuDS)所谓随机存取,就是通过首地址和元素的位序号值可以在O(1)的时间内找到指定的元素。T
4.(neuDS)线性表的顺序存储结构是一种(A)
A.随机存取的存储结构
B.顺序存取的存储结构
C.索引存取的存储结构
D.散列存取的存储结构
5.将长度分别为m,n的两个单链表合并为一个单链表的时间复杂度为O(m+n)。(F)
解析:由关键程序(如下)可知:
void ListMerge_L(LinkList La, LinkList Lb, LinkList &Lc){
LNode *pa = La -> next, *pb = Lb -> next, *pc;
pc = Lc = La;
while(pa && pb){
if(pa -> data <= pb -> data){
pc -> next = pa;
pc = pa;
pa = pa -> next;
}else{
pc -> next = pb;
pc = pb;
pb = pb -> next;
}
}
if(pa){
pc -> next = pa;
}
if(pb)
{
pc -> next = pb;
}
free(Lb);
}
时间复杂度应为O(max(m,n))。
区分:1.如果将两个链表移到第三个链表上,则时间复杂度应为O(m+n)。
2.将长度分别为m,n的两个顺序表合并为一个顺序表的时间复杂度为O(m+n)。
6.将长度为n的单链表连接在长度为m的单链表之后的算法的时间复杂度为(B)。
A.O(1)
B.O(m)
C.O(n)
D.O(n+m)
7.某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用什么存储方式最节省运算时间?(B)
A.单链表
B.仅有尾指针的单循环链表
C.仅有头指针的单循环链表
D.双链表
8.若某表最常用的操作是在最后一个结点之后插入一个结点或删除最后一个结点。则采用哪种存储方式最节省运算时间?(D)
A.单链表
B.双链表
C.单循环链表
D.带头结点的双循环链表
区分:7,8
9.将线性表La和Lb头尾连接,要求时间复杂度为O(1),且占用辅助空间尽量小。应该使用哪种结构?(C)
A.单链表
B.单循环链表
C.带尾指针的单循环链表
D.带头结点的双循环链表
10.在一个长度为n(n>1)的单链表上,设有头和尾两个指针,执行(B)操作与链表的长度有关。
A.删除单链表中的第一个元素
B.删除单链表中的最后一个元素
C.在单链表第一个元素前插入一个新元素
D.在单链表最后一个元素后插入一个新元素
解析:易错
11.如果对线性表的运算只有4种,即删除第一个元素,删除最后一个元素,在第一个元素前面插入新元素,在最后一个元素的后面插入新元素,则最好使用()。
A.只有表尾指针没有表头指针的循环单链表
B.只有表尾指针没有表头指针的非循环双链表
C.只有表头指针没有表尾指针的循环双链表
D.既有表头指针也有表尾指针的循环单链表
解析:删除最后一个元素:双循环链表,在第一个元素之前插入一个元素:带头结点
12.采用多项式的非零项链式存储表示法,如果两个多项式的非零项分别为N1和N2个,最高项指数分别为M1和M2,则实现两个多项式相乘的时间复杂度是:(A)
A.O(N1×N2)
B.O(M1×M2)
C.O(N1+N2)
D.O(M1+M2)
区分:若是相加则为O(N1+N2)。