標籤:

代碼,演算法可以背誦嗎?

是不是記憶強的人可以把代碼背下來,然後再不斷把記憶的內容敲出來,敲多了就可以融匯貫通了? 背偽代碼也行。

----------------------------------------------

想知道你們是不是有一種巧妙的背誦方法,可以讓其保持高效地存儲,能夠基本難忘。在腦子存儲時是很清晰的感覺,還是一種偽代碼的形式?

-----------------------------------------------------

我這個提問也不是說叫大家去背代碼,只是想探索一種學習方法,像有些搞競賽的可能都是先學會背了才學會理解。背誦或許能成為一種輔助方法,提高思維也說不定。


背就行了,別誦了。真的。


可以,而且我也有背誦。

從中學時候學的全排列和各種排序演算法還有高精度運算,我嘗試過理解去寫,但是臨考競賽前,我都是死記硬背。(實話實說)把這些演算法的代碼骨架在紙上默寫了好多遍,然後去Online Judge上去做幾個使用到此類演算法的題目。我可能算天賦比較差的,我見過旁邊的確有一些牛人好像是看了幾眼就能領悟然後熟記於心的。在ACM-ICPC上,我們隊總結出來常考的一些演算法類型,把他們分工好,就各自去狂背。有些實在太複雜背不下來的(比如網路流),列印出來厚厚一疊A4紙帶入比賽場。當時還和集訓隊里的人戲稱:想要比賽好,先要帶的多!-_- 在到留學時,CMU演算法期末考試還有Facebook的面試,我都有大量的背誦和重複性的習題練習在裡面。

更加重要的是獲得比較好的記憶效果:每個人可能不一樣。我個人是在紙上寫比較容易記住,不管是流程,計劃甚至是程序。所以一些重要的東西,我不在電腦上打而是寫在紙上。另外最近看到Elon Musk的建議,我覺得很不錯(我之前重點學習他,是因為他作為一個創業者,在Paypal,電動汽車,軌道交通,太陽能光伏,火箭,太空移民方面都有涉獵,很可怕的一個全能手。) 他在Ask Me Anything上面有建議:

One bit of advice: it is important to view knowledge as sort of a semantic tree -- make sure you understand the fundamental principles, ie the trunk and big branches, before you get into the leaves/details or there is nothing for them to hang on to."

知識的體系結構類似一棵樹, 如果你想要學得快記得牢固, 就必須把主幹和粗線條先學習紮實, 因為後來的高級知識類似樹葉, 需要有主幹的支持才能掛靠牢固.

關於Elon在Ask me anything的詳細內容可以看:Elon Musk的你問我答 - QC帝國興亡史-FB,扎克伯格,創業 - 知乎專欄


演算法就是菜譜。

菜譜當然可以背誦。

但是你還是不會做菜


當年搞OI時有幾個不容易理解的演算法,擴展歐幾里得輾轉相除, kmp,二分圖匹配的Hopcroft-Karp...我都是硬背的。

但是每次題目考到相應的東西都做不出來,一是記性太差,二是壓根看不出來考的是這個演算法。

後來發現最有效的方法是推導,

」字元串匹配問題「 -&> "n^2暴力枚舉" -&> "重複枚舉的部分可以優化" -&> "用pre[x]記錄前綴x的最長可重用後綴" -&> "推出pre的計算方法" -&> "實現代碼」 (基本就是當年Knuth的心路歷程)

只有實現了這個從問題到演算法到代碼的過程才算記住了。

當然,數據結構和網路流之類的還是背吧,實現細節差一點效率差太多了,我可以在紙上默寫dinic。


謝邀:

結論寫在前面:沒入門的話,可以看基礎的書,其中的重要演算法多看幾遍並按自己的理解寫出來,並調試。入了門之後,就去做做題目,寫寫代碼,想想數學原理就可以了。用到的時候再看看書。

-----------------詳細分析---------------

就好比,英文單詞,congratulation這種詞,有些人(英語教育很差的地區)就會用c o n g r a t u l a t i o n這種形式去背,效果很差,其實正確的背誦方法是按音節去背。。。更加高級的招式是按詞根去背,更加牛的招式是去美國,用多了,自然就能拼寫出來了。。。

1.如果一堆代碼給你,你按純文本的方式去背的話,會很累,很容易錯,而且沒有和含義聯繫在一起。如果你明白每一塊的意思,那麼,就可以記住幾塊意思,然後,用到的時候臨時「拼寫」出來。偽代碼乾的就是這個事,做了一個抽象,輔助記憶。。。

2.可以對應單詞的詞根記憶法,就是說分類,比如排序類的演算法,一大片的記憶,一般的演算法書也大抵是這麼個結構,相關類型的演算法放在一起。

3.用多了或者創造過,嘗試自己去解決問題,然後經歷探索之後記住了。比如有一個演算法問題,然後你去嘗試解決,你一開始沒有思路,但通過自己就解決了,那麼你很可能摸索出了和答案一樣的演算法(相當於你把當年演算法發現者的步驟走了一遍,當然不排除你發現了一個新的,概率很低),如果你解決不掉,但通過查閱資料解決了,也會加深印象的。如果這個問題你一開始就有思路,並且很熟練了,寫不寫就看心情和時間了。

所以沒入門的時候:可以按1,2的方式,讀一本入門書,按類別記憶並拼寫調試幾個基礎演算法。。入了門就用3的方式。


可以啊,記憶也是掌握知識的一個步驟,記憶是理解的基礎和催化劑。如果你的存儲不足以放下一個程序,如何有效率的執行它?對吧。


從某種角度上面來說,如果你是想要參加OI比賽的話,背吧,這沒辦法。

就算你深入理解了 Bellman-Ford 你連想帶敲怎麼也得花掉五六分鐘,指不定哪裡還有bug。

如果你寫工程遇到演算法問題的,真不用背。這演算法那麼多,每個用到的次數也不高,到時候去查一查就是了。同樣如果是面試的話其實背的用途也不大,如果你能給面試官系統地解釋你對這個演算法的理解其實重要得多。

如果玩的是ACM/ICPC比賽的話。。。

記得帶模板 :)

BTW: 我不認為在理解演算法之前背模板有用


你看看那些noi出身的,哪個代碼里不是一堆一堆的宏,還不就是為了好背....

然而我等ACMer可以直接抄模板,所以從來不背代碼=_=(OIer別打我)


我以為別人都是看一遍就記住了,原來我不是一個人


背可以是第一步,但重要的是理解和實現。

我高中入競賽坑,第一節課老師給我們講快速排序。不過別說快排了,我當時差點就問排序是什麼了。

最坑的是我用的pascal里沒有快排。

於是我把快排背了下來,也就三十行不到的程序。

快排這個程序吧,說簡單不簡單說難也不難。短短三十行里有不少比較,是大於還是大於等於,是絕對不能錯的。背的時候不知道為什麼,就是記住了這裡是大於這裡是大於等於。

後來才慢慢理解快排的原理,大概在默寫了好幾十遍之後,終於大概理解了為什麼要嚴格上升,為什麼要隨機化。

我並不覺得背誦一點用都沒有。如果一開始不背,我可能至今也只會寫冒泡排序。

但是只背也一點用都沒有。如果不實實在在明白每一句話是為了做什麼,背下來的程序能不能寫對都是問題,更何況這記憶不會長久。



可以,但是不一定有用。 這個問題我覺得我可以答一下…當年搞oi的時候深有感觸。當時我非常喜歡且擅長做圖論題而對數論題沒有辦法。然後我想怎麼辦呢,乾脆快點把圖論做完再做其他題,然而怎麼快點做呢?手速!我就開始背演算法,因為怕被卡數據。我就把很多演算法的不同做法列印出來然後背,發現效果不好,就開始敲,在電腦上一遍遍地敲,一邊敲一邊出聲背。兩個半月我敲壞了兩塊雙飛燕(和個人輸入習慣有關吧)。後來達到兩分鐘一遍dinic網路流,四分鐘一遍四則運算高精度模板(還有很多其他的,舉這兩個例子),且不出任何錯誤直接就能跑。省選前夕可以達到閉眼在熟悉的鍵盤上都兩三分鐘一遍。雖然現在都忘光了…但在當時絕對是有用的。當時的演算法在我腦子裡是完整的代碼。


我自己背過很多演算法。比如BFS、歸併排序這些特別常見又容易寫錯的演算法。我在完全理解之前已經寫了無數份這樣的演算法代碼出來了。既然我自己都不明白怎麼來的當然是靠背啊。

背演算法其實和背代碼是不一樣的。演算法基本上只是描述了運算執行的過程,是種很模糊的東西,不是什麼具體的字母,只是一個步驟的描述。

背代碼就是記憶演算法的實現,除了演算法本身還包括一些更細節的東西,比如數據結構,臨時變數的使用,邊界值的處理等。所以我覺得背代碼的話偽代碼並沒有什麼用,不如記住一種特定語言的具體實現,這樣在寫這個演算法的時候細節處理不會有問題。

像我就是雖然演算法是靠背的,但是每次還要靠調試來查一些細節上的bug,尤其是邊界值。


當然可以背,但是不能死記硬背。


可以啊。不過背代碼不說,背演算法有何用?不理解的演算法就是沒法用的。


背沒問題啊,你看大學裡那些好多拿獎學金的妹紙不都是背的嗎(至少我周圍的人是),但到企業面試都掛了


如果你指的演算法 是基於 二分法 ,快排,起泡,哈夫曼樹 等等 這些偏向於數據結構的演算法 是需要記憶一下

如果你指的演算法是 A*,0/1背包問題,七橋問題,這些偏向於構建數學模型的演算法,我勸你最好理解其偽代碼的思路過程 不要死記硬背


當然可以,死記硬背也是一種方式。只要你腦容量夠,而且人學習的方式都是從模仿開始的。背的足夠多,就足以應付你95%的工作了。你碰到的問題大部分其他人都碰到過,所以死記硬背絕對是一種很好的方式。很多人看不起死記硬背,其實死記硬背至少代表了一個人願意去努力。很多人事情做不好,往往是連死記硬背都懶的做。


別人我不知道,反正我快排全靠背。


理解為主,背誦也需要。代碼需要記憶,不過寫的多了就會記得。主要是對代碼,演算法的理解。死記硬背的話在前期還是有用的。


推薦閱讀:

怎樣高效率背誦知識點?
學習藝術創作真的需要「循序漸進」嗎?
為什麼平時寫的練習與考試的差那麼遠?
有哪些已公開分享的雲筆記內容值得推薦?
玩命學習是種怎樣的體驗?

TAG:學習方法 |