什麼是算法
任何一個問題的解決方案都並不是是憑空出現的,解決一個問題都須要選擇一個合適的方法,並在此方法的引導下完成一系列的解答步驟,最終將問題轉換爲結果狀態,對於計算機來講,這樣的方法就是算法。
算法有不少種分類,能夠是一系列的數學計算,也能夠是一系列的操做步驟,總之,它存在的意義就是爲了有針對性地解決問題,之因此強調針對性解決問題,是由於這個世界上尚未一種能夠解決一切的萬能算法,每一個問題都有它獨特的一面。
而對於這些特殊的需求,因而在這行業中出現了新的一批人,他們負責設計解決各類問題的算法。算法
不過也正所謂沒有最好用的,只有最合適的方案,不一樣的算法可以適配的是不一樣的環境,就比如不一樣的場景也要使用不一樣的服務架構模式。
因此算法是什麼,答案已經出來了 => 算法就是對問題一系列的分析得出的數據進行數學建模,用程序表達出來,來解決實際遇到的問題。
學習算法的用處
咱們在軟件開發的領域中,不少東西都會由於時間的變遷而變化,編程語言也會不斷地推陳出新,各類軟件技術的更新換代更是突飛猛進,可是萬變之中,有一種東西是不變的,那就是算法
。
數據結構,算法,計算機體系原理,遠比編程語言,軟件開發技術重要,由於算法和數據結構被稱爲軟件的核心內容。編程
在現今軟件開發的領域中,技術迭代速度飛快,掌握任意一個技術都有可能在第二年被技術的潮流所沖走,而算法,是一個應用程序中不可動搖的東西,不管語言怎麼改變,算法的設計理念都是同樣的。
包括在工做中遇到的算法也每每並不是是ACM
那樣的題目(因此說比賽誤人子弟啊...咳),常見的問題好比說是:數據結構
- 交換機中端口和VLAN的映射關係維護 (沒據說過...附文)
- 路由器帶寬限速 (也沒什麼想法...附文)
- ...
學習算法的目的是爲了提升本身的軟件編寫,解決問題的能力,這種能力是在從此的工做或者項目開發過程當中所須要展示出來的關鍵能力,換句話來講,就是:架構
自己學習算法,目的是培養出一套思惟框架,在將來能夠真正改變本身作事的思惟,而不是爲了算法而學習算法,那樣只會讓本身被封閉住,最終失去了本身的彈性。
秉承着這種原則去學習算法,更應該作的是找到方法,思考算法實現的設計和分析過程,而並不是是去死記硬背各類算法的實現方法,學會釣魚的方法永遠比魚更受益不是麼?
因此咱們學習算法不能死記硬背各類算法的實現方法,而是經過這些算法的學習,特別是算法實現的設計和分析的過程,培養咱們解決實際問題的能力,工做中遇到的問題是本身動手解決的問題,仍是處處貼吧發帖子求助,它的背後就是這種能力的體現,而這種能力,籠統的來講,就是編程能力。框架
編程能力大體包括如下:編程語言
- 邏輯思惟能力
- 抽象建模能力
- 編程的方法與技巧
- ...
編程能力的培養,不是三五天能成的,也不是死記硬背就能會的,須要的是大量的實踐(鄙人也在學繪畫...二者感觸頗深....)學習
學習算法自己,有幾點是值得借鑑的:編碼
- 是可以比較直觀的去提高本身編程能力的方法,掌握核心思想,可以在程序的道路中如虎添翼。
- 一樣是在寫代碼,可是在和別人思考一樣的問題的時候,就會想的更細緻些,好比時間複雜度,空間複雜度,計算效率問題的求解過程,對其它模塊的影響等等(感觸不能頗深,但有過的開發經驗告訴我仍是有的)
- 咱們常常會用代碼堆出來一個功能,好比用戶點擊按鈕的事件,這種流程化的動做機器也是能夠作的,大量這樣的場景都是能夠避免去堆代碼的
學習算法,有不少種方法,能夠根據問題的類型採起不一樣的方法,算法被權威人士大體分爲三類,權威人士有多權威,我就不說了:翻譯
- 已知算法 (擁有成熟且高效的實現方法的算法) => { 這類算法,除非是這個領域的從業人員或是勵志成爲該領域的專家,不然瞭解下就好,不至於工做中一籌莫展 }
avl
樹和紅黑樹的插入 (附文 => 戳此)
- 刪除算法 (附文 => 戳此)
- 二分圖匹配的匈牙利算法 (附文 => 戳此)
- 數據壓縮
- 視頻編碼
- 編解碼算法
- ...
- 理論算法 (沒有固定的實現方法的算法) => { 理論中的內容是須要進行數學建模以後纔會有結果的,抽象的方法自己是須要根據場景變更而變更,結合問題的數學模型,將算法原理翻譯成算法是代碼的實現 }
- 遺傳算法
- 貝葉斯算法
- 決策樹算法
- KN分類算法
- ...
- 實際問題或是算法比賽中的題目 (沒有通用的答案) => { 要有對問題抽象建模的能力,轉化爲數據模型的能力,實現數據模型的能力,... } 須要堆積的算法經常使用模式:
對於後兩類算法,門檻比較高,對抽象建模的能力和經驗有要求,是須要時間來沉澱出來的。
其實,開篇也就這麼多內容,所提倡的學習方法,也正是我想要學習的目的,抱着這種思想,選擇了這麼一條道路,簡單講講今日這四小時的收穫,以及將來短時間的規劃和長期的規劃。
- 不管是什麼技術,都不能爲了技術而學技術,保持本身的彈性。
- 學習算法,學的是算法思想,算法之禪,在各類場景中的靈活運用。
- 雖然須要學習的是思惟框架,是編程思想,可是基礎的東西仍是須要掌握的,好比貪婪法,窮舉法等基本算法。
學習目標
- 完成每日的代碼案例
- 溫習一次過去寫的案例
- 每日至少一小時的思考,沉澱
- 繪製應用程序流程圖
- 每日的博客,平常總結,打卡
短時間思想
- 結束第一個月每週溫習一次過去學過的全部內容
- 至少一天完成一個課後習題
- 結束第二個月每兩週溫習一次過去學過全部的內容
- 一週完成至少一個課後習題
- 結束後三個月之後,每個月複習一次學過的全部內容,週期持續到結束後六個月
長期改變