1. 計算復雜性 O
這是描述一種算法需要多少 Running time 的度量。(也有空間復雜性,但因為它們能相互轉換,所以通常我們就說時間復雜性。對于大小為 n 的輸入,我們用含 n 的簡化式子來表達。(所謂簡化式子,就是忽略系數、常數,僅保留最“大”的那部分)。
比如找出 n 個數中最大的一個,很簡單,就是把第一個數和第二個比,其中大的那個再和第三個比,依次類推,總共要比 n-1 次,我們記作 O(n) (對于 n 可以是很大很大的情況下,-1可以忽略不計了)。
再比如從小到大排好的 n 個數,從中找出等于 x 的那個。一種方法是按著順序從頭到尾一個個找,最好情況是第一個就是 x,最壞情況是比較了 n 次直最后一個,因此最壞情況下的計算復雜度也是 O(n)。還有一種方法:先取中間那個數和 x 比較,如偏大則在前一半數中找,如偏小則在后一半數中找,每次都是取中間的那個數進行比較,則最壞情況是 lg(n)/lg2。忽略系數lg2,算法復雜度是O(lgn)。
2. 計算復雜性的排序
根據含 n 的表達式隨 n 增大的增長速度,可以將它們排序:1 < lg(n) < n < nlg(n) < n^2 < ... < n^k (k是常數)< ... < 2^n (不用死記,想象它們的函數曲線,一看便明)。最后這個 2 的n 次方就是級數增長了,讀過棋盤上放麥粒故事的人都知道這個增長速度有多快。而之前的那些都是 n 的多項式時間的復雜度。為什么我們在這里忽略所有的系數、常數,例如 2*n^3+9*n^2 可以被簡化為 n^3?老師上課也沒有說原因,所以我也不知道。但是如果對對 (2*n^3+9*n^2)/(n^3) 求導,結果是0,仔細想想,我也沒有想出所以然來。
3. P 問題
對一個問題,凡是能找到計算復雜度可以表示為多項式的確定算法,這個問題就屬于 P (polynomial) 問題。
4. NP 問題
NP 中的 N 是指非確定的(non-deterministic)算法,這是這樣一種算法:
(1)猜一個答案。(2)驗證這個答案是否正確。(3)只要存在某次驗證,答案是正確的,則該算法得解。
NP (non-deterministic polynomial)問題就是指,用這樣的非確定的算法,驗證步驟(2)有多項式時間的計算復雜度的算法。
5. 問題的歸約
想象一下函數的映射是怎么一回事吧。這個概念需要弄懂。
大致就是這樣:找從問題1的所有輸入到問題2的所有輸入的對應,如果相應的,也能有問題2的所有輸出到問題1的所有輸出的對應,則若我們找到了問題2的解法,就能通過輸入、輸出的對應關系,得到問題1的解法。由此我們說問題1可歸約到問題2。
再給一個我找到的高端解釋:
問題歸約是人求解問題常用的策略,其把復雜的問題變換為若干需要同時處理的較為簡單的子問題后再加以分別求解。只有當這些子問題全部解決時,問題才算解決,問題的解答就由子問題的解答聯合構成。問題歸約可以遞歸地進行,直到把問題變換為本原問題的集合。所謂本原問題就是不可或不需再通過變換化簡的"原子"問題,本原問題的解可以直接得到或通過一個"黑箱"操作得到。
6. NP-Hard
有這樣一種問題,所有 NP 問題都可以歸約到這種問題,我們稱之為 NP-hard 問題。
7. NP完全問題 (NP-Complete)
如果一個問題既是 NP 問題又是 NP-Hard 問題,則它是 NP-Complete 問題。可滿足性問題就是一個 NP 完全問題,此外著名的給圖染色、哈密爾頓環、背包、貨郎問題都是 NP 完全問題。