1. 程式人生 > >關於演算法學習方法的討論

關於演算法學習方法的討論

【來信】

  老師,關於演算法和資料結構我還是有點疑惑。你說要通過實踐,我現在看到資料結構的圖了,演算法學習我借了劉汝佳的演算法入門那本書,資料結構我把書中的程式碼在電腦上敲了出來,並且搞懂了第一行程式碼,也算是記住了思想。但是有時候敲完後會覺得模糊。演算法在看動態規劃,對於動態規劃裡面提到的“狀態”我還是不能很好的理解。我想問問老師,如果長時間過後資料結構和演算法的思想忘了怎麼辦,怎麼學習資料結構和演算法才算是正確的方法。學了將近20天的資料結構和演算法,逐漸感覺到了別人所說的枯燥,到底如何安排學習這類知識的時間。問下,老師有沒有演算法的書籍推薦和比較明確的學習方法傳授。謝謝老師。

【回覆:逐點討論】

老師,關於演算法和資料結構我還是有點疑惑。
你說要通過實踐,我現在看到資料結構的圖了,——你該告訴我你實踐到什麼程度了。
演算法學習我借了劉汝佳的演算法入門那本書,——是《演算法競賽入門經典》嗎?這本書是好書,當作應用演算法和資料結構解決問題的參考書即可。但是若你正在學習資料結構期間,卻將之當主線,我覺得不妥。
資料結構我把書中的程式碼在電腦上敲了出來,——我懷疑你用的材料不當了。資料結構中演算法的描述如果直接就用高階語言寫出來了,很不利於你進入“抽象”的層次,這樣學來的資料結構和演算法,只能照貓畫虎,眼前沒貓,即使有虎,也畫不出虎。
並且搞懂了第一行程式碼,——疑是“每一行程式碼”的筆誤。看程式碼如果是以行作為單位,那學習效果可想而知了。要先知整體,再一大塊一大塊,再看大塊中的小塊。
也算是記住了思想。——如果演算法思想是記住的,忘了就一點都不奇怪了。
但是有時候敲完後會覺得模糊。——因為你始終是隻見樹木,不見森林。這影響了你學習的速度和感受。
演算法在看動態規劃,——現在我感覺,你是將演算法和資料結構分開學。演算法學習的初期,演算法可以有兩種:一種演算法是與資料結構緊密聯絡的,例如,各種基本資料結構上的基本操作,屬於這一種;另一種,體現計算機求解問題方法層面的演算法,例如動態規劃、貪心等。這兩者間有交叉。基於對你學習路線已有的瞭解,我建議將這兩種分開一些,先第一種,後第二種。
對於動態規劃裡面提到的“狀態”我還是不能很好的理解。——再找些同類的書,這本書上的說法沒有明白,再一本的說法可能就對你胃口了。用好學校的圖書館。
我想問問老師,如果長時間過後資料結構和演算法的思想忘了怎麼辦,——忘了太正常了。理想的結果就是“得意而忘形”。而你前面描述的,試圖是“得形而記意”。改變學法為要。例如排序演算法,拿出一副撲克來,說用快速排序,就嚴格照其思想,手工玩出排序過程。這個玩的過程都可以不去考慮程式碼該怎麼寫。玩熟練了,可以用某種語言寫一寫程式。其他的演算法,也要能夠擺脫具體程式碼形態,以此去得意。這樣學出來的,是不容易忘記的。關鍵是,做到了演算法與語言無關。
怎麼學習資料結構和演算法才算是正確的方法。——以上提示了一些,但也僅限於我的感覺。而對於你自己,要在學法上下功夫,你有更適合你自己的學法,只是沒有想到去自己發現。
學了將近20天的資料結構和演算法,逐漸感覺到了別人所說的枯燥,——這些知識實際是非常生動的,是學法不當所致。嘴裡喊著枯燥,學這玩意就是活受罪。很多人就是這樣進入到冬眠狀態的。
到底如何安排學習這類知識的時間。——感覺煩了累了就休息、調整一下,不要強求。不要指望過一遍就將知識掌握到一種很精通的程度,不可能。多輪次地學,每一輪,都深入一點點。初始的輪次,只求能學點皮毛即可,只求能解決點最簡單的問題即可,不必指望一次學習,就能把競賽類的題輕鬆做下來。剛會個三步上欄,就要打NBA,那不是自找不痛快嗎?做不來的,放在那兒等著回頭就收拾。用輕鬆的心態去學習,而不要這樣焦燥。
問下,老師有沒有演算法的書籍推薦和比較明確的學習方法傳授。——現階段,你就用好手邊的書就行,而學習方法,我提示了一些。最適合你的方法,誕生在你自己的探索過程裡。
================= 迂者 賀利堅 CSDN部落格專欄=================
|== IT學子成長指導專欄 專欄文章的分類目錄(不定期更新) ==|
|== C++ 課堂線上專欄  賀利堅課程教學連結(分課程年級) ==|
|== 我寫的書——《逆襲大學——傳給IT學子的正能量》    ==|
===== 為IT菜鳥起飛鋪跑道,和學生一起享受快樂和激情的大學 =====