[MIT6.006] 系列筆記將記錄我觀看《MIT6.006 Introduction to Algorithms, Fall 2011》的課程內容和一些自己補充擴展的知識點。該課程主要介紹了一些基礎的算法,課程主要內容分為以下八個模塊:
模塊 | 例子 |
Algorithmic Thinking 算法思維 | Peak Finding 峰值尋找 |
Sorting & trees 排序和樹 | Event Simulation 事務模擬 |
Hashing 哈希 | Genome Comparison 基因組對比 |
Numerics 數值 | RSA Encryption RSA加密 |
Graphs 圖 | Rubiks Cube 魔方 |
Shorest Paths 最短路徑 | Caltech -> MIT |
Dynamic Programming 動態規划 | Image Compression 圖片壓縮 |
Advanced Topics 高級主題 |
1. Algorithmic Thinking, Peak Finding 算法思維,峰值尋找
假設有一個如下圖的一維數列,格子下的數字代表它們的索引位置,位置2為峰值peak,b必須滿足:b≥a和b≤c。如果位置9為峰值,i≥h。這里是含有‘等於’是因為峰值尋找是建立“任何數列都存在峰值”的假設上。
直接采用最簡單且最直接的峰值尋找方式,它的時間復雜度是ο(n)。為了實現更快的查詢方法,我們可以采用二分查找(Binary Search)的思想,如下圖所示:
二分尋找峰值法主要步驟(假設上圖數列為a,長度為n):
- 先找到中間位置的數值a[n/2];
- if a[n/2]<a[n/2 - 1],則在左邊1至n/2 - 1的元素中尋找峰值;
- else if a[n/2]<a[n/2 + 1],則在右邊n/2 + 1至n的元素中尋找峰值;
- else: n/2位置上的元素是峰值。
二分峰值尋找法的時間復雜度是ο(log2n)。跟二分法類似思路的時間復雜度常與log2n掛鈎。
假設有一個如下圖的二維網格圖,如果a≥b, a≥d, a≥c, a≥e,則a是2D-peak。
如果采用如下圖所示的貪心算法,它的時間復雜度是ο(nm)。
而另一種方法是加入了二分查找思路去做:
如上圖所示:
- 首先,選中間列 j=m/2;
- 遍歷列j的所有元素,找到列j的全局最大值val(i, j);
- 對比val(i, j-1), val(i, j), val(i, j+1);\
- 如果val(i, j-1) > val(i, j),選擇左邊列繼續重復以上步驟。相似地,如果val(i, j+1) > val(i, j),選擇右邊列重復上面步驟。如果val(i, j)≥val(i, j-1)和val(i, j+1),則val(i,j )就是2D-peak。
二分查找2D峰值的時間復雜度是ο(nlog2m),即在行(n)上尋找最大值 * 在列(m)上進行二分查找。