演算法分析:
是對計算機效能以及計算機資源的研究除去【效能】,程式還有哪些重要的性質:
即使存在著以上這些比效能更加重要的特質,那麼為什麼還要研究演算法與效能?
問題描述:將一系列元素(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個元素的陣列。你從第二種牌開始進行調動,如果第二張牌比第一張牌小,那麼就把第二張牌抽出來,然後把第一張牌放入到第...