前言
小伙伴們好呀!可愛的小編又來了。最近放寒假了,相信各位小伙伴已經做好滿滿的計划打算在寒假實現彎道超車。
這么美好的一段長假,不用來學習是在是太暴殄天物啦!
加上經常有小伙伴來問小編,學習算法需要掌握哪些編程語言?代碼怎么學啊好難啊?是學Python好還是matlab好?
這些問題實在沒有辦法一一回答,所以今天我們就來聊一聊,學習算法需要掌握什么樣的編程知識吧~
值得注意的是,本文面向的對象是算法的學習群體,包括公眾號上的啟發式算法和精確式算法。因此編程上的知識我們只是強調“夠用”即可,這樣才能將更多精力放在算法的設計以及優化上來。
Java基礎
基礎知識核心原則是“有用”,學習完基礎后應能快速上手寫一些簡單的算法。學習知識參照知乎上@沈世鈞 給出的路線圖:
當然大家可根據自己的學習能力調整學習時間,正常而言6周內搞定這部分內容應該是完全沒有問題的。能力強的一個月也能很快搞定這部分基礎知識。
在學習java的過程中,網上有很多可參考的視頻,大家動手搜集一下即可。而關於書籍,確實有很多,但同時也很雜,在這里小編推薦一本《Java核心技術 卷I》,一本書吃透足以。
在學完基礎以后,可以嘗試自己動手做一個小項目鞏固一下編程能力,同時把握比較大型的程序開發。****可以做一個小游戲之類的,在這里推薦一下小編此前做的一個小游戲:
不過該程序的代碼框架可能不是那么漂亮,有興趣的小伙伴可以重構一下。
C++基礎
注意到C++我是放在java后面的,因為說實話對新手而言C++要比Java難上一點。C++內容實在是太多太多太多了……網上曾流傳過一個21天精通C++的秘籍:
因此建議可以先學習C++基礎,和java一樣,學完基礎后續內容有需要再查詢即可。
首先是C的基礎部分:數據類型、變量、內存布局、指針基礎;字符串、一維數組、二維數組;一級指針,二級指針,指針數組和數組指針;結構體、文件的使用等。
然后是C++部分:面向對象編程思想;類的封裝,構造和析構、靜態成員、對象管理;類的構造(有參構造函數、無參構造、拷貝構造、默認構造函數)和析構;對象動態管理、友元函數、友元類、操作符重載;
類對象的動態管理(new/delete);友元函數和友元類;運算符重載;類的繼承、多繼承及其二義性、虛繼承;多態;虛函數、純虛函數、抽象類(面向抽象類編程思想案例);函數模板、類模板,模板的繼承;
C++類型轉換;C++輸入輸出流(標准I/O 文件I/O 字符流I/O);C++異常處理(異常機制、異常類型、異常變量、異常層次結構、標准異常庫)。
學完了這些基礎,我相信你已經成仙了,嗯沒錯!然后可以在寫一個小游戲加強一下,比如小編此前寫的一個AI貪吃蛇的小游戲:
傳送門:10分鍾教你用C++寫一個貪吃蛇附帶AI功能(附源代碼詳解和下載)
當然該程序也不是那么完美,有興趣的小伙伴依然可以重構一下。
數據結構
數據結構的重要性不言而喻,這是所有編程語言中最應該學習的部分,程序組成的基礎之一,更是算法不可或缺的內容。
包括:順序存儲、鏈式存儲、循環鏈表;****雙向鏈表、棧(順序和鏈式)、隊列(順序和鏈式);棧的應用、樹基本概念及遍歷、二叉樹;排序算法、並歸算法、選擇、插入、快速、希爾等。
當然,這里推薦一本程傑的《大話數據結構》,雖然這本書被網上很多人吐槽錯漏百出。
但就從小編的視角而言,這本書對新手朋友還是非常友好的,起碼是還能學下去的。有基礎的同學也可以去看嚴奶奶的數據結構,不過這個確實很枯燥。
IDE的使用
什么是IDE?就是一個集成開發環境,在上面你可以隨心所欲coding,因此配置一個好的開發環境還是蠻重要的。
對於Java而言,最出名的就是eclipse了,eclipse最大的優點就是免費(以后不知道)。當然也有很多小伙伴在用IntelliJ IDEA,這個東西是收費的,用起來也順手得多,不過小編還未使用過哈~看大家喜好吧。
對於C++,可以選擇Windows平台的VC系列:比如Visual Studio2013, Visual Studio2015,Visual Studio2017,Visual Studio2019。現在Visual Studio有社區版也就是免費版了,說是宇宙最強IDE也不為過,調試功能真是太強大了。我又想起當年做項目寫代碼調bug的種種情境,真讓人淚目。
另外還有一些高級編輯器可以選擇Notepad++, EditPlus,vs code等。當然,這都是一個coder的標配啦。
算法進階
有了上面的編程基礎,你已經能應對大部分的算法場景了,接着就可以開始學習一些常用的算法。之后就可以上手擼項目擼論文了。學習內容參考:
干貨 | 公眾號“數據魔術師”算法代碼分類整理:Show you the code!
最后再多說一句
關於為什么選擇C++和java,而不是Python或者matlab,小編已經解釋很多遍了。那只學C++或者java一門可以嗎?小編之所以建議兩手抓,是因為C++和java都有着非常顯著的優點。
對於C++而言,速度相當快,快到你懷疑人生。可能此時會有讀者有疑問,小編騙人,有時候明明感覺C++慢的離譜。那是因為你IDE的編譯模式用的是debug,編譯也沒有開優化之類的。
比如在visual studio中,選擇release模式:
優化選項選擇速度優先:
再比如在devC++選擇:
然后你會發現程序快了N倍不止。
對於java而言,最大的優點是兼顧速度和易用性。速度總體上和C++是一個量級的,但終究還是比不過變態的C++。
但java用起來非常方便,比如調用cplex,只需要導入一個jar包配置好dll就可以隨心所欲了。而C++又要導入頭了,又要鏈接庫了,對小白而言簡直是噩夢,比如:
而且java一個類一個文件,不像C++一個類有一個頭文件一個CPP文件我真是頭大。對於java和C++小編都用來開發過超一萬行代碼的大型算法,所以對他們之間的優缺點算得上深有體會的,也絕不是空口無憑瞎比比哦。
最后,值得注意的是C++和java的內存管理方式等區別,深淺拷貝等概念要熟悉,不然真的會瘋掉的(got crazy!)。
最后的最后,祝大家在新的一年學有所成****也祝小編好運多多,心想事成,嘿嘿!