1. 程式人生 > >MIT公開課:算法導論 筆記(一)

MIT公開課:算法導論 筆記(一)

數組 數學 can div 大局觀 一課 漸近符 bsp 貨幣

課程鏈接:http://open.163.com/special/opencourse/algorithms.html

第一課:算法分析基礎

1.介紹插入排序與歸並排序,計算並比較最壞運行時間

2.算法分析重點與漸近分析方法

以下為個人筆記,根據字幕整理


第一課 算法分析
總結 解決問題的方法和方式
算法:關於計算機程序性能和資源利用的研究

算法:性能、速度

在程序設計方面,什麽比性能更重要呢?
  正確性,可維護,健壯性
  模塊化,安全,用戶友好

為什麽關註性能?
1.直接決定方法可行不可行
  算法能將不可行變為可行
2.算法是一種描述程序行為的語言
  思考程序的最簡潔方式

性能是支付其他東西的“貨幣”
安全 用戶友好 健壯性
| | | |
性能
衡量代價的一般標準

為什麽關註速度?
追求速度是人的天性

、、、、、、、、、、、、、、

排序算法

排序問題的一般描述
輸入:序列 a1, a2, a3, ..., an
按需求重新排序
輸出:序列 b1, b2, b3, ..., bn

1.插入排序

偽代碼描述:
理解算法要描述的意思,簡潔
使用縮進表示嵌套

按照升序排列

for j<- 2 to n
  do key<- A[j] //從數組A中取值
  i<- j-1
  while i>0 and A[i]> key //前向查找較大值
    do A[i+1]<- A[i]
    i<- i-1 //i遞減至0
  A[i+1]<- key


實例 8 2 4 9 3 6
一次 2 8 4 9 3 6
二次 2 4 8 9 3 6
三次 2 4 8 9 3 6
四次 2 3 4 8 9 6
五次 2 3 4 6 8 9


最壞情況分析
最大占首位,最小占末位

操作數計數:內存引用計數
T(n) = sum _{2->n}( theta(j) )
算術級數 theta(n^2)

小規模n 快速
大規模n 慢
、、、、、、、、、、、、、、、、、、、、、、、、、、


程序分析:
1.運行時間
輸入是否有序
輸入規模
運行時間上界:對用戶的承諾

最關註:
最壞情況分析
T(n) 輸入規模為n時的運行時間上界
平均情況分析
T(n) 輸入規模為n時,運行時間的期望值

算法的大局觀
1.算法涉及諸多領域
2.解決復雜問題

漸近分析
1.忽略依賴於機器的常量
2.關註運行時間的增長,而不是運行時間

相對速度 絕對速度

漸近符號
theta符號函數
theta(n) = 3n^2 + 9n^2 + 5n
去掉常數項、低階項

數學的嚴謹,工程的直覺
在兩者間找到一種平衡,較好的算法

低速算法
當輸入規模在合理範圍時,運行速度較快

、、、、、、、、、、、、、、、、、、、、、、、、、、、

歸並排序
if n==1 done
else recursively sort
  A[1 ... celi(n/2) ] //ceil向上取整
  A[ celi(n/2)+1 ... n ]
last merge 2 sub sorted list

歸並子程序

兩個子排序結果:
list[1] 20 13 7 2
list[1] 12 11 9 1

遍歷與歸並時間
T(n)

遞歸式
n=1 T(n)=theta(1)
n>1 T(n)=2T(n/2)+theta(n)
-----------------------
如何求解遞歸式?
-----------------------
遞歸樹
T(n)
T(n/2) T(n/2)
T(n/4) ... T(n/4)
... ...
T(1) ... ... T(1)

計算量
C(n)
C(n/2) C(n/2)
C(n/4) C(n/4)
... ...
C(1) ... ... C(1)

高度 log(n)
葉節點數目 n
計算量

cn*log(n) + theta(n)
=theta(n*log(n))

as long as you are rigorous and precise,
you can be as sloppy as you want.
只要你嚴格而精確,可以略去任意細節

MIT公開課:算法導論 筆記(一)