我想對O(N)函數做一些說明。我正在使用SICP。遞歸算法中的基本情況和時間複雜度
考慮,在僞代碼生成一個遞歸過程書中的階乘函數:
function factorial1(n) {
if (n == 1) {
return 1;
}
return n*factorial1(n-1);
}
我不知道如何來衡量的步數。也就是說,我不知道如何「一步」的定義,所以我用的語句從書中定義步:
因此,我們可以計算N!通過計算(n-1)!並將 結果乘以n。
我認爲這是他們的意思一步。對於一個具體的例子,如果我們跟蹤(階乘5),
- 階乘(1)= 1 = 1步驟(基礎案例 - 恆定的時間)
- 階乘(2)= 2 *階乘(1)= 2步驟
- 階乘(3)= 3 *階乘(2)= 3步
- 階乘(4)= 4 *階乘(3)= 4步
- 階乘(5)= 5 *階乘(4) = 5步
我認爲這確實是線性的(數字的步驟與n)成正比。
另一方面,這裏是另一個因素,我看到的基本情況略有不同。
function factorial2(n) {
if (n == 0) {
return 1;
}
return n*factorial2(n-1);
}
這是完全一樣的第一個,除了另一個計算(步驟)加入:
- 階乘(0)= 1 = 1步驟(基礎案例 - 恆定的時間)
- 因子(1)= 1 *階乘(0)= 2個步驟
- ...
現在我相信這仍然是O(N),但我是正確的,如果我說factorial2更像O(n + 1)(其中1是基本情況),而不是恰好爲O(N)的factorial1(包括基本情況)?
Big-O符號只關心最高級別。 O(n + 1)不存在,它是O(n)。 – Eric
@Eric O(N + 1)確實存在。是O(n + 1)等同於O(n),但是大O的定義中沒有任何內容指定O(n + 1)比O(n)更不有效。 O(n)顯然是更常見的形式,因爲它很方便。你說的有點像說2/4不存在,因爲它真的是1/2。 – gbtimmon