繁体   English   中英

理解示例 16 从 Big O 表示法打印 2 的幂 - 破解编码面试

[英]Understanding Example 16 printing the powers of 2 from Big O notation - Cracking the Coding Interview

作者是否错过了计算 I/O 调用?

下面的 function 打印从 1 到 n(含)的 2 的幂。 例如,如果 n 为 4,它将打印 1,2 和 4。它的运行时间是多少?

int powersOf2(int n) {
  if (n < 1) {
    return 0;
  } else if (n == 1) {
    System.out.println(1);
    return 1; 
  } else {
    int prev = powersOf2(n / 2); 
    int curr =prev * 2; 
    System.out.println(curr); 
    return curr;
  }
}

运行时间是 O(log n)

根据示例 12(字符串排列), System.out.println()调用的参数长度是有意义的:

执行第 7 行需要 O(n) 时间,因为需要打印每个字符

从 I/O 的角度来看,我们需要打印从 0 到 K 的 2 的幂,其中 K 是 [log(N)],2 X要打印的字符数是[1 + X/log(10)] ,所以要打印的字符总数为[K + 1 + K*(K+1)/2log(10)]并且运行时间为 O(log 2 N) 但不是 O(log N)

PS。

示例 15 - 打印记忆的斐波那契数似乎有同样的缺点:

void allFib(int n) {
  int[] memo = new int[n + 1]; 
  for (int i = 0; i < n; i++) {
    System.out.println(i + ": " + fib(i, memo));
  }
}

int fib(int n, int[] memo) {
  if (n <= 0) return 0;
  else if (n == 1) return 1;
  else if (memo[n] > 0) return memo[n];
  memo[n] = fib(n - 1, memo) + fib(n - 2, memo);
  return memo[n];
}

我们正在做 N 次恒定数量的工作,所以这是 O(n) 时间。

为前 N 个斐波那契数列打印的字符数 ~ N 2 ,因此运行时间应该是 O(N 2 )。

你是对的。 打印出的字符总数为 Θ(log 2 n),因此代码完成的工作总量为 Θ(log 2 n) 而不是 O(log n),假设我们计算成本打印每个字符。 在进行粗略的大 O 计算以忽略打印结果的成本时,这有点常见,尽管在 Theoryland 中您必须考虑这些成本。

话虽如此,人们可以提出一个合理的论点,即任何int值在计算机上打印时占用固定数量的字符(在 32 位机器上打印 32 位 integer 最多需要 11 个字符,在 64-位机打印 64 位 integer 最多需要 21 个字符等)。 因此,您可以争辩说,对于任何固定机器,打印任何 integer 的成本都是 O(1),尽管实际上有一些辅助参数 w 表示机器字的大小,而打印 w 位 integer 的成本是 O( w)。

对于学习推理 big-O 的介绍性练习,我认为掩盖这个细节在教学上很好。 但如果我要教授更高级的理论课程,我们肯定需要考虑这些成本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM