一個熱愛編程的在校生,我的世界不只有coding,還有writing。目前維護訂閱號「苦逼的碼農」,專注于寫「算法與數據結構」,「Java」,「計算機網絡」。
數據結構與算法的地位對于一個程序員來說不言而喻。今天這篇文章不是來勸你們學習數據結構與算法的,也不是來和你們說數據結構與算法有多重要。
主要是最近幾天后臺有讀者問我是如何學習數據結構與算法的,有沒有什么捷徑,是要看視頻還是看書,去哪刷題等…..而且有些還是大三大四的,搞的我都替你們著急、擔心…..
所以我今天就分享下自己平時都是怎么學習的。
學習算法的捷徑就是多刷題
說實話,要說捷徑,我覺得就是腳踏實地著多動手去刷題,多刷題。
但是,如果你是小白,也就是說,你連常見的數據結構,如鏈表、樹以及常見的算法思想,如遞歸、枚舉、動態規劃這些都沒學過,那么,我不建議你去刷題的。而是先去找本書先去學習這些,然后再去刷題。
也就是說,假如你要去諸如leetcode這些網站刷題,那么,你要先具備一定的基礎,這些基礎包括:
1、常見數據結構:鏈表、樹(如二叉樹)。
2、常見算法思想:貪婪法、分治法、窮舉法、動態規劃,回溯法。
以上列出來的算是最基本的吧。就是說你刷題之前,要把這些過一遍再去刷題。如果你連這些最基本的都不知道的話,那么你再刷題的過程中,會很難受的,思路也會相對比較少。
總之,千萬不要急,先把這些基本的過一遍,力求理解,再去刷題。這些基礎的數據結構與算法,我是在大一第二學期學的,我沒看視頻,我是通過看書學的,那時候看的書是:
1、算法分析與分析基礎:這本比較簡單,推薦新手看。
2、數據結構與算法分析—-C語言描述:代碼用C寫的,推薦看。
3、挑戰程序設計競賽(第二版):也是很不錯的一本書,推薦看。
具體可以看我的另外一篇文章,里面是介紹這幾本書的:算法與數據結構書籍與視頻福利
說實話,我那一學期的時間幾乎都花在數據結構與算法上,但刷的題很少,只是書本上的一些例題。所以當我把這些基本的過一遍之后,再去一些網站刷題依舊非常菜。
所以你們千萬別指望以為自己把這些思想學完之后刷題會很牛,只有多刷題,只有多動手實踐,你的靈敏度才會提高起來。
在這里說一下前陣子有個非常火爆的專欄—-【數據結構與算法之美】
我沒買這個專欄,我想說的是,買了就一定要去看,千萬別浪費。也千萬不要覺得學完這個專欄你就會變的多牛逼,如果你只是跟著進度去學習這個專欄,自己沒有花時間去刷題、去動手時間。那我可以保證,你學完之后還是那么菜。
總結下:
提高數據結構與算法沒啥捷徑,最好的捷徑就是多刷題。但是,刷題的前提是你要先學會一些基本的數據結構與算法思想。
追求完美
如何刷題?如何對待一道算法題?
我覺得,在做題的時候,一定要追求完美,千萬不要把一道題做出來之后,提交通過,然后就趕緊下一道。
算法能力的提升和做題的數量是有一定的關系,但并不是線性關系。也就是說,在做題的時候,要力求一題多解,如果自己實在想不出來其他辦法了,可以去看看別人是怎么做的,千萬不要覺得模仿別人的做法是件丟人的事。
我做題的時候,我一看到一道題,可能第一想法就是用很粗糙的方式做,因為很多題采用暴力法都會很容易做,就是時間復雜度很高。之后,我就會慢慢思考,看看有沒其他方法來降低時間復雜度或空間復雜度。最后,我會去看一下別人的做法,當然,并不是每道題都會這樣執行。
衡量一道算法題的好壞無非就是時間復雜度和空間復雜度,所以我們要力求完美,就要把這兩個降到最低,令他們相輔相成。
我舉道例題吧:
問題:一只青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法?
這道題我在以前的分章分析過,不懂的可以先看下之前寫的:遞歸與動態規劃---基礎篇1
方法1::暴力遞歸
這道題不難,或許你會采取下面的做法:
public static int solve(int n){ if(n == 1 || n == 2){ return n; }else if(n <= 0){ ? ? ? ?return 0; ? ?}else{ ? ? ? ?return solve(n-1) + solve(n-2); ? ?}}
這種做法的時間復雜度很高,指數級別了。但是如果你提交之后僥幸通過了,然后你就接著下一道題了,那么你就要好好想想了。
方法二:空間換時間
力求完美,我們可以考慮用空間換時間:這道題如何你去仔細想一想,會發現有很多是重復執行了。所以可以采取下面的方法:
//用一個HashMap來保存已經計算過的狀態static Map
這樣,可以大大縮短時間。也就是說,當一道題你做了之后,發現時間復雜度很高,那么可以考慮下,是否有更好的方法,是否可以用空間換時間。
方法三:斐波那契數列
實際上,我們可以把空間復雜度弄的更小,不需要HashMap來保存狀態:
public static int solve(int n){ if(n <= 0) ? ? ? return 0; ? ?if(n <= 2){ ? ? ? ?return n; ? ?} ? ?int f1 = 0; ? ?int f2 = 1; ? ?int sum = 0; ? ?for(int i = 1; i<= n; i++){ ? ? ? ?sum = f1 + f2; ? ? ? ?f1 = f2; ? ? ? ?f2 = sum; ? ?} ? ?return sum;}
我弄這道題給你們看,并不是在教你們這道題怎么做,而是有以下目的:
1、在刷題的時候,我們要力求完美。
2、我想不到這些方法啊,怎么辦?那么你就可以去看別人的做法,之后,遇到類似的題,你就會更有思路,更知道往哪個方向想。
3、可以從簡單暴力入手做一道題,在考慮空間與時間之間的衡量,一點點去優化。
推薦一些刷題網站
我一般是在leetcode和牛客網刷題,感覺挺不錯,題目難度不是很大。
在牛客網那里,我主要刷劍指Offer,不過那里也有個在線刷leetcode,不過里面的題量比較少。牛客網刷題有個非常方便的地方就是有個討論區,那里會有很多大佬分享他們的解題方法,不用我們去百度找題解。所以你做完后,實在想不出,可以很方便著去看別人是怎么做的。
至于leetcode,也是大部分題目官方都有給出答案,也是個不錯的刷題網站。你們可以兩個挑選一個,或者兩個都刷。
當然,還有其他刷題的網站,不過,其他網站沒刷過,不大清除如何。
再說數據結構
前面我主要是說了我平時都是怎么學習算法的。在數據結構方法,我只是列舉了你們一定要學習鏈表和樹(二叉堆),但這是最基本的,刷題之前要掌握的,對于數據結構,我列舉下一些比較重要的:
1、鏈表(如單向鏈表、雙向鏈表)。
2、樹(如二叉樹、平衡樹、紅黑樹)。
3、圖(如最短路徑的幾種算法)。
4、隊列、棧、矩陣。
對于這些,自己一定要動手實現一遍。你可以看書,也可以看視頻,新手可以先看視頻,不過前期可以看視頻,之后我建議是一定要看書。
視頻和書我以前有推薦過:算法與數據結構書籍與視頻福利
例如對于平衡樹,可能你跟著書本的代碼實現之后,過陣子你就忘記,不過這不要緊,雖然你忘記了,但是如果你之前用代碼實現過,理解過,那么當你再次看到的時候,會很快就記起來,很快就知道思路,而且你的抽象能力等等會在不知不覺中提升起來。之后再學習紅黑樹啊,什么數據結構啊,都會學的很快。
最最重要
動手去做,動手去做,動手去做。重要的話說三遍。
千萬不要找了一堆資源,訂好了學習計劃,我要留到某某天就來去做…..
千萬不要這樣,而是當你激情來的時候,就馬上去干,千萬不要留到某個放假日啊什么鬼了,很多這種想法的人,最后會啥也沒做的。
也不要覺得要學習的有好多啊,不知道從哪學習起。我上面說了,可以先學習最基本的,然后刷題,刷題是一個需要長期堅持的事情,一年,兩年。在刷題的過程中,可以穿插學習其他數據結構。
-
算法
+關注
關注
23文章
4622瀏覽量
93055 -
數據結構
+關注
關注
3文章
573瀏覽量
40155
原文標題:我是如何學習數據結構與算法的?
文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數據結構】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論