學習演算法先看演算法書還是先刷題?

作為一個想提高演算法能力的菜鳥,經常看到別人推薦刷題,也有人推薦演算法導論之類的寶典。但是是不是得先看完演算法書,知道了怎麼動態規劃,怎麼貪心才有能力去刷題呢??


沒有理論指導的實踐是盲目的,沒有實踐驗證的理論是空洞的。

一看二抄三改四寫。

先看懂理論,再抄別人的代碼,試著改改,自己寫與創新不再是難事。

數據結構與演算法


我搞不懂,沒看過書學習過,有能力自創演算法嗎。。。

沒學過勾股定理,能已知兩邊長求直角三角形斜邊長嗎


如果能找到人帶的話,按照書裡面的演算法一個一個學,每學一個演算法之前讓那個人推薦幾道使用這個演算法的題,最好能有難度進階。在學了演算法之後立刻想這些題應該怎麼做,然後做出來。

當然這是理想情況,如果沒有人帶的話就提前去搜幾道相關的題。一樣是在學習演算法之後立刻把題做出來。和有人帶相比,這樣不能保證題目難度,以及做不出來的時候沒人講解,但也沒有辦法。

千萬不要一股腦看了十幾二十個演算法然後去OJ上找會刷的題刷。

USACO沒掛的話,直接去做USACO也是差不多的效果。可惜現在掛了。


劉汝佳的演算法競賽入門經典,先看、練完。

訓練指南和黑書不一定全弄懂,想看可以看。

這個時候就去刷一個東西,叫usaco。這個oj的題目很不錯,不過最大的好處是闖關性質的,也就是第一題完了才能做第二題並且難度循序漸進,有效防止白如冰說的只刷水題的問題。

聽我的沒錯。


不建議看演算法書,因為一般看演算法書+理解挺花時間的,而且常常不得要領。

建議一邊刷題,一邊學演算法知識。在實戰中提升自己。


先看書,把書後的習題做一做,做完想一想有沒有別的思路,刷題只是讓自己有一個不斷敲代碼的理由

很多人會寫演算法題目,卻不擅長做演算法模型,這就是搞演算法最後的悲劇


作為一個跳出演算法領域的人,我只想說說自己的一些感覺吧,刷題的目的不是為了刷題而是理解,可以先看一遍書,有自己的理解,然後去刷題,刷題的過程不懂得就翻書看看原理,其實怎麼說呢,編程就相當於蓋房,演算法就是框架,你演算法理解的透徹了,就可以去信手拈來,做到創新了,周期一般會很長除非你在這方面很有天分,那就是大神的套路了


這個東西不是對立的,而是相輔相成的。

我的經驗是邊看書邊刷題。比如說,你看演算法導論看完了KMP演算法,證明什麼都沒看懂,看了一下偽代碼也覺得似懂非懂,沒關係。這時候開始看一看具體在實踐中是怎麼實現這些演算法,找到對應kmp演算法的題目,比如Geeksforgeeks就做得很不錯,題目都是分類好的。看看別人的代碼是怎麼實現的,再不懂,帶個例子順著演算法走一遍,基本知道是怎麼回事了,然後不看別人的代碼自己實現一遍,在過程中肯定有不是特別懂的地方會卡住,想5分鐘,沒思路?看看別人的代碼,基本模仿下來一遍。隨後可以在閑暇時間想想不懂的地方,然後再回去實現一遍,直到實現已經沒什麼問題了,翻開書,再看代碼。然後是正確性證明。

總結來書,看完一個章節,動手實現對應部分的代碼,找同類型的題目來做,做完之後再回過頭來看書,加深理解演算法思路。我們最終需要記住的是書上的思路,而不是背代碼。


看看要解決的問題,看看答案的最終複雜度,然後看看能不能把演算法想出來

不能就去看書


我這個人比較實(gong)用(li)主義,所以如果從經濟效益角度來說,我會先刷題。

為什麼呢?

因為,刷題屬於實踐,看演算法書屬於理論。任何的理論最終都需要應用到實踐中去。如果你刷題的目的是為了通過公司的演算法面試,先看演算法書,可能會繞了很多不必要的彎路。就像我們在大學看了很多書,學的很多理論知識,雖然基礎看上去比較紮實,但是其實很多東西是沒有用途的。所以,如果已經明確了自己是為了找工作來學演算法,那就從公司面試的題目開始刷起,等遇到哪裡不會的,再來翻演算法書,查缺補漏。

此外,就我個人的話,還有一個原因,就是我看書特別慢,特別容易走神,所以不適合看書。不如上來就開始做演算法題。

那麼,刷多少題才夠?才能拿到offer呢?

以lintcode為例,上面有幾百題目,很少有人能把他全部刷完。我覺得,刷題時,首先還是要有方向、有脈絡地刷題,切忌亂打拳。比如,我自己就會拿一本演算法書,看看大綱上有哪些類別的演算法知識點,然後在lintcode上通過標籤查詢、和相關題目練習,去完成這一類別題目的練習。遇到不會做的題目,或者思路卡住的地方,就在演算法書上查找相關的知識點,幫助自己AC掉題目。

另外,刷題時,我還會先從 lintcode easy 的題目開始刷起,然後是medium, 最後才是hard。這樣一步一步地,一段時間後,就可以看到自己的提升。


啥都不會 請看書

演算法會了但是不會做題 請刷題


書上不是有習題么。

我見過一些只刷題的人刷到最後只刷水題,每天都在糾結題目要求的輸出格式是什麼。


我就知道上小學的時候老師告訴我作業只是為了鞏固所學的知識


開始的時候學一點刷一點啊,入門了之後刷一點學一點。


1.我覺得首先攻克語言關,包括編程語言和外語

2.可以學一下劉汝佳的《演算法競賽入門經典(第二版)》,同時去做UVAOJ上的配套題目 UVa Online Judge

3.等基礎打得差不多了 可以看點什麼演算法導論之類的深入演算法的東西,平時也可以去 Topcoder,Codeforces 參加一下比賽,也當作練習,鍛煉一下演算法和思維,個人比較推薦Codeforces上的比賽 能看到別人的代碼。

不過不知道你學習演算法的目的是什麼 是參加ACM 還是其他目的 總之這是一個很花時間,但很能鍛煉自己的東西。


提到刷題,感覺有可能要進ACM這個大坑,那就跟著隊長,師兄師姐和教練的路子走吧,來知乎效率不一定高。

不玩ACM的話

工程向的看這本書:Algorithms, 4th Edition by Robert Sedgewick and Kevin Wayne 認真看完,真的,就夠了,這麼好的書,記得看英文影印版的,最好能支持正版。

要是工程向而且還有點刷題慾望,那就去Topcoder,裡面有一些常用演算法的Algorithm Tutorials,收穫還是蠻大的。

學術向的水太深了,數論,線性代數的基礎要好,然後演算法導論必看,太虐了我也不太懂。估計題主也不是這個路子。


樓上這種一上來就刷DP這種難度的真的好么…

我的建議是:數據結構先擼個遍。鏈表隊列棧二叉樹二叉排序樹紅黑樹這些基本ADT要能自己寫出來,比如棧裡面有波蘭逆序啊,表達式求值,二叉樹有Huffman編碼啊之類經典演算法還是要懂的。

然後進階就是圖論了,DFS,BFS,最小生成樹,最短路徑,DAG拓撲排序,網路流之類的。

再進階就是DP貪心數論或者人工智慧高級ADT了…


作為演算法小鳥,比不上樓上那些大牛,但我也說下我的看法。。

其實先看書或是先刷題先後關係真的不大,但是刷題和演算法的目的性一定要記清楚。。

演算法----------------------開闊視野,構建自己解決問題的知識基礎(如上文說不知道勾股定理那句話的同學),熟悉推導過程以及形式化的思維方式,利用高級理論去看待低級問題(就是把具體問題一定程度的抽象化,抽象成適合你解題的程度)

刷題---------------------就刷題這點,我覺得不止是演算法的一個實踐過程,還有些別的東西,如以下幾點,如各條之間有重複,求別噴

1.演算法實踐與學習,想10次不如用1次印象深刻,這條主要是增加記憶,強化思考

2.編程訓練,其實acm比賽中有一條很重要的東西,就是對邊界條件的思考,沒有很完整的邊界思考,刷題是很難過的,這對以後職業道路的編碼也很重要

3.精益求精,相同的演算法,編出比別人優秀的程序,我們是程序員,不是數學家,數學家發明牛逼演算法,牛逼公式,但對於演算法小鳥來說,咱們用的實際上都是別人用過千萬遍的公式演算法,這個時候就僅限於會用,起到的作用有,但是沒那麼大,一個很好的例子,中國acm第一人(頭把交椅),婁教主,跟著姚期智老師,他發論文(新演算法解決新問題)比一定能比他們實驗室本科生強,但是相同的演算法,他寫出來的代碼就是比別人高效,

這就是工程師發展到極致,我們需要數學家指導,開發,研究新演算法,但是新演算法的實現,受限於機器及系統特性,怎麼能在這樣的限制下開發出性能優異,穩定性卓越的代碼,這基本上就是acm以及刷題的最大意義了。


先開始比較重要


我屬於先學了演算法然後刷題的。我反正什麼紅黑樹啊,最短路徑啊,數據結構啊都學得還可以,也很全面。

然後開始刷題。。。

發現自己c語言本身沒學好,演算法思路有的無從下筆。。。

開始狂補ing


推薦閱讀:

有哪些音樂適合學習時聽?
怎樣培養英語思維,尤其是在讀英文文章的時候?
關於學習C語言,最好的幾本書是哪些?
二本學校和名校差距大怎麼辦?
如何自學大學數學(數學專業的)?

TAG:學習 | 演算法 | 編程 | 數據結構 |