看《introduction to algorithms, second editon》,裡面提到插入排序和選擇排序,這兩個演算法的時間複雜度是一樣的。比較這兩個演算法的時候,我發現其實它倆是一回事。插入排序是把新元素插入到已經排好了序的序列裡,我們知道執行當前操作需要插入的數字;而在選擇排序中,需要插入的新元素是未知的(需要選取),但是插入的位置是已知的。插入排序是插入的元素已知,選擇排序是插入的位置已知,插入排序插入新元素的過程與選擇排序選擇元素的過程相同。
書中描述演算法的時候,元素都是放在陣列中的,所以插入排序的時間複雜度為n的2次方,其中大部分時間用在了移動陣列原素上。如果我們用鍊錶而不是陣列來儲存資料,花在移動資料上的時間省掉了,時間複雜度是不是變為n了?難道這就是傳說中的以空間換時間?
書裡提到的loop invariants證明方法對理清思路很有幫助,divide-and-conquer的方法來解決問題也很有啟發,不過我目前還不能說完全掌握了它們。另外,在計算複雜度時,數學知識就派上用場了,而以前,我對數學有相當的排斥,原因是覺得背數學公式沒有用。現在看來,數學還是有她用處的(這簡直是廢話),所以要好好學習並使用她。
《演算法導論》讀書筆記(一)
理解 輸入到輸出的計算過程稱為演算法。1.演算法描述 2.證明演算法正確性 3.分析演算法效率 兩個例子 1.插入排序 思想 從未排序的序列中取出乙個元素,將其插入到已排序序列的正確位置。實現 include include using namespace std int main for int ...
《演算法導論》筆記彙總
列表裡沒有的,或者是純屬理論,不適合寫,比如第1 5章 或者是我也不怎麼明白的,比如斐波那契堆中抽取最小結點的平攤代價分析 還有沒看的,比如數論和np完全性等。陸續看了四個月,有些理解的還不是很深,筆記彙總到這裡。如果有問題,可以郵件交流。第六章 堆排序 堆排序 第七章 快速排序 四種快速排序 快速...
《演算法導論》筆記 前言
演算法導論 應該是每乙個程式設計師都應該看的經典吧。不過現在這個時代,設計重於資料結構和演算法,乙個普通程式設計師,只要會用api sdk,再學一點軟體工程思想,就足夠應付日常工作了。在很多人眼中,演算法的研究只是一小撮人做的事,他們為我們提供底層工具,我們在其基礎上搭建面對使用者的應用程式,而應用...