歡迎關注天善智慧型,我們是專注於商業智慧型bi,人工智慧ai,大資料分析與挖掘領域的垂直社群,學習,問答、求職一站式搞定!題目有點標題黨了,還請大家見諒。下面切入正題。
演算法很重要,但演算法也是學起來最難,最令人生畏的。
這篇就來說說演算法刷題方面的一些經驗和技巧。
大家在刷題的時候不知道有沒有遇到以下情況。
拿到題目後就開始想著怎麼寫**,結果寫了大半天,發現越寫越亂,最後就寫不下去了,又或者是,看到題目後,一臉懵逼,完全不知道怎麼下手。
其實,學演算法,刷題蠻幹是不行的,需要遵循科學的方法。
以下的經驗技巧,對於演算法新手,或大學沒有搞過acm,想利用業餘時間提公升演算法能力的同學比較有幫助,對於演算法高手和acm大牛,可能不太適用,僅供參考。
演算法不是拼智商
演算法不是純粹拼智商的,智商高,就一定很厲害,不夠聰明,就一定不行。演算法是一種技能,是可以通過科學合理的方式訓練出來的能力。
智商的高低,當然會有影響,但這個先天因素無法改變,而科學合理的方法是大家都可以掌握的。
所以,首要的一點,是要意識到,演算法不是只拼智商的,也是可以經由後天訓練習得的。
難度要循序漸進
有些同學喜歡上來就是幹,上來就是終極難度的題目,覺得自己只要做出最難的,其它的就迎刃而解了。這種急於求成的思想要不得。
演算法訓練是乙個系統工程,需要循序漸進,太過於急功近利,反而容易因做不出難題而產生挫敗感,帶來反效果。
記得我有乙個同事就做了次類似的事情。我們當時剛聽說有leetcode,就想上去試試,他上去後就挑了一道困難裡面還屬於比較難的題目,結果想了大半天也沒做出來,搞到自己特別沮喪。
你會發現這種做法效率很低,那道題目就算被做出來了,也不代表就可以解出其它的題目。
合理的做法是循序漸進。
如果你本身有基礎,熟練度高,那你刷簡單的leetcode應該是幾分鐘一題,幾分鐘一題的,花不了你多少時間。
如果你刷簡單都花費很長時間,說明熟練度不夠,就更應該從簡單開始。
然後過度到中等,再過度到困難。
這裡有個經驗之談。
目前國內大廠的演算法考察,基本不會超過leetcode 中等難度,上限難度基本都是leetcode 中等題裡面的中等難度(有點拗口,leetcode 中等難度裡面也有分檔次)。
如果你能夠再20分鐘內,做出這種難度的題目,國內大廠的演算法面試,基本可以暢通無阻。
按演算法分類來選題
選擇題目,除了在難度上要循序漸進,還建議在演算法上進行劃分。
基本的演算法資料結構是有限的。比如說鍊錶,二叉樹,二分查詢,動態規劃,雜湊表。。。
我喜歡按演算法的分類來選題和刷題,比如乙個時間段,只刷鍊錶題,待刷得差不多的時候,接下來再刷二叉樹的題。。。
這種做法可以極大的提高刷題的速度,而且能帶來更好的效果。
一,持續地刷同個型別的題目,可以不斷地鞏固和加深理解。
二,可以更全面地接觸這個資料結構,演算法的各個變種,這會促使你對這個資料結構,演算法的理解更加全面和深刻,學習的效率會更高。
所以在一段時間內,持續地刷特定類別的題目,可以帶來事半功倍的效果。
當然,在能力已經比較強的時候,可以採用打散的方式來刷題,可以更好地鍛鍊思維的靈活性和應變能力,但初期或能力較弱的時候,按分類選題,是比較好的。
解題三部曲
在具體做題的時候,可以採用以下三個步驟來進行。
拿到題目後,不要立馬開幹,想著下面的三個步驟,一步一步地來。
1. 看懂題目
看懂題目。有的題目很直接,直接告訴你要解決的問題是什麼,題目本身甚至都包含了對應的資料結構和需要用到的演算法;有的題目很隱晦,看了半天不知道它到底要解決什麼問題,可以用什麼演算法和資料結構來解。所以,看到題目後,一定要先確保自己理解清楚了。
我的乙個經驗是,拿到乙個題目後,看5分鐘,如果5分鐘之內看不懂,我就mark 下來,留到後面再做,要不很影響刷題的心情。
不過就leetcode 來說,這樣的題目不多。基本都能在再5分鐘內看懂。
2.分析,推導解法
分析推導題目的解法。
這個步驟要有意識地單獨拎出來,不要跟編碼步驟混淆在一起。也就是說,你在分析推導題目解法的時候,不要去想任何實現相關地事情,不用去想**怎麼寫,不用去想要用什麼庫,定義什麼變數,用多少層迴圈,都不要想,就想著在邏輯上,這道題目要怎麼解。
這樣做可以極大地降低你的心智負擔,使你高效地想出題目的解法。對於如何將想法變成**,可以留在下乙個步驟,單獨來進行。
3.將思路轉換為**
當你確定題目都已經理解,並且分析推導出了題目的解法後,你才開始來思考如何將自己的思路轉換成**。是地,將思路轉換成**,可以是乙個單獨地步驟,在實際工作中,其實也是很重要的乙個能力。
有時,將乙個思路轉換成演算法是很容易且自然的;但有時,有些思路轉換成**,是很有難度的事情。
或者你有體會,分析推導只用了不到十分鐘,結果**寫了半小時還寫不完整。
怎麼定義變數,儲存狀態,用遞迴,還是用迴圈加輔助資料結構等等,都是將思路轉換成**要做的事情。
這個能力也需要刻意地去練習。
演算法的封裝
接下來,說點更細節的東西,演算法的封裝。
軟體設計裡面,最關鍵的思想就是抽象和封裝了。
其實解題也可以用到這種思路。
比如一道題目的正確解法是先排序,再進行二分查詢,那你的腦子裡面只要記得,快速排序和二分查詢,就可以了,不需要去想,快速排序和二分查詢的具體實現。
就像我們在寫**的時候,遇到排序,查詢,我們一般都直接使用了現成的函式庫,而不需要自己動手再寫一遍。這個是**層面封裝帶來的好處,思維層面的封裝也是一樣的道理。
這種封裝思想在做題的時候可以極大地減輕我們的心智負擔,使得自己的腦力可以發揮在問題的核心點上。
用封裝的思維去解題,你的解題能力會有快速地提公升。
封裝的思想可以用於 「2.分析,推導解法」 的過程,在 「3.將思路轉換為**」 的過程,更是可以用語言內建的演算法函式,資料結構來直接實現,也使得從思路轉換到**的過程更加的直觀和自然。
在實際的面試或比賽中,除非有特殊說明,一般都可以放心地使用語言的內建演算法和資料結構。
然後你可能會問,對於像排序,查詢這些基礎的演算法應該怎麼對待呢?我的建議是可以把它們當作重要演算法來刻意練習。
快排,快搜,堆排序等,我們可以稱它們為元演算法。
對於這些演算法的刻意練習。一開始的時候,要看演算法書的描述,確保自己理解了演算法的思路,然後嘗試自己實現一遍。
實在寫不出來,就參照或者直接抄。乙個演算法花幾天的時間,大部分人都是可以理解並自己實現出來的。(排除一些特別難的,需要更長的時間)。
保持持續的動力
演算法能力的提公升,是乙個長期的事情,需要持續地學習和做題,而刷題又是個比較枯燥的過程,在遇到難題的時候,很容易產生挫敗感,甚至導致直接放棄。
所以這裡需要特別關注刷題時的正反饋。如果你老是無法解出某個難度或某個類別的題目的時候,你就要考慮降低難度,或者安排額外的時間,去更全面的複習特定的演算法和資料結構了。
注意不要死磕!演算法學習,特別講求方法和技巧,死磕非但磕不過去,還可能留下對演算法的心裡陰影,導致學習障礙。
總結
首先演算法不是只拼智商的,是可以通過後天的刻意練習掌握的一種能力。
剛上手的時候,難度上需要循序漸進,最好能夠按演算法分類來刷題。
解題的時候,建議按這三個步驟來
1,看懂題目
2,分析,推導解法
3,將思路轉換為**。
在更細節方面,封裝的思想也可使用在演算法上面,可以極大地降低我們的心智負擔,提公升解題的效率。
最後是要注意做題過程中的正反饋,確保自己能持續地做下去。
希望這裡分享的經驗技巧,能給大家帶來幫助!
感謝閱讀
推薦閱讀:
1:爬一爬那些年你硬碟存過的老師
2:終於有人把雲計算、大資料和人工智慧講明白了!
3:劍橋小姐姐的國內ai演算法面試經歷
4:2023年python愛好者社群歷史文章合集(作者篇)
5:2023年終精心整理|python愛好者社群歷史文章合集(型別篇)
春招某大廠 不會二叉排序樹還想進來?
2020 注定是多災多難的一年,疫情尚未完全散去,不少大廠已經開始了瘋狂挖人,於是筆者難耐寂寞向某一線網際網路大廠投了乙份簡歷,開始了 之旅。於是筆者在乙個寂靜的夜晚痛定思痛,總結資料結構面試相關的文章,希望能幫助各位讀者以後面試百戰百勝,對面試官進行絕地反擊,吊打問你的面試者,讓一同面試的同僚瞠目...
想進大廠,需要惡補這些知識點!
對於618 雙十 一 春運搶票這種高併發 大流量的場景,一般都會用快取抗住大併發,市面上快取框架用的最多的無疑就是redis了,作為最受歡迎的分布式快取中介軟體,是應對高併發,大流量,低延遲業務場景的不二選擇。下面這十幾道題都是大廠面試必問的,redis架構設計與底層原理相關的佔了70 看看你會幾道...
面試分享 想跳槽漲薪,想進大廠,如何準備面試呢
想跳槽漲薪,想進大廠,如何準備面試呢,有沒有面試經驗分享?機智 現在就帶你了解大廠面試的那些事兒,分享面試技巧,為公升職加薪添磚加瓦!首先,請教大家乙個問題,你們面試前都會做哪些準備呢?1 j a 的核心知識 2 演算法 3 專案 主要包括,1 專案背景,2 系統的演進之路 3 專案中的技術選型 4...