近年來(lái)關(guān)注如何學(xué)習編程算法的用戶(hù)越來(lái)越多,小編整理了關(guān)于「62期-每日分享」如何有效學(xué)習編程算法知識?,左程云:程序員該如何學(xué)習算法???,供您參考
1.「62期-每日分享」如何有效學(xué)習編程算法知識?
62期-每日分享今天的分享來(lái)自于饑人谷程序員分享群玄已分享:如何學(xué)習算法知識?分享內容:大家好,我是本次的分享人,我目前還是一名大三的學(xué)子。群里面應該有很多都已經(jīng)工作畢業(yè)的大哥了,本次我就分享一下我在學(xué)校關(guān)于算法是怎么學(xué)的,怎么樣才能對自己的編程有一定的提高。我是2021級的本科學(xué)生,大一開(kāi)始就接觸算法了,算是一個(gè)Acmer。ICPC,CCPC都參加過(guò),也打過(guò)鐵,*也拿過(guò)CCPC銀牌,榮譽(yù)上還是有收獲的,當然了更多的就是自身編程能力,已經(jīng)思考解決問(wèn)題的能力也提高了不少。搞算法,學(xué)習算法其實(shí)是一個(gè)枯燥的過(guò)程,因為一開(kāi)始入門(mén)的話(huà),你需要度過(guò)一個(gè)時(shí)期,這個(gè)時(shí)期的話(huà),你會(huì )遇到很多的問(wèn)題,比如很多題目都是考驗時(shí)間復 雜度,比如一個(gè)簡(jiǎn)短的排序問(wèn)題,你使用O(N*N)的做法過(guò)不了,必須使用快排的思路,也就是NLog(N)的操作。這里我就是舉了一個(gè)簡(jiǎn)單的例子,算法領(lǐng)域真的很龐大,我打了兩年的比賽,*也就算是一個(gè)入門(mén)而已,談不上多厲害,至少一些常規的算法,并查集,dfs,BFS,貪心,主席樹(shù),紅黑樹(shù)怎么實(shí)現的,原理上還是懂得的,這也算是一個(gè)優(yōu)勢吧,所以算法很重要。我是怎么學(xué)習算法的呢:埋頭看書(shū)?視頻自學(xué)?當然不行!因為算法知識點(diǎn)繁多,企業(yè)考察的題目千變萬(wàn)化,并且還會(huì )跟實(shí)際業(yè)務(wù)相結合。自學(xué)的話(huà),沒(méi)人監督很難堅持,并且沒(méi)有完整的學(xué)習體系,也沒(méi)人指導,導致*的結果就是一知半解,浪費了大量的時(shí)間成本。## 學(xué)習方式1. **分類(lèi)刷題**:很多*次接觸力扣的同學(xué)對于刷題的方法不太了解,有的人跟著(zhù)題號刷,有的人跟著(zhù)每日一題刷,但是這種漫無(wú)目的的刷題方式一般都會(huì )在中途某一天放棄,或者刷了很久但是卻發(fā)現沒(méi)什么沉淀。這里不啰嗦,直接點(diǎn)明一個(gè)所有大佬都推薦的刷題方法:把自己的學(xué)習階段分散成幾個(gè)時(shí)間段去刷不同分類(lèi)的題型,比如*周專(zhuān)門(mén)解**鏈表**相關(guān)題型,第二周專(zhuān)門(mén)解**二叉樹(shù)**相關(guān)題型。這樣你的知識會(huì )形成一個(gè)體系,通過(guò)一段時(shí)間的刻意練習把這個(gè)題型相關(guān)的知識點(diǎn)強化到你的腦海中,不容易遺忘。2. **適當放棄**:很多同學(xué)遇到一個(gè)難題,非得埋頭鉆研,干他 2 個(gè)小時(shí)。*挫敗感十足,久而久之可能就放棄了算法之路。要知道算法是個(gè)沉淀了幾十年的領(lǐng)域,題解里的某個(gè)算法可能是某些教授研究很多年的心血,你想靠自己一個(gè)新手去想出來(lái)同等優(yōu)秀的解法,豈不是想太多了。所以要學(xué)會(huì )適當放棄,一般來(lái)說(shuō),比較有目的性(面試)刷題的同學(xué),他面對一道新的題目毫無(wú)頭緒的話(huà),會(huì )在 10 分鐘之內直接放棄去看題解,然后記錄下來(lái),**反復復習**,直到這個(gè)解法成為自己的知識為止。這是效率*的學(xué)習辦法。3. **接受自己是新手**:沒(méi)錯,說(shuō)的難聽(tīng)一點(diǎn),接受自己不是天才這個(gè)現實(shí)。你在刷題的過(guò)程中會(huì )遇到很多困擾你的時(shí)候,比如相同的題型已經(jīng)看過(guò)例題,**稍微變了條件就解不出來(lái)**?;蛘邔τ谝粋€(gè) **easy 難度的題毫無(wú)頭緒**?;蛘呱踔?*看不懂別人的題解**(沒(méi)錯我經(jīng)常)相信我,這很正常,不能說(shuō)明你不適合學(xué)習算法,只能說(shuō)明算法確實(shí)是一個(gè)博大精深的領(lǐng)域,把自己在其他領(lǐng)域的沉淀拋開(kāi)來(lái),接受自己是新手這個(gè)事實(shí),多看題解,多請教別人。下面是一些分類(lèi),這些準備好了的話(huà),面試大廠(chǎng)已經(jīng)夠了。## 分類(lèi)大綱1. 算法的復雜度分析。2. 排序算法,以及他們的區別和優(yōu)化。3. 數組中的雙指針、滑動(dòng)窗口思想。4. 利用 Map 和 Set 處理查找表問(wèn)題。5. 鏈表的各種問(wèn)題。6. 利用遞歸和迭代法解決二叉樹(shù)問(wèn)題。7. 棧、隊列、DFS、BFS。8. 回溯法、貪心算法、動(dòng)態(tài)規劃。個(gè)人興趣:偶爾爬爬山,打打羽毛球,周末會(huì )去游,還喜歡看電影寫(xiě)影評。不過(guò)更多時(shí)間呆學(xué)校,所以更多的興趣愛(ài)好被限制了,有自己的興趣愛(ài)好很重要,這樣子勞逸結合很有用。學(xué)習方式:一直以來(lái)都是自學(xué)前端的,走了不少的彎路,還是建議你們家里有條件的可以報個(gè)培訓班,跟著(zhù)老師走挺好的,提高效率,饑人谷也挺不錯的,看了方方的課,收入也不錯,還是建議你們萌新可以試一試,尤其是沒(méi)有自制力的小伙伴。我學(xué)前端的途徑主要是看書(shū),逛社區,比如掘金社區,遇到不懂知識點(diǎn)就慢慢看,搞明白了為止,要有專(zhuān)研精神,我覺(jué)得一定要有深度,有了深度,再向外擴展就更好了,這是我的學(xué)習方法。*,我最近在復習前端的基礎部分,經(jīng)常在掘金社區活躍,有興趣的話(huà),可以看看我的博客,總結了很多基礎的知識點(diǎn),希望對你們有幫,尋掘金小伙伴,一起學(xué)習。博客: 的個(gè)人主頁(yè)看了這么多分享,是不是也想要和其他小伙伴交流呢?可以加我WX()有什么想要問(wèn) 這位同學(xué)的可以在評論區評論哦!覺(jué)得今天分享有用的請關(guān)注一下呀!附上同學(xué)當時(shí)分享的截圖(長(cháng)圖預警?。﹡
2.左程云:程序員該如何學(xué)習算法?
大家好,我是左程云。我本科就讀于華中科技*、碩士畢業(yè)于在芝加哥*。先后在IBM、百度、GrowingIO和亞馬遜工作,是一個(gè)刷題7年的算法愛(ài)好者,也是??途W(wǎng)的老師。2014年起專(zhuān)職做程序員算法和數據結構培訓,代碼面試培訓,刷題交流等相關(guān)工作。 我是《程序員代碼面試指南--IT名企算法與數據結構題目*解》的作者 ,書(shū)籍涉及算法與數據結構編程題目240道以上,并且個(gè)人實(shí)現出*解,大部分題目為面試高頻。這篇我想寫(xiě)寫(xiě)算法的重要性、我個(gè)人是如何學(xué)習算法以及一些如何學(xué)習算法的建議。 算法在求職以及工作后的重要性 求職面試必考(校招+社招),且國內工資越高的面試中算法比重就越大。 我分別說(shuō)一下國內和國外的行情?! ぁ鴥鹊脑?huà),一般來(lái)講,工資高的公司在面試時(shí)算法和數據結構題目的比重較大,工資一般的公司比重較小。當然同樣公司的不同崗位,要求也會(huì )不同,但總體趨勢就是 國內好公司愛(ài)考算法和數據結構 。這是目前國內互聯(lián)網(wǎng)公司的情況。 國外的互聯(lián)網(wǎng)公司呢,幾乎只考算法和數據結構,很多年前就是這樣了,一直如此。我相信國內會(huì )逐漸變得像國外一樣,并不是崇洋媚外,而是算法和數據結構題目真的能考出東西。先拋開(kāi)算法,我們來(lái)說(shuō)說(shuō)面試以及如何準備。面試中都會(huì )考什么呢? 面試中會(huì )考察算法,操作系統,數據庫,計算機網(wǎng)絡(luò ),編程語(yǔ)言,項目(校招涉及)/經(jīng)歷(社招中涉及的更多)如何準備? · 操作系統,數據庫,計算機網(wǎng)絡(luò ),編程語(yǔ)言這些都是平時(shí)學(xué)習,記住了,理解了,不忘記就可以了項目或者經(jīng)歷是平時(shí)準備的,如果馬上面試了再去準備也是很難的,作假在面試中會(huì )直接被面試官看穿,所以這個(gè)平時(shí)就要準備好,如果是校招,那平時(shí)就要做一做有用的項目,如果是社招,平時(shí)在工作中就要用心做。 算法和數據結構,是真的需要好好寫(xiě)代碼才能掌握,不是說(shuō)看了理解了就真正會(huì )的了。算法筆試面試的特點(diǎn)就是沒(méi)有特點(diǎn),什么樣的題都可能遇到,因為根本沒(méi)有考綱,面試官就是普通的程序員,他們在工作中或者在網(wǎng)絡(luò )上遇到什么題不錯,就可能考,所以?xún)热菡娴奶嗔?,而且也無(wú)窮盡。這不是一個(gè)標準考試,這是能力考試。 所以,我建議大家面試或者筆試前抽出20%的時(shí)間去理解和記憶非算法和數據結構的題目,剩下的時(shí)間就是去刷題。今天學(xué)習算法變得越來(lái)越重要,雖然每個(gè)公司行業(yè)不同、崗位復雜,但算法能力強是分析能力和解決問(wèn)題能力的提現。雖然計算機的處理能力越來(lái)越強,但好算法的代碼執行效率相比起沒(méi)有優(yōu)化的代碼,已經(jīng)不能用快多少倍來(lái)描述了。計算機科學(xué)有自己的衡量標準,也就我們常說(shuō)的復雜度標準。同時(shí),學(xué)習算法對理解底層實(shí)現是非常重要的,優(yōu)秀的程序員專(zhuān)注細節和底層,具備算法能力是起點(diǎn)更是基礎。包括今天很多的領(lǐng)域,比如機器學(xué)習,深度學(xué)習,還有大熱的AI領(lǐng)域,想要研究透徹,都離不開(kāi)算法好的大腦。還有很重要的,加薪和跳槽,算法都起著(zhù)非常重要的作用。學(xué)習算法可不僅僅是刷題,這一過(guò)程中自己的思維和想法的提升才是學(xué)習算法的*好處。我是如何學(xué)習算法的? 本科在華中科技*計算機,這一期間能在學(xué)業(yè)上讓自己滿(mǎn)意的可能就是沒(méi)有掛科而已。碩士在芝加哥*,出國之前就了解到想要在國外找工作的話(huà),面試時(shí)幾乎只考算法和數據結構的題目,于是開(kāi)始了刷題,也就是搜集這方面的題,并且用代碼實(shí)現出來(lái),不斷看題解和與高手討論。 就這樣從2010年到今天,刷了7年算法和數據結構的面試題。剛開(kāi)始其實(shí)只是為了找工作才開(kāi)始刷題,但是半年之后就變成了興趣。剛開(kāi)始刷題的過(guò)程中很不順利,因為很多算法和數據結構,教材也不會(huì )講。而且去網(wǎng)上搜各種各樣的分析文章也讀不懂,感覺(jué)基礎差的很遠。當時(shí)網(wǎng)上的分析文章,也不會(huì )像今天這么易懂,高手都是把最核心的點(diǎn)說(shuō)出來(lái),但是我沒(méi)摸到人家想說(shuō)的點(diǎn)之前,就已經(jīng)不會(huì )了。于是就把很多很厚的書(shū)拿來(lái)啃,書(shū)上也看不懂就盡可能的找到高手向人家請教。對書(shū)上的題目實(shí)現了好幾遍,才發(fā)現入了門(mén),頭腦也開(kāi)始活泛起來(lái)。遇到不會(huì )的就查,發(fā)現一大片知識不知道就練。在網(wǎng)上發(fā)帖被嘲笑的日子,其實(shí)非常的漲見(jiàn)識,我很珍視那段歲月。當時(shí)在國外,學(xué)費也貴,因為錢(qián)的刺激和好勝心,居然沒(méi)有讓我變態(tài),而是變成了一種斗志,用了大量的時(shí)間好好刷題。剛開(kāi)始代碼實(shí)現算法和數據結構的題目真的非常痛苦,因為這部分的內容相比其他方面的知識絕對算高門(mén)檻,而我最開(kāi)始的基礎也并不好?,F在我經(jīng)常在網(wǎng)上給同學(xué)們講題,看到同學(xué)們表達的抱怨,那簡(jiǎn)直就是當年的我。暗暗發(fā)下心愿,如果有一天講課,絕對做一個(gè)人人都能聽(tīng)懂的好老師。但不管怎么引導,算法學(xué)習都是一個(gè)脫皮換骨的痛苦過(guò)程,但好在會(huì )迅速上癮,堅持半年之后就能一直堅持下去了。算法和數據結構問(wèn)題的技術(shù)累積需要長(cháng)時(shí)間的投入,因為內容又多又雜又難,很多算法是那種你很懷疑自己再來(lái)一輩子也可能想不到的解法。當時(shí)作為一個(gè)小白,一個(gè)算法的意思看懂了,實(shí)現起來(lái)是如此的難,測試用例總能指出我的幼稚;寫(xiě)了很多代碼終于過(guò)了這一題,看到高手寫(xiě)的實(shí)現,自己又幻滅了,高手寫(xiě)的好棒,自己寫(xiě)的……然后收拾起碎裂一地的三觀(guān),重新出發(fā)。解了很多題目之后,類(lèi)似的題目出現,自己還是會(huì )想很久。這讓我意識到,自己缺乏總結,于是開(kāi)始了總結的過(guò)程,也萌生了寫(xiě)書(shū)的沖動(dòng)。刷完一道題其實(shí)是一件很難的事情,因為普通解法很容易,但是*解真得去耐著(zhù)性子研究好久,去查資料,去做優(yōu)化,這個(gè)過(guò)程很漫長(cháng)但是足夠迷人。到底應該怎樣學(xué)習算法,作為過(guò)來(lái)人,給大家的建議 先跟大家聊聊算法吧。在網(wǎng)絡(luò )上流行一句話(huà):算法分三種,競賽的算法、面試的算法、算法。雖然我覺(jué)得這么分非常讓人無(wú)語(yǔ),但其實(shí)可以去這么理解,因為競賽、面試和純理論的要求和限制是不同的,所以算法在不同的要求中展現了不同的樣子。對于競賽來(lái)說(shuō),每道題對輸入參數和樣本量的要求都是非常明確的,同時(shí)規定的非常明確的還有空間的限制和運行時(shí)間的限制。每一個(gè)競賽選手都非常熟練怎么根據這些提前給好的限制,反推出自己需要實(shí)現一個(gè)什么樣復雜度的解法才能通過(guò)。每一行代碼包含著(zhù)前輩和自己思考過(guò)的優(yōu)化。而對于面試來(lái)說(shuō),限制往往并不明確,造成這個(gè)現象的原因也很好理解。競賽中當然是分數最重要。在面試的過(guò)程中,與面試官的交流和體現自己想事情的方式、體現自己邏輯的嚴密更重要。所以同一道題,在競賽中必須寫(xiě)清楚限制,而在面試中一道題剛開(kāi)始的限制沒(méi)那么多,目的就是縮短你理解題目的時(shí)間,讓面試者先寫(xiě)出一點(diǎn)什么,然后和面試官展開(kāi)討論,隨著(zhù)討論的深入,再逐漸的把限制聊清楚??傊诿嬖嚨膱?chǎng)合就是想看看你想問(wèn)題的習慣、軌跡以及表達能力是否符合要求。當然,不管是什么要求下的算法,經(jīng)常練習算法和數據結構題目對一個(gè)人在邏輯上的提升都是顯而易見(jiàn)的,在學(xué)校參加ACM并取得很好成績(jì)的同學(xué),如果不是表達能力特別差的話(huà),是一定會(huì )收獲很多offer的,因為思維被鍛煉的很好。對于算法,我給大家的建議: 先找到線(xiàn)團,然后進(jìn)入線(xiàn)團里學(xué)著(zhù)怎么玩。為了進(jìn)入線(xiàn)團,需要先把基礎知識掌握好?!端惴ê蛿祿Y構》(教材),你一定要看完+理解。這里面講的都是不能再基礎的東西了,覺(jué)得講得不好,自己搜維基百科。沒(méi)辦法,如果堅持不下來(lái),你后面就受罪去吧。然后有一些很經(jīng)典的書(shū)可以迅速讓你進(jìn)入狀態(tài),比如我這本《程序員代碼面試指南》,還有《劍指offer》,配合在線(xiàn)練習: 對于很龐大的算法,我個(gè)人的習慣是找例子來(lái)引導自己的思路,一點(diǎn)一點(diǎn)的接近算法的核心。*需要注意的是,一定要寫(xiě)代碼,光看沒(méi)有用的。對于經(jīng)典算法的學(xué)習,大體上分成幾個(gè)階段:*階段:對于某一個(gè)具體的算法,首先要搞清楚這個(gè)算法解決的問(wèn)題是什么,可能是實(shí)現一個(gè)具體的功能,也可能是在某些方面,比如時(shí)間復雜度或者空間復雜度方面很卓越,總之搞清楚這個(gè)算法被研究出來(lái)的目的是什么。 第二階段:然后就要弄清楚這個(gè)算法的生存環(huán)境了,也就是看看你此時(shí)研究的東西是不是對別的知識有依賴(lài),應該先把底層依賴(lài)的知識理解并掌握。這些問(wèn)題都解決之后,就進(jìn)入到算法本身的學(xué)習,理解一個(gè)算法是一件辛苦的事情,剛開(kāi)始看必然會(huì )產(chǎn)生很多的困惑,比如經(jīng)常會(huì )懷疑作者講述的內容的重要性?這些內容和這個(gè)算法有什么聯(lián)系呢?經(jīng)常會(huì )有這種摸不著(zhù)頭腦的感覺(jué),其實(shí)作者做的鋪墊都是為了建立起描述算法主要內容的基礎,只有接受和理解這些基礎,才能逐漸觸碰到算法的精髓,所以耐心是很重要的。 第三階段:算法的主要過(guò)程看完之后,往往還是會(huì )感到困惑,主要是不知道這個(gè)過(guò)程好在哪,這就進(jìn)入了下一個(gè)階段,理解作者對這個(gè)過(guò)程在功能性或者效率卓越這件事上的解釋和證明。這才真正觸碰到算法最精髓的部分,也就是深度的理解算法的主要過(guò)程所帶來(lái)的好處,這才是最鍛煉人理解能力的地方。 第四階段:上面幾點(diǎn)是算法學(xué)習階段的過(guò)程了,接下來(lái)就是研究算法的代碼實(shí)現,自己設計測試用例親自跑一下代碼,以及從代碼運行時(shí)間的角度分析這個(gè)算法的優(yōu)勢,這也是加深對算法的理解的過(guò)程。 第五階段:*是配合相應的題目練習,讓自己通過(guò)題目練習的方式,會(huì )用、善用學(xué)習到的算法,并對這個(gè)算法產(chǎn)生一定的敏感程度,具體是指看到某些題目時(shí),能夠根據題目的特點(diǎn),產(chǎn)生與該算法的對應,也就是具備舉一反三的能力。 學(xué)習永無(wú)止境,不管是算法小白,還是有一定的算法基礎,提升算法永遠都是剛需,我正好要在??途W(wǎng)即將開(kāi)一個(gè)算法班,針對算法小白的初級班和有一定算法基礎的進(jìn)階班,如果你想跟我一起學(xué)習,也歡迎你報名跟我一起探討算法,希望所有努力和上心的人都能成為大牛。課程報名: 初級班: 進(jìn)階班: 當然,正值雙十一,正好??途W(wǎng)上有個(gè)雙十一的活動(dòng),這樣買(mǎi)會(huì )比較優(yōu)惠:
如果以上內容沒(méi)有幫到您,歡迎電話(huà)聯(lián)系我們,或者聯(lián)系在線(xiàn)客服咨詢(xún)