簡體   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