1. 程式人生 > >資料結構與演算法學習筆記 2 (2018.10.06)

資料結構與演算法學習筆記 2 (2018.10.06)

演算法分析

  • 兩個主要方面:

                 正確性:演算法的功能與問題要求一致?

                                 數學證明?可不那麼簡單...

                   成本:執行時間 + 所需儲存空間

                                如何度量?如何比較?

  • 考察:T_A(P)=演算法A求解問題例項P的計算成本

                                 意義不大,畢竟...可能出現的問題實列太多

                                 如何歸納概括?

  • 觀察:問題例項的規模往往是決定計算成本的主要因素
  • 通常:規模接近,計算成本也接近

                    規模擴大,計算成本亦上升

特定演算法 + 不同實列

  • ​​​​​​令T_A(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'     

  •