學習演算法時,思考和看答案的界限在哪裡,我很想知道!是要一直思考出問題的答案還是看答案學習方法和思想?
思考的話可以培養獨立思考的能力,在面對新的無法用原有演算法解決的問題時,可以更快想出解決辦法,看答案的話學到的東西會瞬間增多,該如何權衡?
斯坦福大學有一門關於編程競賽的課程,裡面對於碰到「卡殼」的問題有幾個建議,個人覺得第一條能很好解答題主的疑惑,引用如下(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小時在該問題上的時間總開銷會實際大於一天,可能需要好幾天甚至一個禮拜,做到捫心自問而無愧即可;5. 注意健康作息,睡前盡量不要思考。
希望有所幫助,歡迎討論。看代碼和寫代碼是兩碼事。
建議你不要看答案,用筆演算一遍,然後再能夠打一遍演算法代碼。這樣基本上算過關了。然後再去解決一些小變種問題。以常見的DFS為例,筆演算的基本內容包括以下。
首先拿到一張圖之後,圖上的節點是以什麼順序來歷遍的,這點應該能夠在圖上自己標出來。
其次,前進和後退的順序應該能夠畫出來。因為這個順序就是遞歸調用和返回的順序。然後,成功和失敗條件要搞明白。再次,每個節點上的狀態數據應該有那些?遞歸嵌套情況如何等等?這些應該能夠在每個節點上基本標出來。一些優化,剪枝要練習下。比如一些迷宮有步數限制,那麼這個步數限制如何是體現在DFS的遞歸嵌套中的,如何避免做無用搜索。最後,空間複雜度和時間複雜度是怎麼計算出來的,這個要搞明白。
相對的,BFS則就是壓棧和出棧的過程要搞清楚。
最後,多練習!既然是學習,最終不管是思考還是看答案,目的都是讓自己搞明白。建議 思考-&>看答案-&>思考 掌握最牢固
我的建議是,先不斷思考,這樣培養獨立思考的能力,實在不明白,再去找答案,不可長期依賴答案,時間久了,會變成想問題的思路只有一半,即使對的思路也不敢確定,只能去依賴答案。
推薦閱讀:
※演算法工程師大致是做什麼的?
※ACM/TOPCODER類程序設計能力對於想成為機器學習、數據挖掘類演算法工程師的學生來說的意義是什麼?
※演算法工程師有哪些發展前景?
※招行信用卡中心研發offer與大眾點評網研發工程師offer 怎麼選?