學習演算法時,思考和看答案的界限在哪裡,我很想知道!是要一直思考出問題的答案還是看答案學習方法和思想?

思考的話可以培養獨立思考的能力,在面對新的無法用原有演算法解決的問題時,可以更快想出解決辦法,看答案的話學到的東西會瞬間增多,該如何權衡?


斯坦福大學有一門關於編程競賽的課程,裡面對於碰到「卡殼」的問題有幾個建議,個人覺得第一條能很好解答題主的疑惑,引用如下(CS 97SI: Introduction to Competitive Programming Contests):

If you get stuck…

  • First, remember that you are not stuck unless you have spent more than a day on a single problem. It is perfectly normal to spend many hours on just coming up with the right algorithm.

  • Read the problem statement again. You might have missed something very important.

  • Carefully go through the lecture slides. Think about how to apply the basic algorithms covered in class to the problem.

  • Discuss the problem with friends. Working in teams of size 2 or 3 is strongly recommended. As long as you don"t copy-paste someone else"s codes blindly, you can even share your (possibly buggy) codes.

當碰到卡殼的問題時,是自己儘力獨立思考還是翻看答案,自己可以設置一個合理的時間。在該時間限制以內,儘力去思考;超過該時間後,直接看答案。上面的建議中的時間為一天,個人提供幾個補充建議:

1. 一天的時間,即24小時,應當是完全花在該問題上的時間,中途因其他事而被打斷的時間應去除,而平時走路吃飯思考該問題的時間片段則應該計入其中;

2. 最後實際花費24小時在該問題上的時間總開銷會實際大於一天,可能需要好幾天甚至一個禮拜,做到捫心自問而無愧即可;

3. 心態方面不驕不躁,當做是一件最平常的事來處之,想出來了和沒想出來都正常,忌驕傲,更忌自卑,這個過程是對個人心境的一種難得的磨練;

4. 當遇到那些沒有答案的開放性問題時,若冥思苦想後仍未有頭緒,暫時放下該問題,做點別的事,但卻不放棄——猶如下棋中的「等招」,這時潛意識中仍留有該問題,「思之思之,鬼神助之」,過段時間回頭再來看這個問題,往往會收穫「靈感」;

5. 注意健康作息,睡前盡量不要思考。

希望有所幫助,歡迎討論。


看代碼和寫代碼是兩碼事。

建議你不要看答案,用筆演算一遍,然後再能夠打一遍演算法代碼。這樣基本上算過關了。然後再去解決一些小變種問題。

以常見的DFS為例,筆演算的基本內容包括以下。

首先拿到一張圖之後,圖上的節點是以什麼順序來歷遍的,這點應該能夠在圖上自己標出來。

其次,前進和後退的順序應該能夠畫出來。因為這個順序就是遞歸調用和返回的順序。

然後,成功和失敗條件要搞明白。

再次,每個節點上的狀態數據應該有那些?遞歸嵌套情況如何等等?這些應該能夠在每個節點上基本標出來。

一些優化,剪枝要練習下。比如一些迷宮有步數限制,那麼這個步數限制如何是體現在DFS的遞歸嵌套中的,如何避免做無用搜索。

最後,空間複雜度和時間複雜度是怎麼計算出來的,這個要搞明白。

相對的,BFS則就是壓棧和出棧的過程要搞清楚。

最後,多練習!


既然是學習,最終不管是思考還是看答案,目的都是讓自己搞明白。

建議 思考-&>看答案-&>思考 掌握最牢固


我的建議是,先不斷思考,這樣培養獨立思考的能力,實在不明白,再去找答案,不可長期依賴答案,時間久了,會變成想問題的思路只有一半,即使對的思路也不敢確定,只能去依賴答案。


推薦閱讀:

演算法工程師大致是做什麼的?
ACM/TOPCODER類程序設計能力對於想成為機器學習、數據挖掘類演算法工程師的學生來說的意義是什麼?
演算法工程師有哪些發展前景?
招行信用卡中心研發offer與大眾點評網研發工程師offer 怎麼選?

TAG:演算法 | 演算法導論書籍 | 演算法設計 | 演算法工程師 |