核心概念#

本附錄介紹計算複雜度的基本概念,這是衡量算法好壞的客觀標準。優秀的程式員總是不斷尋找更好的算法,而在所有「好」算法中存在一個最優的算法——找到它是計算機科學家努力的目標。

大 O 記號與複雜度衡量#

  • 計算量是問題規模 $N$ 的函數 $f(N)$,用大 $O$ 記號表示其上界(或下界)
  • 若 $f(N) = N \cdot \log N$ 且 $g(N) = 100 \cdot N \cdot \log N$,兩者在大 $O$ 概念下相同,屬於同一數量級
  • 複雜度關鍵看 $O$ 括號裡的函數部分,而非常數因子。例如 $10000 \cdot N \cdot \log(N)$ 當 $N$ 足夠大時遠小於 $0.00001 \cdot N^2$

常見算法的複雜度#

問題/算法複雜度說明
哈希查找$O(1)$常數複雜度
有序數組二分查找$O(\log N)$對數複雜度
無序數組任意元素查找$O(N)$線性複雜度
圖遍歷算法$O(N)$節點數 $N$ 的線性複雜度
快速排序算法$O(N \log N)$
動態規劃/最短路徑$O(d^2 \cdot N)$深度 $d$ 的平方複雜度,長度 $N$ 的線性複雜度
鮑姆-韋爾奇算法$O(d^2 \cdot N)$同上
貝葉斯網路訓練算法NP 完全尚未找到多項式複雜度算法

P 問題與 NP 問題#

  • P 問題(Polynomial):計算量不超過 $N$ 的多項式函數,被認為計算機可以「有效」解決
  • NP 問題(Nondeterministic Polynomial):能在多項式時間內驗證一個答案的正確與否,但不一定能在多項式時間內找到答案
  • NPC 問題(NP-Complete):1970 年代初,庫克(Stephen Cook)和李文(Leonid Levin)發現所有 NP 問題都可以在多項式時間內歸約到 NPC 問題。若任何一個 NPC 問題找到多項式算法,則 NP=P
  • NP-Hard 問題:計算複雜度至少是 NP 完全甚至更大的問題

P 是否等於 NP 是計算機科學中最重要的未解問題之一。目前多數學者相信 P ≠ NP,但尚無定論。

本附錄小結#

數學在計算機科學中的一個重要作用,就是找到計算複雜度盡可能低的解。對於那些至今找不到多項式算法而又無法迴避的問題(如貝葉斯網路訓練),我們只好簡化問題找近似解。