寫程序 18 年,讓我認識到沒有算法的軟體就像沒有靈魂的人,不值得研究,算法的應用更令人「上癮」。
本文從我的經歷出發,談談算法對程式設計師的意義。在我看來,解決各種算法問題的過程非常有成就感。和現在許多人的觀點一樣,那時我對算法的理解就是刷題,感覺對工作中編寫應用程式沒什麼用處,但當我在工作中接觸到應用軟體開發時,讓我徹底扭轉了對算法的看法。
也正是這十幾年的編程經歷,讓我理解到了算法的意義,這些各種各樣的算法,有的是原理很牛,有的是實現技巧很牛,算法就是把一個看似很難的概念,用精巧的代碼展現出來。
很多軟體團隊中的技術大牛,他們的共同特點就是抽象和邏輯思維能力很突出,這兩點也是程式設計師最重要的能力。而學習算法的意義就在於提高自己的抽象能力和邏輯思維能力,不僅對於具體的算法問題,對於想成為軟體架構師的同學來說,也是不可或缺的能力,這兩個能力提高了,將終生受益,我對此深有體會!
學習算法有很多種方法,可以根據問題的類型採取不同的方法。我本人將算法大致分為三類:
01 已知的,有成熟高效實現方法的算法
對於這類算法問題,除非你是這個領域的從業人員,或者想成為這方面的專家,否則不需要精通。你只要知道這些算法都適用於解決什麼問題,工作中遇到不至於束手無策。比如你在工作中遇到一些資源分配問題時,如果你知道匈牙利算法之類的匹配算法,你就可以想是否能把問題轉化為二分圖的匹配算法試試?它會給你一個解決問題的新方向。
02一些只有理論,沒有固定實現方法的算法
對於這類算法需要根據算法的原理,根據基因的模型,調整算法實現,才能得到對具體問題的遺傳算法。所以,這類算法的學習重點是掌握算法的原理,培養自己抽象分析問題並建立數據模型的能力,結合問題的數據模型,將算法原理翻譯成算法的代碼實現。
03工作中遇到的各種實際問題,或者算法競賽中的題目
這些問題可能沒有通用答案,每個都要你獨立應對解決。對這類算法問題,你需要掌握構造算法常用的模式,比如貪婪法、窮舉法、分治法等,還需要大量的算法實現方面的技巧,比如子問題分解、簡單數據結構(數組、鍊表、哈希表等)的應用。
當然,更重要的,就是對問題抽象建模的能力,比如將文字信息數位化、轉化為數據模型的能力、選擇合適的數據結構實現數據模型的能力等。
對於後兩類算法,要想活學活用,需要一定的抽象建模能力和經驗,這些都不是一朝一夕能解決的,需要多看、多練,在練習中積累經驗,提升能力。