學習演算法的捷徑就是多刷題
說實話,要說捷徑,我覺得就是腳踏實地著多動手去刷題,多刷題。
但是,如果你是小白,也就是說,你連常見的資料結構,如鍊表、樹以及常見的演算法思想,如遞迴、列舉、動態規劃這些都沒學過,那麼,我不建議你去刷題的。而是先去找本書先去學習這些,然後再去刷題。
說實話,我那一學期的時間幾乎都花在資料結構與演算法上,但刷的題很少,只是書本上的一些例題。所以當我把這些基本的過一遍之後,再去一些**刷題依舊非常菜。
所以你們千萬別指望以為自己把這些思想學完之後刷題會很牛,只有多刷題,只有多動手實踐,你的靈敏度才會提高起來。
在這裡說一下前陣子有個非常火爆的專欄—-【資料結構與演算法之美】
我沒買這個專欄,我想說的是,買了就一定要去看,千萬別浪費。也千萬不要覺得學完這個專欄你就會變的多牛逼,如果你只是跟著進度去學習這個專欄,自己沒有花時間去刷題、去動手時間。那我可以保證,你學完之後還是那麼菜。
總結下:
提高資料結構與演算法沒啥捷徑,最好的捷徑就是多刷題。但是,刷題的前提是你要先學會一些基本的資料結構與演算法思想。
追求完美
如何刷題?如何對待一道演算法題?
我覺得,在做題的時候,一定要追求完美,千萬不要把一道題做出來之後,提交通過,然後就趕緊下一道。
演算法能力的提公升和做題的數量是有一定的關係,但並不是線性關係。也就是說,在做題的時候,要力求一題多解,如果自己實在想不出來其他辦法了,可以去看看別人是怎麼做的,千萬不要覺得模仿別人的做法是件丟人的事。
我做題的時候,我一看到一道題,可能第一想法就是用很粗糙的方式做,因為很多題採用暴力法都會很容易做,就是時間複雜度很高。之後,我就會慢慢思考,看看有沒其他方法來降低時間複雜度或空間複雜度。最後,我會去看一下別人的做法,當然,並不是每道題都會這樣執行。
衡量一道演算法題的好壞無非就是時間複雜度和空間複雜度,所以我們要力求完美,就要把這兩個降到最低,令他們相輔相成。
我舉道例題吧:
問題:乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個n級的台階總共有多少種跳法?
這道題我在以前的分章分析過,不懂的可以先看下之前寫的:遞迴與動態規劃—-基礎篇1
方法1::暴力遞迴
這道題不難,或許你會採取下面的做法:
public static int solve(int n)else if(n <= 0)else
}
//用乙個hashmap來儲存已經計算過的狀態
static mapmap = new hashmap();
public static int solve(int n)elseelse
}}
這樣,可以大大縮短時間。也就是說,當一道題你做了之後,發現時間複雜度很高,那麼可以考慮下,是否有更好的方法,是否可以用空間換時間。
方法三:斐波那契數列
實際上,我們可以把空間複雜度弄的更小,不需要hashmap來儲存狀態:
public static int solve(int n)
int f1 = 0;
int f2 = 1;
int sum = 0;
for(int i = 1; i<= n; i++)
return sum;
}
我弄這道題給你們看,並不是在教你們這道題怎麼做,而是有以下目的:
1、在刷題的時候,我們要力求完美。
2、我想不到這些方法啊,怎麼辦?那麼你就可以去看別人的做法,之後,遇到類似的題,你就會更有思路,更知道往哪個方向想。
3、可以從簡單暴力入手做一道題,在考慮空間與時間之間的衡量,一點點去優化。
推薦一些刷題**
再說資料結構
例如對於平衡樹,可能你跟著書本的**實現之後,過陣子你就忘記,不過這不要緊,雖然你忘記了,但是如果你之前用**實現過,理解過,那麼當你再次看到的時候,會很快就記起來,很快就知道思路,而且你的抽象能力等等會在不知不覺中提公升起來。之後再學習紅黑樹啊,什麼資料結構啊,都會學的很快。
最最重要
動手去做,動手去做,動手去做。重要的話說三遍。
千萬不要找了一堆資源,訂好了學習計畫,我要留到某某天就來去做…..
千萬不要這樣,而是當你激情來的時候,就馬上去幹,千萬不要留到某個放假日啊什麼鬼了,很多這種想法的人,最後會啥也沒做的。
也不要覺得要學習的有好多啊,不知道從哪學習起。我上面說了,可以先學習最基本的,然後刷題,刷題是乙個需要長期堅持的事情,一年,兩年。在刷題的過程中,可以穿插和學習其他資料結構。最後
資料結構與演算法 01 如何學習資料結構與演算法
過於學術的概念定義比較抽象,難以理解。我們從廣義和狹義兩個層面,來理解資料結構與演算法這兩個概念。從廣義上講,資料結構就是指一組資料的儲存結構 怎麼放 演算法就是運算元據的一組方法 怎麼用 我們以圖書館的場景為例來進一步理解 圖書館書籍量十分巨大,首先要分類設定閱覽室,譬如社科類 科技類 報刊類等。...
我是如何自學資料結構的?
小鹿上的一所普通的三本大學,大學的三年時間基本在自學程式設計,畢竟課上老師所授的課程很淺,老師講述乙個知識點是要考慮到大部分不同理解能力學生的,所以對於我這種喜歡刨根問底的學生從大一開始不得不花費大量的時間來自學程式設計。自學呢,我更注重效率,效率在 來?我相信很多自學程式設計的人最講究的就是方法和...
資料結構之如何高效學習資料結構與演算法
資料結構我覺得就是指一組資料的儲存結構 演算法就是運算元據的一組方法 資料結構是為演算法服務的,演算法要作用在特定的資料結構之上 學會複雜度分析。相當於武功的心法 但是不用全掌握,要掌握重點 這裡面有 10 個資料結構 陣列 鍊錶 棧 佇列 雜湊表 二叉樹 堆 跳表 圖 trie 樹 10 個演算法...