為什麼要講資料結構和演算法?以及如何學習資料結構和演算法
“飛哥你變了!”
“沒想到你這個濃眉大眼的,也叛變了革命……”
這就是我在講《資料結構和演算法》的時候,腦子裡浮現出來的臺詞。
熟悉我的同學都知道,我是一個“實戰派”,
一直在強調學程式設計要儘快“上手”,做出東西來,看到效果,獲得正反饋和自激勵……而《計算機組成和原理》《編譯原理》《資料結構和演算法》之類的,是能排在多後面,就排在多後面的東西。
但為什麼源棧一開課就講資料機構,第二天就寫“二分查詢”呢?(對了,附上當天群聊天記錄若干……)

這特麼的就是傳說中的“人工”智慧啊!
當然,以上為搞笑版。
事實上同學們最後都寫出來了。寫出來之後回頭看看,“其實也沒有那麼難嘛!”
^_^,你確定?
其實,講《資料機構和演算法》,最大最大的原因,就 是“面向就業”程式設計的需要 。有非常大的概率,你面試的時候,面試官就讓你寫一個“氣泡排序法”,你一臉懵逼,寫個:
int[] numbers = new int[] { 3, 1, 8, 12, 7, 9, 10 }; var result =numbers.AsEnumerable().OrderBy(m => m); foreach (var item in result) { Console.WriteLine(item); }
那就比較尷尬了。
這不一看就是培訓班出來的嘛!
雖然說飛哥對培訓班的同學毫無偏見,但其他人不這麼想啊,所以我也沒有辦法——至少目前是沒有辦法的。只能是希望通過我們所有人持之以恆的不懈努力,逐漸的改變這種歧視和偏見。在此之前,大家還是委曲求全,憋說是“源棧”培訓出來的,就是是自己“自學”的吧……
除此以外的理由,應該就是自己說服自己,硬找的了。按靠譜程度,依次排列:
- 理解並學會“用迴圈和分支解決問題”的“電腦”思維。很多零基礎的同學對此是一臉懵逼的(包括當年飛哥自己),比如排序,人的思維是怎麼樣的?找到最大值放第一個,然後第二個第三個啊……我們就不會考慮:電腦怎麼知道哪一個數是最大的呢?但是呢,這種訓練,是一把雙刃劍,過深的糾結於具體的過程,會給我們理解“面向物件”造成干擾:又讓我們不敢抽象不能抽象!
-
教學需要。你說,剛學會變數賦值,if...else和for迴圈的孩子,你能給他佈置一個什麼作業呢?就只有這些排序啊查詢啊需求簡單,不涉及任何類庫框架,剛剛好。其實這也是面試新人時愛用簡單演算法的原因。就面試那點時間,總不能講需求就講半個小時吧?!
-
向其中所凝聚的人類智慧致敬。這是真心的,反正我在準備軟考,博覽群書的時候,是被震撼到了的。作為一個文科生,我真心好奇這些人的腦子是怎麼構造的,能想出這麼多匪夷所思的辦法出來?其實有很多東西,不一定是要有用才需要學,那些美好瑰麗的東西,只是看一看,都是一種享受。
- 浪漫和逼格,偶爾還是可以有——而且可以用來懟人!一直有同學問我考了軟考有什麼用沒有。我想了又想,除了一部分的知識在以後潛移默化的滋潤滲透,對程式設計開發有所裨益之外,最重要的一個作用就是給了我底氣:當某些(注意,僅僅是某些)科班生,在我面前鼻孔朝天,但其實渣渣的時候,我可以毫不心虛的懟回去:要不我們來比一比?看看什麼你會的我不會,我會的你不會?他們自然就慫了,其實他們也就多知道那麼幾個名詞而已,¯\_(ツ)_/¯,上了個大學有什麼了不起,學的又不是國家機密核心技術……
我說了為什麼教,可能同學們更關心的是怎麼學。
其實我一直反對的,是“資料結構和演算法”至上論(同樣我反對的,還有“學歷”至上論),注意“ 至上 ”這兩個字。比如那種說法,“不學資料結構和演算法,一輩子都是碼畜”,我就非常討厭。真的是非常討厭,哪怕我自己好歹學了點。知識,是沒有高低貴賤之分的。
總有些人,覺得有什麼缺了它就不行的“核心”技術——但我告訴你,做成一件事,其實缺了哪一門技術都不行。比如造汽車,大家都覺得發動機是核心是關鍵,但其實一款汽車在市場上賣得好賣得不好,難道就是因為她的發動機好或者不好?用大拇指想想也知道是不可能的!可能一款車大賣,靠的就是最不核心最不核心的技術:好看。這個世界還是看臉的,比如說飛哥,明明就可以靠顏值……唉喲!哪裡來的臭雞蛋?唉喲,又是一個,嫉妒,赤果果的嫉妒啊!
好了好了,說正事,如果你因為眾多車型因為外觀熱賣,就說“外觀設計”就說汽車工業的核心,那就又犯了同樣的錯誤。難道發動機制動就不重要了麼?沒有發動機,跑都跑不起來,還賣個屁!
所以,其實無論是一件事,或者一個人的成功,都是綜合因素的結果。只是我們看問題的時候,有意無意的,忽略了很多很多方面,按我們的想象,把成功簡單的歸結於某一點。
好像又有一點跑題。長話短說,資料結構和演算法,怎麼學,看你的興趣。實際上,學無止境, 只要盡力了,能學到哪裡就到哪裡 ,沒有什麼問題。計算機發展到今天,其實已經大量封裝高度抽象啦,我們做程式設計師,不一定個個都得造輪子。其實能把別人的輪子用好,能做一個所謂的好碼農,都已經很了不起了。定義稍稍嚴格一點,很多很多的程式猿,連“合格”都夠不上。
當然,你說,我對這玩意兒特別感興趣……那沒關係啊,盤他!是不是?但是呢,給個小建議,別盤出什麼優越感來了。沒必要,還拉仇恨值,關鍵的關鍵,這很有可能讓你變得狹隘,侷限你的視野:除了資料結構和演算法,原本還有很多很多很有意思很有挑戰性的東西。
最後的最後,給沒時間看我視訊的同學簡單總結兩條:
- 知其然,更要知其所以然。
- 資料機構是演算法的基礎 ,兩者不可割裂。
很多教材,講資料結構就“連結串列”“二叉樹”的講資料結構,資料結構是什麼樣子的,怎麼插入怎麼刪除怎麼查詢,什麼都講了,但為什麼需要這樣的資料結構?不講!或者一筆帶過……這是非常非常不負責任的!飛哥那時候學資料結構,這一點是把我坑死了的。很後來很後來,也不知道是哪裡東看一句西撿一段,“哦,連結串列是為了記憶體管理!”“棧,是方便函式呼叫”“二叉樹就是資料庫的索引”……這樣點點滴滴的才把這些東西串起來,資料結構的世界才豁然開朗。
學習,你一定要知道學習的目的,學習的意義,你才能更好的堅持下去。就像走路,蒙著你的眼睛,讓旁邊人告訴你“往前三步,左轉兩步,再右轉走十步”,你想想,這種模式,有幾個人能撐到下去?還不如一開始就告訴他,“今天我們去哪裡,跟著我走!”