我決定啃幾個大塊頭,今天開始跟着公開課學習,一是鞏固自己對算法理解,二是可以分享學習心得。
普林斯頓大學的算法課好像也講完了,只有講義,好像還沒視頻,下面我先學麻省理工的算法導論課。
我是一個懶孩子,希望大家監督我。沒有監督,俺繼續不下去,呃哈哈。謝謝。
為什么學習算法?
(1)什么比性能更重要?正確性,簡潔,可維護性,成本開銷,功能性,模塊化,安全,可擴展性,用戶體驗等。
(2)如果算法和性能不重要,為啥關注呢?為什么學習?性能與體驗關聯,實時性,性能是其他的基礎,性能就像貨幣,你用java來代替c,損失三倍性能,為的是其他方面的優越性,比如對象化,exception機制等。
排序問題
(1)插入排序(Insert Sort)
插入排序分析:
運行時間依賴於輸入,比如輸入的個數,輸入的排序情況。移動、比較的次數可作為衡量時間復雜性的標准。
最大時間(最壞情況,是一個承諾,一個保證):輸入逆序。
比較次數:(n+2)(n-1)/2
移動次數:(n+4)(n-1)/2
平均時間(時間的期望值):n+假設的輸入分布,比如均勻分布。
最少時間(最好情況):輸入正序。
比較次數:n-1
移動次數:0
插入排序快不快?當n很小的時候,挺快,當n很大,就會很慢,通常n<=8。
(2)歸並排序(Merge Sort)
將兩個已經排序的序列合並成一個序列的操作。歸並排序算法依賴歸並操作。
歸並排序分析:
在實際中,當n>30的時候,歸並排序將打敗插入排序。
比較操作的次數介於 和
。
賦值操作的次數是。