1、下列函数的时间复杂度是____。
int func(int n)
{
int i=0,sum=0;
while(sum<n) sum+=++i;
return i;
}
- A:O( log ( n ) \log(n) log(n))
- B:O( n 1 2 n^{1 \over 2} n21)
- C:O(n)
- D:O( n log ( n ) n\log(n) nlog(n))
解析
“sum+=++i;”相当于“++i; sum=sum+i”。进行到第k趟循环,sum=(1+k)*k/2。
(1+k)*k/2<n,显然需要进行O(
n
1
2
n^{1 \over 2}
n21)趟循环,因此这也是该函数的时间复杂度。
答案:B
2、从一个具有n个结点的单链表中检索其值等于x的结点时,在检索成功的情况下,需平均比较的结点个数是____。
- A:n/2
- B:n
- C:(n+1)/2
- D:(n-1)/2
解析
由于单链表只能进行单向顺序查找,以从第一个节点开始查找为例,查找第m个节点需要比较的节点数f(m)=m,查找成功的最好情况是第一次就查找成功,只用比较1个节点,最坏情况则是最后才查找成功,需要比较n个节点。
所以一共有n种情况,平均下来需要比较的节点为(1+2+3+…+(n-1)+n)/n = (n+1)/2
答案:C
3、当n足够大时,下述函数中渐近时间最小的是____。
- A:T(n)= n log n − 1000 log n n\log n-1000\log n nlogn−1000logn
- B:T(n)= n log 3 − 1000 log n n\log 3-1000\log n nlog3−1000logn
- C:T(n)= n 2 − 1000 log n n^2-1000\log n n2−1000logn
- D:T(n)= 2 n log n − 1000 log n 2n\log n-1000\log n 2nlogn−1000logn
解析
ABCD四个选项时间复杂度依次为O( n log 2 n n\log_2 n nlog2n)、O(n)、O( n 2 n^2 n2)、O( n log 2 n n\log_2 n nlog2n)。所以n足够大时,时间复杂度最小的是O(n),选B。
答案:B
4、倒排文件包含有若干个倒排表,倒排表的内容是____。
- A:一个关键字值和该关键字的记录地址
- B:一个属性值和该属性的一个记录地址
- C:一个属性值和该属性的全部记录地址
- D:多个关键字和它们相对应的某个记录的地址
解析
有倒排索引的文件我们称为倒排索引文件,简称倒排文件。倒排索引,也常被称为反向索引,是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。倒排索引源于实际应用中需要根据属性的值来查找记录。这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址。
答案:C
5、下述编码中不是前缀码的是____。
- A:{0,10,110,111}
- B:{0,1,00,11}
- C:{1,01,000,001}
- D:{00,01,10,11}
解析
前缀编码是指对字符集进行编码时,要求字符集中任一字符的编码都不是其他字符的编码的前缀。选项B中0和00不符合前缀码要求。
答案:B
6、下面程序段的时间复杂度是_____。
i=s=0;
while(s<n)
{
i++;s+=i;
}
- A:O( log ( n ) \log(n) log(n))
- B:O( n \sqrt n n)
- C:O(n)
- D:O( n 2 n^2 n2)
解析
第一次执行完s+=i s=1
第二次s = 3 =1+2
第三次s = 6 =1+2+3
第四次s=10=1+2+3+4
第k次 1+2+3+4+…+k=
k
∗
(
k
+
1
)
2
{k*(k+1) \over 2}
2k∗(k+1)
那么当
k
∗
(
k
+
1
)
2
{k*(k+1) \over 2}
2k∗(k+1) >= n 的时候停止,也就是k=
8
n
+
1
−
1
2
{\sqrt{8n+1}-1 \over 2}
28n+1−1
所以复杂度时
n
\sqrt n
n
答案:B
7、在有向图中每个顶点的度等于该顶点的____。
- A:入读
- B:出度
- C:入读与出度之和
- D:入读与出度之差
解析
在有向图中每个顶点的度等于该顶点的入读与出度之和。
答案:C
8、具有n个顶点的无向完全图有____条边。
- A:n
- B:n*(n-1)/2
- C:n*(n+1)/2
- D:n*n/2
解析
具有n个顶点的无向完全图有n*(n-1)/2条弧
答案:B
9、下列程序段的时间复杂度是____。
count = 0;
for(k=1;k<=n;k*=2)
for(j=1;j<=n;j++)
count++;
- A:O( log 2 n \log_2 n log2n)
- B:O(n)
- C:O( n log 2 n n\log_2 n nlog2n)
- D:O( n 2 n^2 n2)
解析
内层循环条件j<=n与外层循环的变量无关,各自独立。每执行一次j自增1,每次内层循环都执行n次。外层循环条件k<=n,增量定义为k*=2,可知循环次数t满足k= 2 t 2^t 2t<=n,即t<= log 2 n \log_2 n log2n。即内层循环的时间复杂度为O(n),外层循环的时间复杂度为O( log 2 n \log_2 n log2n)。对于嵌入循环,根据乘法规则可知,该程序的时间复杂度T(n)= T 1 T_1 T1(n)* T 2 T_2 T2(n)=O(n)*O( log 2 n \log_2 n log2n)=O( n log 2 n n\log_2 n nlog2n)。
答案:C
10、一个算法所需时间由下述递归方程表示,试求出该算法的时间复杂度的级别(或阶)。式中n是问题的规模,为简单起见,设n是2的整数次幂。
T ( n ) = { 1 n = 1 2 T ( n 2 ) + n n > 1 T(n) = \begin{cases} 1 &n=1 \\ 2T({n \over 2})+n &n>1 \end{cases} T(n)={12T(2n)+nn=1n>1
解析
设n= 2 k 2^k 2k(k ≥ \ge ≥ 0),根据题目所给定义有T( 2 k 2^k 2k)=2T( 2 k − 1 2^{k-1} 2k−1)+ 2 k 2^k 2k= 2 2 T ( 2 k − 2 ) + 2 × 2 k 2^2 T(2^{k-2})+2\times2^k 22T(2k−2)+2×2k,由此可得一般递推公式 T ( 2 k ) = 2 i T ( 2 k − i ) + i × 2 k T(2^{k})=2^{i}T(2^{k-i})+i\times2^{k} T(2k)=2iT(2k−i)+i×2k,进而得 T ( 2 k ) = 2 k T ( 2 0 ) + k × 2 k = ( k + 1 ) 2 k T(2^{k})=2^{k}T(2^{0})+k\times2^{k}=(k+1)2^{k} T(2k)=2kT(20)+k×2k=(k+1)2k,即 T ( n ) = 2 log 2 n + log 2 n × n = n ( log 2 n + 1 ) , 也 就 是 O ( n log 2 n ) T(n)=2^{\log_2 n}+\log_2 {n\times n}=n(\log_2 n + 1),也就是O(n\log_2 n) T(n)=2log2n+log2n×n=n(log2n+1),也就是O(nlog2n)。