資料結構與演算法學習筆記 2 (2018.10.06)
演算法分析
- 兩個主要方面:
正確性:演算法的功能與問題要求一致?
數學證明?可不那麼簡單...
成本:執行時間 + 所需儲存空間
如何度量?如何比較?
考察:(P)=演算法A求解問題例項P的計算成本
意義不大,畢竟...可能出現的問題實列太多
如何歸納概括?
- 觀察:問題例項的規模,往往是決定計算成本的主要因素
- 通常:規模接近,計算成本也接近
規模擴大,計算成本亦上升
特定演算法 + 不同實列
- 令(n)=用演算法A求解某一問題規模為n的實列,所需的計算成本討論特定演算法A(及其對應的問題)時,簡記作T(n)
- 然而,這一定義仍有問題...
- 觀察:同一問題等規模的不同實列,計算成本不盡相同,甚至有實質差別
- 例如:在平面上的n個點中,找到所成三角形面積最小的三個點。
以蠻力演算法為例,最壞情況下需列舉所有(n,3)種組合。
但運氣好的話...可能只需一次就找到(三個點幾乎在一條線上,面積無限接近於0)。
- 既然如此,又該如何定義T(n)呢?
- 穩妥起見,取T(n)= max { T(p) | |p| = n },亦即,在規模相同為n的所有例項中,只關注最壞(成本最高)者
特定演算法 + 不同演算法
- 同一問題通常有多種的演算法,如何評判其優劣?
- 實驗統計是最直接的方法,但足以準確反映演算法的真正效率嗎?
- 不足夠!!!
不同演算法,可能更適應於不同規模的輸入
不同的演算法,可能更適應與不同型別的輸入
同一演算法,可能由不同的程式設計師
,用不同程式語言,經不同編譯器實現 同一演算法,可能實現並運行於不同的體系結構,作業系統...
- 為給出客觀的評判,需要抽象出一個理想的平臺或模型
不再依賴於上述種種具體的因素
從而直接而準確地描述,測量並評價演算法
TM:Turing Machine (圖靈機)
- Tape 依次均勻地劃分為單元格,各注有某一字元,預設為‘#’
- Alphabet 字元的種類有限
- Head 總是對準某一單元格,並可讀取和改寫其中的字元
每經過一個節拍,可轉向左側或右側的鄰格
- State TM總是處於有限種狀態中的某一種
每經過一個節拍,可(按照規則)轉向另一種狀態
- Transition Function :( q,c;d,L/R,p)
若當前狀態為q且當前字元為c,則當前字元改寫為d;轉向左側/右側的鄰格;轉入p狀態,一旦轉入待定的狀態'h',則停機
TM:Increase
- 功能:
將二進位制非負整數加一
- 演算法:
全'1'的字尾翻轉為全'0'
原最低位的'0'或’#'翻轉為'1'