標籤:資料結構 mooc 大o記號 計算模型 演算法
1. 計算
學習DSA的目的是實現有效的和高效的計算,同時在資源消耗的方面做到足夠的低廉。
計算 = 資訊處理:藉助某些工具,遵照一定規則,以明確而機械的形式進行。
計算模型 = 電腦 = 資訊處理工具
演算法:在特定的計算模型下,旨在解決特定問題的指令序列。
演算法的要素:
|
輸入 |
待處理的資訊(問題) |
|
輸出 |
經處理的資訊(答案) |
|
正確性 |
的確可以解決指定的問題 |
|
確定性 |
任一演算法都可以描述為一個由基本操作組成的序列 |
|
可行性 |
每一基本操作都可實現,且在常數時間內完成 |
|
有窮性 |
對於任何輸入,經有窮次基本操作,都可以得到輸出 |
|
…… |
…… |
好演算法的要素:
|
正確 |
符合文法,能夠編譯、運行 |
|
健壯 |
能辨別不合法的輸入並做適當處理,而不致非正常退出 |
|
可讀 |
結構化 + 準確命名 + 注釋 |
|
效率 |
速度儘可能快,儲存空間儘可能少 |
2. 計算模型
演算法分析的兩個主要方面:
1. 正確性:演算法功能是否與問題要求一致。
2. 成本:已耗用時間 + 所需儲存時間。
如何度量成本?
1.特定演算法應用於不同執行個體:
問題:同一問題等規模的不同執行個體,計算成本不盡相同,甚至有實質差別。
例如:在平面上的n個點中,找到所形成三角形面積最小的三個點。以蠻力演算法為例,最壞情況下需枚舉C(n,3)種情況,運氣好時只需要1次。
結果:為了穩妥起見,在規模相同的所有執行個體中,只關注最壞(成本最高)者。
2.特定問題使用不同演算法:
問題:實驗統計是最直接的方法,但無法準確的反應演算法的真正效率。
例如:不同的演算法,可能更適應於不同規模的輸入。
不同的演算法,可能更適用於不同類型的輸入。
同一演算法,可能由不同的程式員、用不同的程式語言、經不同的編譯器實現。
同一演算法,可能實現並運行於不同的體繫結構、作業系統……
結果:為了給出客觀的評判,需要抽象出一個理想的平台或模型。不再依賴於上述種種具體的因素,從而直接而準確地描述、測量並評價演算法。
TM(TuringMachine)和RAM(Random AccessMachine)
TM模型和RAM模型是一般計算工具的簡化與抽象,使我們可以獨立於具體的平台,對演算法的效率做出可信的比較和評判。
在這些模型中,演算法的已耗用時間 ∝ 演算法需要執行的基本操作次數,T(n) = 演算法為求解規模為n的問題,所需執行的基本操作次數。
3. 大O記號(big-O notation)
漸進分析:當問題規模足夠大後,通過計算成本如何增長,可以得到這樣一條曲線:
但是我們所關心的並不是這條曲線局部的、細微的、暫時的一些趨勢,而是看它主要的、長遠的變化趨勢。
為此可以採用所謂的大O記號從形式上簡化成本:
T(n) = O(f(n)) iff ? c> 0 ,當 n >> 2後, 有 T(n) < c * f(n)
與f(n)相比,T(n)更為簡潔,但依然反映了前者增長的趨勢。
漸進分析還有其他記號,比如大Ω記號:
T(n) = Ω(f(n)) iff ? c > 0,當 n >> 2後, 有 T(n) > c * f(n)
大Θ記號:
T(n) = Θ(f(n)) iff ? c1 > c2 > 0,當 n >> 2後, 有 c1 * f(n) > T(n)> c2 * f(n)
大Ω記號表示函數的漸進下界,大Θ記號表示函數的漸進確界。
大O記號的兩條性質:
(1)對於任意常數c > 0,有O(f(n))= O(c * f(n))
(2)對於任意常數a > b > 0,有O(na + nb) = O(na)
通過大O記號對演算法進行度量,常見複雜度有:
複雜度增長速度對比:
4. 演算法分析
兩個主要任務= 正確性(不變性 x 單調性)+ 複雜度
C++等進階語言的基本指令,均等效於常數條RAM的基本指令。在漸進意義下二者大體相當。
複雜度分析的主要方法:
1.迭代:級數求和
2.遞迴:遞迴跟蹤 + 遞推方程
3.猜測 + 驗證
級數複雜度:
|
算術級數 |
與末項平方同階 |
|
冪方級數 |
比冪次高出一階 |
|
幾何級數 |
與末項同階 |
|
收斂級數 |
O(1) |
|
幾何分布 |
O(1) |
|
調和級數 |
Θ(logn) |
|
對數級數 |
Θ(nlogn) |
5. 迭代與遞迴
減而治之:為求解一個大規模的問題,可以將其劃分為兩個子問題:其中一個退化平凡,另外一個規模縮減。通過分別求出子問題的解得到原問題的解。
分而治之:為求解一個大規模的問題,可以將其劃分為若干(通常兩個)子問題,規模大體相當。通過分別求出子問題的解得到原問題的解。
註:第一次寫筆記加上第一章基本上都是基礎知識感覺好多都是直接搬的教材,希望後邊能好點吧。本課為清華大學鄧俊輝老師的資料結構課程,MOOC平台為學堂線上,開課時間是2014年的9月15日。如果感興趣的同學可以去看看,個人覺得還是講的相當好的。
[MOOC筆記]第一章 緒論(資料結構)