如何才能記住各種演算法?


這個問題問得很好,我那時候也是有著困惑。沒入門的話,先看看幾大經典的排序演算法(直接插入,希爾排序,簡單選擇,堆排序,冒泡排序,快速排序,歸併排序,基數排序),可以把代碼背誦下來,然後復現。

但最好理解代碼背後的數學邏輯,當你使用這些基礎演算法的時候,腦海里有個圖浮現出來,然後你在這上面完善它整個演算法流程。我那時候學習的方法是用撲克牌來學習經典演算法,後面熟了之後就可以在代碼上快速復現它。

不積跬步,無以至千里;不積小流,無以成江海。

現在有個網站是可以用動畫學習演算法和數據結構——VisuAlgo。VisuAlgo是由Steven Halim博士在2011年發布的一款可視化學習演算法的工具,用於幫助其學生更好地理解數據結構和演算法,可以讓學生按自己的步驟來學習。下圖是VisuAlgo的主頁,不得不說我上去體驗後感覺很有趣,很適合對基礎演算法的學習和了解,是一個找到後令人驚喜的網站。

VisuAlgo裡面包含了許多先進的演算法,這些演算法在Steven Halim博士的書籍里都有討論。就某種意義而言,這些先進的演算法可視化/動畫基本只能在VisuAlgo中找到。例如在圖遍歷可視化中,裡面不僅標準的深度優先搜索(DFS)和廣度優先搜索(BFS)演算法,還包含了它們的變異。

之前沒有這個網站時我是用筆和撲克牌來理解演算法的,現在工具方便了,但是道理還在那。知識的體系結構類似一棵樹,如果你想要學得快記得牢固,就必須把主幹和粗線條先學習紮實,因為後來的高級知識類似樹葉,需要有主幹的支持才能掛靠牢固。


如果你對學習人工智慧和深度學習感興趣,可以訂閱我的頭條號,我會在這裡發布所有與演算法、機器學習以及深度學習有關的有趣文章。

(碼字不易,若文章對你幫助可點個贊~)


這東西好像過一段日子總是會忘記,估計還是學的太渣了。

剛好一起複習下

排序演算法有8種:

插入排序:直接插入,希爾排序

選擇排序:簡單選擇,堆排序

交換排序:冒泡排序,快速排序

歸併排序

基數排序

反正演算法導論是看得迷糊,演算法書籍一般會寫排序、查找、樹和圖的運行過程。

排序當然還是要搞懂每種演算法的複雜度,具體代碼和邏輯。這個過程可能還要了解下計算機 CPU 緩存命中率什麼的。

先搞懂每種演算法是什麼,代碼怎麼寫,再搞清楚為什麼這樣寫。還是得多做題,多練。

練成肌肉記憶了,沒事了再瞅瞅,應該就懂了。

書讀百遍其義自見嘛。


作為一個程序員,如果記不住演算法,那什麼都不要談了,其實記演算法和平時我們背書還是大同小異的,但是如果全部想靠那個爛記憶力死記硬背,當然是萬萬不行的,特別是理科方面的東西。

大學有幾個同學學的計算機與科學,c++,visual basic,,,亂七八糟的一堆代碼演算法,一頁一頁的紙令人眼花繚亂,但是有個同學,他從來不背書,他只用心看一遍就都會了,應對期末考試小菜一碟,畢業之後不斷的應用自己學到的演算法,提高自己的能力。而相反,有個同學,前面不學,一到期末考試,死命背,還背不下去,結果幾年下來,什麼都學不到,只是順利的畢業罷了,背的東西全忘記了,毫無意義。

其實這種狀況在大學裡是非常常見的,很多人只為了應付期末而不是真正的想學到什麼。平時認真聽,再做題,從理論到實踐,體會演算法自身的精妙之處,還用浪費時間去背嗎?這和高中的數學公式是一個道理,理科,從來就是不需要背的,多實踐,自然就記得很清楚而且很難忘的那種。

演算法是需要結合實際環境進行應用的。俗話說「光說不練假把式」,光有理論而不應用實踐的話,那將失去了它原有的意義。以前一個理科老師說過如果你對一個東西足夠理解,那麼就算你一時忘記了。根據一些線索,依舊可以回憶起來。這才是真正的記住。首先,第一步需要我們去查閱資料,然後仔細的了解該演算法的內容,包括演算法的思想和實現方式,其次,了解以後就去觀摩模板,理清思路,接著試水。接下來就是通過大量的練習,將演算法融會貫通。通過運用和實戰來鞏固和夯實自己的能力。哪裡還需要去刻意的記住呢?


演算法

演算法(Algorithm)是指解題方案的準確而完整的描述,是一系列解決問題的清晰指令,演算法代表著用系統的方法描述解決問題的策略機制。也就是說,能夠對一定規範的輸入,在有限時間內獲得所要求的輸出。如果一個演算法有缺陷,或不適合於某個問題,執行這個演算法將不會解決這個問題。不同的演算法可能用不同的時間、空間或效率來完成同樣的任務。一個演算法的優劣可以用空間複雜度與時間複雜度來衡量。

演算法對於程序員來說,即恨又愛。如果你想要進 BAT 公司,那麼你的演算法基礎一定要好,同時演算法又是非常的難學。基礎的演算法有各種排序演算法:插入排序,歸併排序,快速排序,希維爾排序,堆排序等等。對於這些基礎演算法要求你可以白板寫出來。白板寫演算法,即給你一張紙和筆叫你寫出給定的演算法。對於習慣各種編程軟體的人來說,白板寫演算法是有一定的難度的。由於習慣編程軟體帶來的方便,一個編程詞語你只要打出一個字母就會有提示,直接敲回車就打出來。但當你白板寫時,就很有可能忘記這個單詞是這麼拼寫的。

演算法學習建議

演算法既然這麼重要,但同時又那麼難,那我們應該怎麼樣進行學習呢?這裡我給大家一點建議。

1、培養對演算法的興趣

市面上有非常多的演算法書籍,對於剛接觸演算法的人來說,最重要的先培養你對演算法的興趣。興趣是最好的老師。如果你一開始就去學習紅黑樹演算法,我相信沒有一個人能在對演算法產生興趣。對於初學者來說我推薦去看《啊哈!演算法》。

《啊哈!演算法》是一本充滿智慧和趣味的演算法入門書。沒有枯燥的描述,沒有難懂的公式,一切以實際應用為出發點,通過幽默的語言配以可愛的插圖來講解演算法。你更像是在閱讀一個個輕鬆的小故事或是在玩一把趣味解謎遊戲,在輕鬆愉悅中便掌握演算法精髓,感受演算法之美。

2、進階學習演算法

當你看完《啊哈!演算法》之後,你就會對演算法有了初步的認識,知道演算法是什麼,我們可以利用演算法做什麼。在這期間也能夠培養你對演算法的興趣,從而開始接下來的進階。

進階的書本推薦《演算法》第四版,有人可能會推薦《演算法導論》這本書。但《演算法導論》主要是探討了如何在數學模型寫一個漂亮的演算法,老版還居然使用 pseudo code。非常的晦澀難懂,很難讓人堅持讀下去。在學術上,毫無疑問《演算法導論》更高。

而《演算法》第四版是以 Java 為語言來講解各種經典演算法,從易到難,對每個演算法分析的非常詳細,並且通俗易懂。是非常不錯的一本演算法進階書籍。

3、結合他人博客進行學習

在學習演算法過程中,你會接觸到各種各樣的演算法,但基礎的演算法就是那麼幾個。對於基礎的演算法,一定是要達到隨時都可以白板默寫的程度。所以在學習演算法的過程中反覆的學習是非常的重要。對於在書本上新接觸到的演算法,可能你會看的似懂非懂,在進行白板默寫的時候,總是會少了幾行代碼。這就是由於你對這個演算法理解還不是非常的透徹,這時候你就可去網上搜索相應的演算法教程。看看別人在學習這個演算法的思路是什麼,在結合你對這演算法的理解。反覆的琢磨,就能非常的牢固記住這個演算法。

4、堅持學習

說的再多,如果你不去做,不堅持學習。你永遠都無法掌握演算法。學習演算法是一個非常漫長的過程,沒有人可以一個月精通演算法。你要做好持久戰的準備。每天為自己安排一定時間,靜下心來認真的學習演算法。那怕你今天只學習到一個排序演算法,但你要知道時間的力量是非常的強大,你每天堅持學習一個演算法知識,看幾頁演算法的書籍,三個月之後,一年之後,你在回頭看看自己的演算法水平。你就會發現原來演算法並不是想像中那麼高深莫測,學習不了的知識。所以行動起來!就從現在開始,拿著一本演算法的書,規劃好每天學習演算法的時間,堅持學習!相信未來的你,一定會感謝自己的努力,大家一起加油!


首先必須要說明的是,靠死記硬背絕對是靠不住的。這樣的記住毫無意義。演算法是什麼,演算法是需要結合實際環境進行應用的。老師們都常說,如果你對一個東西足夠理解,那麼就算你一時忘記了。根據一些線索,依舊可以回憶起來。這才是真正的記住。

那麼,如何才能真正的記住呢。毋庸置疑,必須要從演算法的原理入手,為什麼會有這個演算法出來?適用於什麼場合?優缺點?該場合還有什麼演算法可以與之相媲美?這些問題,是學習算大的先決條件。。

解決了如上問題後,接著我們才可以真正的談論演算法代碼的編寫。編寫也是有順序的,我們不能指望一次性就寫出符合需求的演算法,我們首先要寫出偽代碼,偽代碼就是部分代碼+文字,類似於流程圖的方式說清楚問題的解決方式。

寫完了偽代碼,然後我們可以根據課本指導或者大神代碼指導,從真正的代碼去填充偽代碼中的文字部分。最後填充完畢,根據代碼健壯性等原則在優化代碼,進一步在單步調試。

我相信,這一套流程走下來,一般人至少需要兩天左右,或者更久,之後,就算你想完全忘記這個演算法也是不容易的。。因為他已經和你的實際生活息息相關了。


我認為,死記硬背是競爭編程的缺點之一。到一定階段之後,為了取得最終的勝利,參賽者必須記住各種演算法的代碼才行。競爭編程的流程如下:

l 選擇一種演算法,掌握它的工作原理。

l 自行用演算法編程,不可重寫他人的代碼。

l 應用。找到最容易解決的問題,代入演算法。

l 研究其他出色的應用案例。

l 優化自己的應用,使運算更快,代碼更短。

l 運用該演算法解決一系列問題。每次都從頭開始重寫代碼。

競爭編程既困難又耗時,但可以讓你對一種演算法理解透徹,並迅速掌握從零開始編程的能力。

我不是一名「專業的」競爭編程愛好者,也從未在這個上面花太多的時間。有時我會跳過其中的幾個步驟,但結果卻讓我出盡洋相,什麼操作也作不了。因此,當我給參賽者出題的時候,我會盡量避免乃至任何需要死記硬背的東西。

關於同行小組,我認為和同行討論的做法很重。有經驗的同行總是能給出中肯的建議。前提是你得按照要求的步驟來。


演算法不是記的,是用的。代碼也不是記的,是用的。

想學演算法,首先掌握一門語言,C,C++,JAVA都可以,然後學一本數據結構,然後看一本簡單的演算法入門書,程度不太好的,一點不建議你看《演算法導論》,大量偽碼證明會讓你崩潰,看圖解多,代碼直接運行的,可以看看《趣學演算法》,書比較厚,大量篇幅描述為什麼這樣設計演算法,完美圖解演示演算法執行過程,幾乎包含了所有經典演算法策略。太太太菜鳥的,可以看看《啊哈演算法》,裡面講的內容不多,有很多演算法沒講,優點是簡單。入門之後,再看《演算法導論》就簡單多了,暮然回首的感覺。

沒有基礎的,不建議參加培訓課程,等入門後,提高時可以一報名參加。需要記筆記。刷題,比賽會更有趣,有動力點,比孤軍奮戰要強多了。


大致翻了翻,大部分答友都是一本正經地胡說八道,人家題主問的是:競賽編程!

參加競賽,當然要記住演算法,大腦一片空白一無所知,競賽啥?!

記住演算法,小編建議:

1.演算法用途。每類演算法甚至每個演算法,都有它的用途,記住用途,可以快速想出解題方案。

2.演算法本質。平時就要對演算法提純,考慮本質,把演算法的本質記住,可以快速的分析問題。

3.演算法實現。這個嘛,記個大概就可以,把框架和核心部分記住,實在記不住,就把思路記住吧。

平時多練習,多做筆記,多歸納總結,重複對記憶具有幫助。

謝謝大家。


大學的時候是在學院實驗室搞ACM(一種演算法比賽,三人一隊,比賽時長5小時),算是接觸了許多的數據結構和演算法,姑且以我自身的經歷來說一下。

以我自身學習演算法的經歷,學習一個演算法基本上按照以下4步進行:

1.在我準備學習一個新的演算法的時候,首先我會去查這方面的書籍或者去網上找相應的材料,包括博客或者是paper,但查的最多的還是博客,一般是CSDN。然後仔細的了解該演算法的內容,包括演算法的思想和實現方式,我一般都會把該演算法的實現過程通過自己出的數據在草稿紙上手動模擬一下,這樣可以很充分的了解演算法的每一步執行,為之後的Coding打下很好的基礎。

2.理論儲備完成以後,基本上就是Coding,其實對於演算法來講,你如果真的認真做了第一條,其實Coding真的是很簡單的事情,只不過是按照演算法每一步去實現,可能剛開始的時候你會覺得很難,無從下手,這時候你可以去博客或者Google網上大佬們的源碼瞻仰,然後根據你所理解的演算法的步驟去手動模擬一下

3.俗話說「只學不練假把式」,接下來就是通過大量的練習,將演算法融會貫通,因為我是搞ACM的,所以我們一般會去各大高校的ACM網站或者做大量的在線的比賽,通過運用和實戰來鞏固和夯實自己的能力。所以這就回到了你的問題上,怎樣記住各種演算法?唯手熟爾,也是我們俗稱的「肌肉記憶」。

4.寫博客,每次做完題以後寫題解發表在自己博客上,這也是我們劉老師當初要求的,我一直覺得這是給我養成良好習慣和好的素養的最重要的方面。

PS:下面貼一下原先經常去做題然後存儲的幾個刷題的網站,圈起來的幾個基本上是我以前常用的。

PPS:可恥的貼一下自己的CSDN的博客,雖然好久不更新了,但是以前寫的好多題解都在,希望可以給你帶來一些幫助

https://blog.csdn.net/u013486414


沒必要背 ACM-ICPC,CCPC都是可以帶紙質材料 不限頁數 就連world final也可以帶模板 但是final貌似限制多少頁A4紙

一般stl有的直接用 比賽環境高級點的話 都會開O2優化 常用的演算法 如sort 二分之類的 手寫演算法性能很難超越stl 而且一般出題人不會那麼鬼畜卡stl常數 畢竟不是八股文...

高級點的數據結構有pb_ds庫 各種平衡樹 堆 不過速度較慢

其餘演算法...我本人就是模板選手 比賽一緊張 全靠抄...剛玩這個的時候 拓展歐幾里得都是隨手擼的 現在直接抄...抄起來快 也不容易出錯


推薦閱讀:

TAG:演算法 | 教育 | 程序員 | 互聯網 | 科技 |