算法關注性能,但是有比性能更重要的,比如正確性,簡潔性,可維護性,穩定性,特徵性,模塊性,安全性,可拓展性,用戶友好性。那麼爲什麼還要關注性能,爲什麼還要研究算法?因爲性能可以當做一般的價值標準,類似金錢。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(對於用戶來說,用戶一般都希望知道最壞的情況是什麼樣,算是對用戶的承諾)
- 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)
- 忽略依賴機器的常量
- 不去關注運行時間,而是關注運行時間的增長
算法是用訪問內存的次數來衡量的。對於插入排序來說,T(n)=∑Θ(j)=Θ(n²)
Merge sort(歸併排序):把一個數組A[1,2,……,n]分爲兩個數組,分別排序後再歸併
T(n)=2T(n/2)+Θ(n),Θ(n)是歸併時所用的時間
使用遞歸樹(Recursion tree)能夠得到T(n)=cnlgn+Θ(n)=Θ(nlgn)