麻省理工算法導論公開課(1)

算法關注性能,但是有比性能更重要的,比如正確性,簡潔性,可維護性,穩定性,特徵性,模塊性,安全性,可拓展性,用戶友好性。那麼爲什麼還要關注性能,爲什麼還要研究算法?因爲性能可以當做一般的價值標準,類似金錢。Java現在非常流行,它比C大概要浪費三倍左右的時間,但是它提供了面向對象的機制,異常處理等功能。這時,就相當於犧牲了三倍左右的性能,來換取更爲需要的性質。

Problem:Sorting

Insertion sort(插入排序):插入到已經排序好的序列中

“……(sorted) j ……(unsorted)”,key指向j位置,j位置之前的序列已經排序好了,把j位置的元素插入到前面合適的位置,然後key向後移動一位。

Running time:

  • Depends on input(e.g. already sorted)
  • Depends on input size
  • Want upper bounds(對於用戶來說,用戶一般都希望知道最壞的情況是什麼樣,算是對用戶的承諾)
Kinds of analysis:

  • Worst-case(ususally):
    T(n)=max time on any input of sizen
  • Average-case(sometimes):
    T(n)=expected time over all input of sizen(Need assumption of stat. distr.
  • Best-case(Bogus)
BIG IDEAS! asymptotic analysis(漸進分析)

  1. 忽略依賴機器的常量
  2. 不去關注運行時間,而是關注運行時間的增長
漸進符號:Θ,Ο,Ω

算法是用訪問內存的次數來衡量的。對於插入排序來說,T(n)=∑Θ(j)=Θ(n²)

Merge sort(歸併排序):把一個數組A[1,2,……,n]分爲兩個數組,分別排序後再歸併

T(n)=2T(n/2)+Θ(n),Θ(n)是歸併時所用的時間

使用遞歸樹(Recursion tree)能夠得到T(n)=cnlgn+Θ(n)=Θ(nlgn)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章