這周的算法學習可以說有了更加明確的目標。學習起來也更有動力和積極性。現在調整了自己的學習方法,首先大概瀏覽每章的主要內容,知道大概的實現方法,等第二輪在進行實踐提高。
這周學的主要內容:第一章的4節,第二章的2、3、4節和第三章的第一節
第一章第四節:算法分析
主要從兩個方面來研究算法的性能,時間復雜度與空間復雜度。時間復雜度主要由cost model 來近似,研究流程如下:1、確定輸入模型(輸入如何影響輸出的),包括如何定義問題的規模。2、識別內循環(總循環次數最多的)。3、對內循環里的每條運算符定義它們對應的cost model。3、對于給定輸入,確定相應的指令執行的頻率。
一種實用的分析時間復雜度增長指數的方法:
簡化模型的一些不足:1、較小次冪項前大系數的忽略誤差。2、內循環并沒有在時間復雜度模型中起主導作用(樣本的數量不夠多,或者忽視了真正的內循環)。3、指令集的時間長短不是固定的(cache在處理內存過程中,在處理數組中相距較遠的元素時,指令會消耗更多的時間)。4、系統造成的誤差,使得系統的影響可以忽略或者在可控的范圍內。5、對輸入的變化不敏感。(輸出3-SUM的數量,和判斷是否存在3-SUM)。6、多重輸入變量的影響(算法內部的數據結構中包含的變量,區別于輸入值)。
消除輸入變量對于輸入的依賴性,除了更好地建模以外,我們還要提供最壞情況下的分析。以保證再輸入最不理想的情況下達到我們的實驗要求。
空間分析主要考慮一些內存的占用情況。包括一些程序語言對于內存調用情況的分析。《瘋狂JAVA講義》里面提到的一些初始化的內存調用情況分析,常見數據類型的占用內存大小。基本初始化和函數調用內存的情況的分析。棧內存與堆內存,對象調用數據類型時是通過棧內的引用變量,調用堆內存儲的數據。和基本初始化賦值時“值傳遞”的基本設計思想。“object overhead”內存情況要根據具體虛擬機的機制來解釋。
第二章第二節 歸并算法
歸并算法,其實就是利用二分原則,不斷調用本身,先產生最小長度的數組,利用merge method,進行合并。不斷的二分排序,最后合并成一個數組的過程,合并的兩個數組一定是排好序的數組。mergesort的時間復雜度分析,是通過確定比較次數來規定的(less指令)。最后的時間復雜度降到linearithmic.歸并算法的另一種歸并方向是通過由底向上,利用For循環來代替調用自身的指令。
第二章第三節 快速排序
快排相較于歸并,優勢在于當兩個個數組排好序的同時,整個數組也完成排序。節省了很多空間上的占用。
(未完待續)