演算法為什麼那麼難?——演算法學習祕籍
很多人感嘆:演算法為什麼辣麼難!
首先,演算法本身具有一定的複雜性,還有一個原因:講的太爛!
演算法的教與學有兩個困難:
(1)我們學習了那些經典的演算法,在驚歎它們奇思妙想的同時,難免疑慮重重:這麼刁,怎麼想到的?對學生來說,這可能是最費解、也最讓人窩火的地方。高手講,學演算法要學它的來龍去脈,包括種種證明。但這對菜鳥來說,簡直比登天還難,很可能花費很多時間也無法搞清楚。這條路對大多數人來說,是行不通的,那怎麼辦呢?下功夫去記憶書上的演算法?記住這些演算法的效率?看似學會了,其實兩手空空。遇到一個新問題,仍然無從下手。可這偏偏又是極重要的,無論作研究還是實際工作,一個計算機專業人士最重要的能力,就是解決問題——解決那些不斷從實際應用中冒出來的新問題。
(2)演算法作為一門學問,有兩條几乎平行的線索。一個是資料結構(資料物件):數、矩陣、集合、串、排列、圖、表示式、分佈等等。另一個是演算法策略:貪心、分治、動態規劃、線性規劃、搜尋等等。這兩條線索是相互獨立的:同一個資料物件(例如圖)上有不同的問題,例如單源最短路徑和最優二叉樹,就可以用到不同的演算法策略,如貪婪和動態規劃;而同一個演算法策略,例如排序和整數乘法,也會用到不同的資料結構。它們之間是多對多的關係。
兩條線索交織在一起,該如何表述?
我們早已習慣《資料結構》中講資料結構,《演算法設計與分析》裡面講演算法策略。各說各的,講演算法設計時就假設你已經對資料結構瞭如指掌,還沒有哪一本演算法書很好的解決這兩個困難,傳統的演算法書,大多注重內容的收錄,但卻忽視思維過程的展示,因此我們學習了經典的演算法,卻費解於演算法設計的過程。遇到一個實際問題,通過問題分析,選擇使用什麼樣的演算法策略,基於這種演算法策略選擇什麼樣的資料結構,有時演算法策略和資料結構的選擇並不是唯一的,不同的演算法策略和資料結構設計的演算法,其複雜性是不同的。而很多書就是灌輸式的講一個例項,一下子就選擇了一個認定是最優的演算法策略,告訴你就這樣幹,不談資料結構,然後分析演算法複雜性,就結束了。原則上講演算法策略就講演算法策略,不依賴任何程式設計語言和資料結構,但對很多學生來講,尤其是語言沒學好,資料結構也不熟練的同學,只講演算法策略,如同空中樓閣。自己用演算法解決實際問題,一頭霧水。
《趣學演算法》,從問題出發,根據實際問題進行分析,選擇合適的演算法策略,並分析為什麼採用這種演算法策略,然後選擇什麼資料結構,不同的資料結構複雜性會有什麼區別,巧妙地將資料結構和演算法策略擰成了一條線。通過大量例項,充分展現演算法設計的思維過程,讓學生充分體會遇到一個問題,如何分析,使用什麼演算法策略,採用什麼資料結構,演算法的複雜性如何?是否有優化的可能?
西方教育旨在激發學生對世界的好奇心,而在這裡,我們培養的是讓學生懷著一顆好奇心,思考問題、解決問題的能力。更重要的是——體會學習的樂趣,發現演算法的美!