漸進分析——大O、成長率與成本模型

多項式對指數成長

整個成長階層中最重要的對比,就在多項式成長(如 n^2 或 n^10)與指數成長(如 2^n)之間。初次相遇時它們感覺相似,實則天差地遠:每個多項式,無論多陡,最終都會被每個指數輾碎。這道鴻溝正是電腦科學家把問題分成「可有效解」與「未知是否可有效解」的原因。

關鍵事實,精確地說:對任何固定指數 k 與任何底數 b > 1,n^k / b^n 在 n 趨於無窮時的極限為 0。換言之,n^k = o(b^n):無論 k 多大、底數 b 多接近 1,多項式都是指數的小o。直覺是:每當 n 增加 1,指數就乘上一個常數倍(2^(n+1) = 2 乘 2^n),而多項式只加上一個逐漸縮小的分數;反覆相乘總會超越反覆相加。具體地說,n^10 在約 n = 60 之前比 2^n 大,但越過之後指數就拉開且永不回頭,變成數百萬、進而數兆倍地更大。

為何這如此重要:指數時間演算法在極小輸入之外通常毫無用處,因為輸入只多加一個元素,執行時間就可能加倍。多項式演算法則優雅地擴展——輸入加倍只把時間乘上固定倍率(n^2 是 4 倍、n^3 是 8 倍)。誠實的細節是:「多項式」是個粗糙的標籤:n^100 演算法是多項式卻在實務上無望,而 1.001^n 演算法是指數卻對中等 n 還好。多項式與指數的界線是正確的第一刀,而非最終定論。

暴力枚舉 n 個物品的所有子集合花 2^n。n = 20 時約一百萬(瞬間);n = 40 時約一兆(數分鐘到數小時);n = 60 時超過一百京(實際上不可能)。多項式方法,比如 n^3,在這些相同規模下只花 8000、64000、216000——相比之下完全可忽略。

多加一個輸入元素,指數成本加倍,多項式成本卻幾乎不變。

「多項式 = 好、指數 = 壞」是正確的經驗法則,但非絕對:n^100 的多項式不切實際,而 1.001^n 的指數對中等 n 還好。常數與指數仍然重要。

又稱
n^k versus 2^nthe tractability gap可解性鴻溝