目录
Q1:
下列有关大O表示法的说法错误的是
A.大O表示法只是对程序执行时间的一个估算
B.大O表示法只保留最高阶项
C.大O表示法会保留一个系数来更准确的表示复杂度
D.大O表示法一般表示的是算法最差的运行时间
A1:
C.大O表示法会保留一个系数来更准确的表示复杂度是错误的。
解释:
A. 大O表示法主要用于描述算法的时间复杂度,是对算法运行时间的一个估算,但并不仅仅限于时间复杂度的估算,也可用于空间复杂度的估算。
B. 大O表示法在描述算法的时间复杂度时,只保留最高阶项,因为随着问题规模的增加,次高阶项和更低阶项对总时间的影响逐渐减小,最终可以忽略不计。
C. 大O表示法通常不会保留一个系数来更准确地表示复杂度,因为在算法分析中,常数项通常不是很重要,会随着具体实现方式和硬件环境的不同而变化。
D. 大O表示法通常表示的是算法最坏情况下的运行时间,因为最坏情况下的运行时间是保证算法运行时间的上限。
Q2:
分析以下函数的时间复杂度
void fun(int n) {
int i=l;
while(i<=n)
i=i*2;
}
A2:
该函数的时间复杂度是 O(log n)。
函数中的 while 循环的条件是 i<=n,每次迭代中 i 的值会乘以 2,因此,i 的值会以指数的方式增长。假设 i 的初始值为 l,则在执行循环体之前,i 的值为 l,每次迭代后 i 的值会变为 2i,因此,循环体将在 i 的值达到 n 之前执行 log2(n/l) 次。因此,函数的时间复杂度是 O(log n)。
Q3:
分析以下程序的时间复杂度
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
a[i][j]=i*j;
A3:
该程序的时间复杂度是 O(n^2)。
该程序中有两个嵌套的 for 循环,每个循环都迭代 n 次,因此,该程序的总运行时间是 O(n*n),即 O(n^2)。在内层循环中,每个数组元素都被访问了一次,这意味着该程序的时间复杂度与数组大小成正比。因此,如果数组大小为 m x m,则程序的时间复杂度将是 O(m^2)。
Q4:
下面算法的时间复杂度是
int f ( unsigned int n ) {
if (n == 0 || n==1)
return 1;
else
return n * f(n-1);
}
A4:
该递归函数的时间复杂度是 O(n)。
函数中的递归调用 f(n-1) 会被执行 n 次(从 n 到 1 ),每次递归调用需要执行一次乘法操作和一次函数调用,因此函数的总运行时间是 O(n)。虽然函数中有递归调用,但是由于每次递归调用的规模是逐渐缩小的,因此总的运行时间是线性的。
Q5:
给定一个整数sum,从有N个有序元素的数组中寻找元素a,b,使得a+b的结果最接近sum,最快的平均时间复杂度是( )
A5:
可以使用双指针法来解决这个问题,最快的平均时间复杂度是 O(N),其中 N 是数组中元素的数量。
具体实现步骤如下:
-
将指针 left 指向数组的第一个元素,将指针 right 指向数组的最后一个元素。
-
计算 left 和 right 指向的元素之和 sum = a[left] + a[right]。
-
如果 sum 大于目标值 target,则将 right 指针向左移动一位,以减小 sum 的值。
-
如果 sum 小于目标值 target,则将 left 指针向右移动一位,以增大 sum 的值。
-
如果 sum 等于目标值 target,则直接返回 sum。
-
在移动指针的过程中,记录最接近目标值的 sum 值,以及对应的 a[left] 和 a[right] 值。
-
当 left 和 right 指针相遇时,算法结束。
因为该算法只需要遍历一次数组,每次操作都只涉及到两个指针的移动和数值的比较,因此时间复杂度是 O(N)。
Q6:
设某算法的递推公式是T(n)=T(n-1)+n,T(0)=1,则求该算法中第n项的时间复杂度为()
A6:
根据递推公式 T(n) = T(n-1) + n,可以将 T(n) 展开为:
T(n) = T(n-1) + n = T(n-2) + (n-1) + n = T(n-3) + (n-2) + (n-1) + n = T(n-k) + (n-k+1) + ... + (n-2) + (n-1) + n
当 k=n 时,上式右边的式子变成了:
T(n) = T(0) + 1 + 2 + ... + n-1 + n
因此,第 n 项的时间复杂度为 O(n^2)。
可以使用等差数列求和公式来计算 1+2+...+n 的值,得到 T(n) 的简化式:
T(n) = T(0) + 1 + 2 + ... + n-1 + n = T(0) + n(n+1)/2 = O(n^2)
因此,该算法中第 n 项的时间复杂度为 O(n^2)。