MIT演算法導論 演算法分析與基礎知識

2021-10-24 08:49:05 字數 3111 閱讀 2364

演算法分析:

是對計算機效能以及計算機資源的研究

除去【效能】,程式還有哪些重要的性質:

即使存在著以上這些比效能更加重要的特質,那麼為什麼還要研究演算法與效能?

問題描述:將一系列元素(a1,a2,…an)進行排序後重新輸出,要求排序後的元素是非遞減的。

問題解決:插入排序等多種經典排序方案

概念、過程與思想

(1)本質:就是程式始終維持乙個有序的部分,表示陣列中已經排序好的部分;而程式執行就是為了能夠使得這一部分不斷增長,直到陣列的所有部分都是排序好的。

(2)過程:偽**+過程理解

void

insertionsort

(a,n)//對陣列a[1...n]中的元素進行排序

a[i+1]

= key;

}}

①上述第乙個for迴圈,是每次都考慮乙個未有序部分的元素。

②第二個while迴圈,就是對每乙個元素,選擇乙個合適的位置進行插入,而插入點之後的元素,都要順次後移乙個位置。

執行時間分析

執行時間runtime相關的因素:

輸入本身(結構)/

輸入規模 /

執行時間的上界

(1)最好結果

是考慮了某些特定的輸入,具有欺騙性質的假象,作用不大。

(2)平均結果

考慮乙個加權平均的計算,每一種可能出現的輸入的耗時和該情況出現的概率對應的加權平均。

如何得知每種執行結果的概率呢?

——需要做乙個假設,假定運**況結果符合均勻分布。

(3)最壞結果

——忽略掉那些依賴於機器的常量

——不是去檢查實際的執行時間,而是關注執行時間的增長

【關注時間增長的思路】漸進符號

θ符號,其作用是:為寫進的公式,捨去它的低階項,忽略前面的常數因子。

漸進符號的意義

e.g.乙個θ(n2)的演算法始終要比θ(n2)的演算法執行快

①理解1:當n→∞時,你始終可以找到乙個n,使得n2小於n3

②理解2:上述結論縱然是在乙個慢速計算機上也是適用的。

漸進符號能同時滿足我們對相對和絕對速度的雙重比較。

從工程角度合理利用漸進思想

①在以上的兩個圖形比較下,總能找到乙個輸入規模狀態點n0,使得之後所有n3都要慢於n2。

②但是很多時候,n0這個點在實際工程問題中可能因為過大而不合理。所以我們常常也會關注一些慢速演算法,因為它們仍然可以在合理規模的輸入下執行得更快

分析原則

①因為是漸進分析,所以我們把過程中的每項操作都看成是相差無幾的基本操作

②我們採用計數的方法,是記憶體引用計數,實際上訪問了某個變數的次數。

③因為是worst case,所以考慮的是對輸入逆序的一組元素,通過排序排列成正序的情況。

分析結果

根據漸進分析,在輸入規模較小的情況下,插入排序的效率還是可觀的,但是輸入規模一旦增大,則效率會降低。

演算法框架和偽碼表示

void

mergesort

(a)//對陣列a[1...n]中的元素進行有向排序

(1)思想:歸併排序的本質就是,分而治之。先讓待排序的一組元素,分成兩組已經有序的元素,再對這兩組已經有序的元素進行合併。

(2)merge操作的理解

//對有序陣列a和有序陣列b中的元素進行合併

void

merge()

else

}while

(ilength()

)while

(jlength()

)}

時間複雜度的漸進分析

(1)merge操作的漸進分析

(2)遞迴程式的時間遞迴推導

(3)推導出t(n)的通用表示式——遞迴樹方法

在漸進情況下,nlogn的複雜度是要低於n2的複雜度的。

也就是說,漸進情況下,歸併排序勝過插入排序。

MIT的演算法導論課程資料

mit的演算法導論第一節課上,教授就說得了演算法的performance的重要性,並非簡單的只是快一點,慢一點,而是整個解決方案可行與不可行的差別。作為乙個學生來說,在 演算法導論 和 計算機程式設計藝術 兩本最經典書來說,應該選擇 演算法導論 來讀,這樣讀起來更加容易。如果我還能回到剛入大學的時候...

演算法導論 一 演算法基礎

迴圈不變式主要用來幫助我們理解程式的正確性。迴圈不變式的三條性質 初始化 迴圈的第一次迭代之前,它為真。保持 如果迴圈的某次迭代之前它為真,那麼下次迭代之前它仍為真。終止 再迴圈終止時,可驗證演算法的正確性。偽 的重要性在於它可以簡潔地表達出演算法的本質 縮排代表塊結構 採用縮排代表塊結構可以大大提...

演算法導論之演算法基礎(三)

插入排序 模擬 如果你會玩鬥地主,那麼摸牌後按從小到大插入,你這樣插入的過程就是插入排序 程式 在程式中的玩法就像有乙個人發牌,發齊了再拿牌,也就是一開始你就有17張牌,這17張牌對應17個元素的陣列。你從第二種牌開始進行調動,如果第二張牌比第一張牌小,那麼就把第二張牌抽出來,然後把第一張牌放入到第...