這幾天看到了吳軍的文章,主要是說明好的計算機算法的一些概念和方法,我覺得相當的受用,所在接下來幾天就來整理一下相關的重點。
在計算機裡面,控制部分很重要,而控制硬體執行的是程序。史元春教授講了計算機思維的本質是翻譯,也就是把人想要做的具體事倩,翻譯成計算機能夠理解的程序語言。很多時候,張三希望計算機做的一件事,和李四希望它做的一件事,有一些共性的地方,久而久之大家發現使用計算機工作的流程是相似的,於是科學家們在翻譯現實世界的需求和計算機虛擬過程時,就提煉出一些高效的、不斷被驗證過的標準流程,這些流程就是我們所說的計算機算法。
人和人水平的差別,東西和東西質量的差別,是數量級的,這個認識恰恰來自於計算機算法。因為在計算機算法上稍微差了一點,最後計算機執行的效率很容易差出千萬倍。
人「本能」地對大數沒有概念,其實對超過我們生活經驗的小數也是如此,計算機算題的速度很決, 以至於人們對一毫秒(千分之一秒)和一微秒的差別是無感的,但是,計算機要處理的數據量也是非常大的,因此累計起來,後者就比前者快了很多(一干倍)。很多計算機從業者對計算機資源的數量沒有概念,總覺得是無窮大,因此無端浪費很多資源,這樣做事倩,在行業裡是很難出人頭地的。即使在Google,軟體工程師因為水平不行,無意中多用掉十倍的計算資源的事情也時常發生。
既然講到了算法的好壞,就必須先要明確衡量算法的標準,以及測試的方法, 這和任何科學都一樣。什麼是好算法呢, 很多人首先會想到速度決,當然還有人會想到佔用內存空間不要太大。制定這樣兩個標準,大方向本身都沒有問題,但用多少數據來測試算法的速度和空間卻是一個問題,因為用不同數量的數據測試時, 兩個算法的相對錶現可能會完全不一樣。
1965年哈特馬尼斯(Juris Hartmanis ) 和斯坦恩斯 ( Richard Stearns )提出了算法複雜度的概念( 二人後來因此獲得了圖靈獎 ),計算機科學家們開始考慮一個公平的、一致的評判算法好壞的方法。不過,最早將複雜度嚴格量化衡量的是著名計算機科學家、算法分析之父高德納(Don Knuth)。今天,全世界計算機領域都以高德納的思想為準。
高德納的思想主要包括這三個部分:
高德納關於算法複雜度的思想,其實又是建立在一個相對理想狀態之下的,也就是說計算機要解決的問題都近乎無限大。很顯然,現實世界並非如此,那麼高德納這樣理想化的假設是否有意義呢?非常有意義,而且非常重要。回顧一下科學發展的歷史,那些能總結出理論的人要做的第一件事,就是過濾掉所有次要的因素,構建一個理想的環境(或者虛擬的環境)。
當年亞里士多德就是因為無法濾除空氣阻力對重力加速度的影響,得到了重物比輕物下降速度快的荒唐結論。而後來伽利略和牛頓在研究運動時,也是假設空氣阻力和摩擦力可以忽略不計的,那就是構建理想狀態。




