时间复杂度Q&A

目录

Q1:

A1:

Q2:

A2:

Q3:

A3:

Q4:

A4:

Q5:

A5:

Q6:

A6:


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 是数组中元素的数量。

具体实现步骤如下:

  1. 将指针 left 指向数组的第一个元素,将指针 right 指向数组的最后一个元素。

  2. 计算 left 和 right 指向的元素之和 sum = a[left] + a[right]。

  3. 如果 sum 大于目标值 target,则将 right 指针向左移动一位,以减小 sum 的值。

  4. 如果 sum 小于目标值 target,则将 left 指针向右移动一位,以增大 sum 的值。

  5. 如果 sum 等于目标值 target,则直接返回 sum。

  6. 在移动指针的过程中,记录最接近目标值的 sum 值,以及对应的 a[left] 和 a[right] 值。

  7. 当 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)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秣小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值