正在载入在线练习界面,本页内容可直接阅读…

AK CSP › CSP-S 2023 第一轮真题 › 第15题

CSP-S 2023 第一轮 第15题:现在用如下代码来计算x",其时间复杂度为()

单项选择 · 算法概念与复杂度分析 · 答案 A

题目

现在用如下代码来计算 $x^n$,其时间复杂度为()。

double quick_power(double x, unsigned n) {
    if (n == 0) return 1;
    if (n == 1) return x;
    return quick_power(x, n / 2)
        * quick_power(x, n / 2)
        * ((n & 1) ? x : 1);
}

选项

  • A. $O(n)$
  • B. $O(1)$
  • C. $O(log n)$
  • D. $O(n \log n)$

答案

A

题解

选 A. \(O(n)\)。

关键在于:代码把 quick_power(x, n / 2) 调用了两次,每次都会重新计算,所以时间复杂度的递推式为: \[ T(n)=2T(\lfloor n/2\rfloor)+O(1). \]

从递归树来看:

  • 第 0 层有 1 次调用;
  • 第 1 层有 2 次调用;
  • 第 2 层有 4 次调用;
  • ……
  • 递归深度约为 \(\log_2 n\),最后一层约有 \(n\) 次调用。

总调用次数约为: \[ 1+2+4+\cdots+n=2n-1, \] 因此时间复杂度为 \(O(n)\)。注意:递归深度是 \(O(\log n)\),不代表总运行时间也是 \(O(\log n)\)。

如果把重复计算的结果保存下来: ``cpp double half = quick_power(x, n / 2); return half * half * ((n & 1) ? x : 1); `` 每层就只递归一次,此时时间复杂度才是 \(O(\log n)\)。

真题版权归 CCF 所有,本站仅用于非商业教学用途。页面加载后可直接在线作答,作答记录保存在本浏览器或账号中。 京ICP备2026056990号-1 京公网安备11010502062986号