近年來關(guān)注程序員如何學(xué)習(xí)算法的用戶越來越多,小編整理了關(guān)于左程云:程序員該如何學(xué)習(xí)算法?,程序員如何提升算法思維???,供您參考
1.左程云:程序員該如何學(xué)習(xí)算法?
大家好,我是左程云。我本科就讀于華中科技*、碩士畢業(yè)于在芝加哥*。先后在IBM、百度、GrowingIO和亞馬遜工作,是一個(gè)刷題7年的算法愛好者,也是牛客網(wǎng)的老師。2014年起專職做程序員算法和數(shù)據(jù)結(jié)構(gòu)培訓(xùn),代碼面試培訓(xùn),刷題交流等相關(guān)工作。 我是《程序員代碼面試指南--IT名企算法與數(shù)據(jù)結(jié)構(gòu)題目*解》的作者 ,書籍涉及算法與數(shù)據(jù)結(jié)構(gòu)編程題目240道以上,并且個(gè)人實(shí)現(xiàn)出*解,大部分題目為面試高頻。這篇我想寫寫算法的重要性、我個(gè)人是如何學(xué)習(xí)算法以及一些如何學(xué)習(xí)算法的建議。 算法在求職以及工作后的重要性 求職面試必考(校招+社招),且國(guó)內(nèi)工資越高的面試中算法比重就越大。 我分別說一下國(guó)內(nèi)和國(guó)外的行情?! ぁ?guó)內(nèi)的話,一般來講,工資高的公司在面試時(shí)算法和數(shù)據(jù)結(jié)構(gòu)題目的比重較大,工資一般的公司比重較小。當(dāng)然同樣公司的不同崗位,要求也會(huì)不同,但總體趨勢(shì)就是 國(guó)內(nèi)好公司愛考算法和數(shù)據(jù)結(jié)構(gòu) 。這是目前國(guó)內(nèi)互聯(lián)網(wǎng)公司的情況。 國(guó)外的互聯(lián)網(wǎng)公司呢,幾乎只考算法和數(shù)據(jù)結(jié)構(gòu),很多年前就是這樣了,一直如此。我相信國(guó)內(nèi)會(huì)逐漸變得像國(guó)外一樣,并不是崇洋媚外,而是算法和數(shù)據(jù)結(jié)構(gòu)題目真的能考出東西。先拋開算法,我們來說說面試以及如何準(zhǔn)備。面試中都會(huì)考什么呢? 面試中會(huì)考察算法,操作系統(tǒng),數(shù)據(jù)庫,計(jì)算機(jī)網(wǎng)絡(luò),編程語言,項(xiàng)目(校招涉及)/經(jīng)歷(社招中涉及的更多)如何準(zhǔn)備? · 操作系統(tǒng),數(shù)據(jù)庫,計(jì)算機(jī)網(wǎng)絡(luò),編程語言這些都是平時(shí)學(xué)習(xí),記住了,理解了,不忘記就可以了項(xiàng)目或者經(jīng)歷是平時(shí)準(zhǔn)備的,如果馬上面試了再去準(zhǔn)備也是很難的,作假在面試中會(huì)直接被面試官看穿,所以這個(gè)平時(shí)就要準(zhǔn)備好,如果是校招,那平時(shí)就要做一做有用的項(xiàng)目,如果是社招,平時(shí)在工作中就要用心做。 算法和數(shù)據(jù)結(jié)構(gòu),是真的需要好好寫代碼才能掌握,不是說看了理解了就真正會(huì)的了。算法筆試面試的特點(diǎn)就是沒有特點(diǎn),什么樣的題都可能遇到,因?yàn)楦緵]有考綱,面試官就是普通的程序員,他們?cè)诠ぷ髦谢蛘咴诰W(wǎng)絡(luò)上遇到什么題不錯(cuò),就可能考,所以內(nèi)容真的太多了,而且也無窮盡。這不是一個(gè)標(biāo)準(zhǔn)考試,這是能力考試。 所以,我建議大家面試或者筆試前抽出20%的時(shí)間去理解和記憶非算法和數(shù)據(jù)結(jié)構(gòu)的題目,剩下的時(shí)間就是去刷題。今天學(xué)習(xí)算法變得越來越重要,雖然每個(gè)公司行業(yè)不同、崗位復(fù)雜,但算法能力強(qiáng)是分析能力和解決問題能力的提現(xiàn)。雖然計(jì)算機(jī)的處理能力越來越強(qiáng),但好算法的代碼執(zhí)行效率相比起沒有優(yōu)化的代碼,已經(jīng)不能用快多少倍來描述了。計(jì)算機(jī)科學(xué)有自己的衡量標(biāo)準(zhǔn),也就我們常說的復(fù)雜度標(biāo)準(zhǔn)。同時(shí),學(xué)習(xí)算法對(duì)理解底層實(shí)現(xiàn)是非常重要的,優(yōu)秀的程序員專注細(xì)節(jié)和底層,具備算法能力是起點(diǎn)更是基礎(chǔ)。包括今天很多的領(lǐng)域,比如機(jī)器學(xué)習(xí),深度學(xué)習(xí),還有大熱的AI領(lǐng)域,想要研究透徹,都離不開算法好的大腦。還有很重要的,加薪和跳槽,算法都起著非常重要的作用。學(xué)習(xí)算法可不僅僅是刷題,這一過程中自己的思維和想法的提升才是學(xué)習(xí)算法的*好處。我是如何學(xué)習(xí)算法的? 本科在華中科技*計(jì)算機(jī),這一期間能在學(xué)業(yè)上讓自己滿意的可能就是沒有掛科而已。碩士在芝加哥*,出國(guó)之前就了解到想要在國(guó)外找工作的話,面試時(shí)幾乎只考算法和數(shù)據(jù)結(jié)構(gòu)的題目,于是開始了刷題,也就是搜集這方面的題,并且用代碼實(shí)現(xiàn)出來,不斷看題解和與高手討論。 就這樣從2010年到今天,刷了7年算法和數(shù)據(jù)結(jié)構(gòu)的面試題。剛開始其實(shí)只是為了找工作才開始刷題,但是半年之后就變成了興趣。剛開始刷題的過程中很不順利,因?yàn)楹芏嗨惴ê蛿?shù)據(jù)結(jié)構(gòu),教材也不會(huì)講。而且去網(wǎng)上搜各種各樣的分析文章也讀不懂,感覺基礎(chǔ)差的很遠(yuǎn)。當(dāng)時(shí)網(wǎng)上的分析文章,也不會(huì)像今天這么易懂,高手都是把最核心的點(diǎn)說出來,但是我沒摸到人家想說的點(diǎn)之前,就已經(jīng)不會(huì)了。于是就把很多很厚的書拿來啃,書上也看不懂就盡可能的找到高手向人家請(qǐng)教。對(duì)書上的題目實(shí)現(xiàn)了好幾遍,才發(fā)現(xiàn)入了門,頭腦也開始活泛起來。遇到不會(huì)的就查,發(fā)現(xiàn)一大片知識(shí)不知道就練。在網(wǎng)上發(fā)帖被嘲笑的日子,其實(shí)非常的漲見識(shí),我很珍視那段歲月。當(dāng)時(shí)在國(guó)外,學(xué)費(fèi)也貴,因?yàn)殄X的刺激和好勝心,居然沒有讓我變態(tài),而是變成了一種斗志,用了大量的時(shí)間好好刷題。剛開始代碼實(shí)現(xiàn)算法和數(shù)據(jù)結(jié)構(gòu)的題目真的非常痛苦,因?yàn)檫@部分的內(nèi)容相比其他方面的知識(shí)絕對(duì)算高門檻,而我最開始的基礎(chǔ)也并不好。現(xiàn)在我經(jīng)常在網(wǎng)上給同學(xué)們講題,看到同學(xué)們表達(dá)的抱怨,那簡(jiǎn)直就是當(dāng)年的我。暗暗發(fā)下心愿,如果有一天講課,絕對(duì)做一個(gè)人人都能聽懂的好老師。但不管怎么引導(dǎo),算法學(xué)習(xí)都是一個(gè)脫皮換骨的痛苦過程,但好在會(huì)迅速上癮,堅(jiān)持半年之后就能一直堅(jiān)持下去了。算法和數(shù)據(jù)結(jié)構(gòu)問題的技術(shù)累積需要長(zhǎng)時(shí)間的投入,因?yàn)閮?nèi)容又多又雜又難,很多算法是那種你很懷疑自己再來一輩子也可能想不到的解法。當(dāng)時(shí)作為一個(gè)小白,一個(gè)算法的意思看懂了,實(shí)現(xiàn)起來是如此的難,測(cè)試用例總能指出我的幼稚;寫了很多代碼終于過了這一題,看到高手寫的實(shí)現(xiàn),自己又幻滅了,高手寫的好棒,自己寫的……然后收拾起碎裂一地的三觀,重新出發(fā)。解了很多題目之后,類似的題目出現(xiàn),自己還是會(huì)想很久。這讓我意識(shí)到,自己缺乏總結(jié),于是開始了總結(jié)的過程,也萌生了寫書的沖動(dòng)。刷完一道題其實(shí)是一件很難的事情,因?yàn)槠胀ń夥ê苋菀祝?解真得去耐著性子研究好久,去查資料,去做優(yōu)化,這個(gè)過程很漫長(zhǎng)但是足夠迷人。到底應(yīng)該怎樣學(xué)習(xí)算法,作為過來人,給大家的建議 先跟大家聊聊算法吧。在網(wǎng)絡(luò)上流行一句話:算法分三種,競(jìng)賽的算法、面試的算法、算法。雖然我覺得這么分非常讓人無語,但其實(shí)可以去這么理解,因?yàn)楦?jìng)賽、面試和純理論的要求和限制是不同的,所以算法在不同的要求中展現(xiàn)了不同的樣子。對(duì)于競(jìng)賽來說,每道題對(duì)輸入?yún)?shù)和樣本量的要求都是非常明確的,同時(shí)規(guī)定的非常明確的還有空間的限制和運(yùn)行時(shí)間的限制。每一個(gè)競(jìng)賽選手都非常熟練怎么根據(jù)這些提前給好的限制,反推出自己需要實(shí)現(xiàn)一個(gè)什么樣復(fù)雜度的解法才能通過。每一行代碼包含著前輩和自己思考過的優(yōu)化。而對(duì)于面試來說,限制往往并不明確,造成這個(gè)現(xiàn)象的原因也很好理解。競(jìng)賽中當(dāng)然是分?jǐn)?shù)最重要。在面試的過程中,與面試官的交流和體現(xiàn)自己想事情的方式、體現(xiàn)自己邏輯的嚴(yán)密更重要。所以同一道題,在競(jìng)賽中必須寫清楚限制,而在面試中一道題剛開始的限制沒那么多,目的就是縮短你理解題目的時(shí)間,讓面試者先寫出一點(diǎn)什么,然后和面試官展開討論,隨著討論的深入,再逐漸的把限制聊清楚??傊诿嬖嚨膱?chǎng)合就是想看看你想問題的習(xí)慣、軌跡以及表達(dá)能力是否符合要求。當(dāng)然,不管是什么要求下的算法,經(jīng)常練習(xí)算法和數(shù)據(jù)結(jié)構(gòu)題目對(duì)一個(gè)人在邏輯上的提升都是顯而易見的,在學(xué)校參加ACM并取得很好成績(jī)的同學(xué),如果不是表達(dá)能力特別差的話,是一定會(huì)收獲很多offer的,因?yàn)樗季S被鍛煉的很好。對(duì)于算法,我給大家的建議: 先找到線團(tuán),然后進(jìn)入線團(tuán)里學(xué)著怎么玩。為了進(jìn)入線團(tuán),需要先把基礎(chǔ)知識(shí)掌握好?!端惴ê蛿?shù)據(jù)結(jié)構(gòu)》(教材),你一定要看完+理解。這里面講的都是不能再基礎(chǔ)的東西了,覺得講得不好,自己搜維基百科。沒辦法,如果堅(jiān)持不下來,你后面就受罪去吧。然后有一些很經(jīng)典的書可以迅速讓你進(jìn)入狀態(tài),比如我這本《程序員代碼面試指南》,還有《劍指offer》,配合在線練習(xí): 對(duì)于很龐大的算法,我個(gè)人的習(xí)慣是找例子來引導(dǎo)自己的思路,一點(diǎn)一點(diǎn)的接近算法的核心。*需要注意的是,一定要寫代碼,光看沒有用的。對(duì)于經(jīng)典算法的學(xué)習(xí),大體上分成幾個(gè)階段:*階段:對(duì)于某一個(gè)具體的算法,首先要搞清楚這個(gè)算法解決的問題是什么,可能是實(shí)現(xiàn)一個(gè)具體的功能,也可能是在某些方面,比如時(shí)間復(fù)雜度或者空間復(fù)雜度方面很卓越,總之搞清楚這個(gè)算法被研究出來的目的是什么。 第二階段:然后就要弄清楚這個(gè)算法的生存環(huán)境了,也就是看看你此時(shí)研究的東西是不是對(duì)別的知識(shí)有依賴,應(yīng)該先把底層依賴的知識(shí)理解并掌握。這些問題都解決之后,就進(jìn)入到算法本身的學(xué)習(xí),理解一個(gè)算法是一件辛苦的事情,剛開始看必然會(huì)產(chǎn)生很多的困惑,比如經(jīng)常會(huì)懷疑作者講述的內(nèi)容的重要性?這些內(nèi)容和這個(gè)算法有什么聯(lián)系呢?經(jīng)常會(huì)有這種摸不著頭腦的感覺,其實(shí)作者做的鋪墊都是為了建立起描述算法主要內(nèi)容的基礎(chǔ),只有接受和理解這些基礎(chǔ),才能逐漸觸碰到算法的精髓,所以耐心是很重要的。 第三階段:算法的主要過程看完之后,往往還是會(huì)感到困惑,主要是不知道這個(gè)過程好在哪,這就進(jìn)入了下一個(gè)階段,理解作者對(duì)這個(gè)過程在功能性或者效率卓越這件事上的解釋和證明。這才真正觸碰到算法最精髓的部分,也就是深度的理解算法的主要過程所帶來的好處,這才是最鍛煉人理解能力的地方。 第四階段:上面幾點(diǎn)是算法學(xué)習(xí)階段的過程了,接下來就是研究算法的代碼實(shí)現(xiàn),自己設(shè)計(jì)測(cè)試用例親自跑一下代碼,以及從代碼運(yùn)行時(shí)間的角度分析這個(gè)算法的優(yōu)勢(shì),這也是加深對(duì)算法的理解的過程。 第五階段:*是配合相應(yīng)的題目練習(xí),讓自己通過題目練習(xí)的方式,會(huì)用、善用學(xué)習(xí)到的算法,并對(duì)這個(gè)算法產(chǎn)生一定的敏感程度,具體是指看到某些題目時(shí),能夠根據(jù)題目的特點(diǎn),產(chǎn)生與該算法的對(duì)應(yīng),也就是具備舉一反三的能力。 學(xué)習(xí)永無止境,不管是算法小白,還是有一定的算法基礎(chǔ),提升算法永遠(yuǎn)都是剛需,我正好要在??途W(wǎng)即將開一個(gè)算法班,針對(duì)算法小白的初級(jí)班和有一定算法基礎(chǔ)的進(jìn)階班,如果你想跟我一起學(xué)習(xí),也歡迎你報(bào)名跟我一起探討算法,希望所有努力和上心的人都能成為大牛。課程報(bào)名: 初級(jí)班: 進(jìn)階班: 當(dāng)然,正值雙十一,正好牛客網(wǎng)上有個(gè)雙十一的活動(dòng),這樣買會(huì)比較優(yōu)惠:
2.程序員如何提升算法思維?
持續(xù)學(xué)習(xí),持續(xù)開發(fā),是目前主流 IT 業(yè)界程序員的一個(gè)生活常規(guī),在現(xiàn)代技術(shù)迭代速度非常快的情況下,只有不斷保持自我學(xué)習(xí)和探索才不會(huì)與時(shí)代脫節(jié)。無論是專業(yè)的 IT 從業(yè)者還是 IT 小白,都需要培養(yǎng)自己的算法思維。擁有良好算法思維后的直接好處有:更高的面試成功機(jī)會(huì),和更快的日常問題處理能力。何為算法思維,并不是對(duì)一些已經(jīng)設(shè)計(jì)好的優(yōu)秀代碼的反復(fù)背誦和背板,而是自己對(duì)于問題的抽象能力的練習(xí),即從抽象問題到實(shí)際進(jìn)行編碼或者設(shè)計(jì)程序解決問題的一個(gè)能力,如果單純對(duì)于一些算法進(jìn)行背誦的話,我們的思維能力不會(huì)得到提升,最多就是熟練的碼農(nóng)而已。所以,當(dāng)看到別人設(shè)計(jì)的優(yōu)秀算法后,我們一定要探尋算法背后那“曲徑通幽”的思維之路。只有經(jīng)歷了思維之路的磨難,才能永遠(yuǎn)占有一個(gè)算法,并有可能舉一反三,或者是設(shè)計(jì)一個(gè)巧妙算法。個(gè)人認(rèn)為,對(duì)于提升算法思維的方法,首先我們需要深入思考各種苦惱的問題,例如:假設(shè)我喜歡租車出行,那么對(duì)于某一個(gè)地方的停車點(diǎn)一般在什么時(shí)候有車的機(jī)率*?有車的概率是否與天氣,溫度等因素有關(guān)?我希望可以在回家之前通過手機(jī) APP 讓家里的空調(diào)提前工作起來,但是我非常 Geek ,不想使用現(xiàn)成的產(chǎn)品而想自己實(shí)現(xiàn)一個(gè),和同學(xué)吹牛的時(shí)候可以更加脫穎而出?在明確了這些問題以后我們就可以開始思考如何嘗試寫一個(gè)小的程序來幫助自己解決,這個(gè)時(shí)候如果手頭有一個(gè)習(xí)慣的語言就非常合適了(比如我個(gè)人就喜歡 Python,有很多庫可以使用,而且入門非常容易),如果沒有的話,可以去看看各個(gè)語言合適的場(chǎng)景,不過對(duì)于爬蟲、數(shù)據(jù)分析相關(guān)個(gè)人認(rèn)為更加貼合日常生活的項(xiàng)目來看,還是考慮直接從 Python 3 起步比較好,后期如果想用樹莓派做點(diǎn)智能家居相關(guān)的項(xiàng)目的話 Python 也是非常合適的。對(duì)于 Python 的學(xué)習(xí),目前有很多非常成熟的課程,可以覆蓋各個(gè)不同的能力范圍,這里著重推薦 Coursera 的視頻課程,配合本地 IPython 或者 LeetCode 一起調(diào)試和練習(xí),可以獲得很好的效果。01 舉個(gè)例子02 找思路我們以*個(gè)問題為例,如果你希望了解一個(gè)停車點(diǎn)的車輛情況,你需要有一些網(wǎng)絡(luò)知識(shí),了解 APP 和相關(guān)軟件服務(wù)器之間的通訊協(xié)議,當(dāng)了解了具體的接口之后就可以寫一個(gè)包含循環(huán)的程序來定時(shí)判斷某一個(gè)點(diǎn)的車輛數(shù)量信息,這個(gè)程序可以用 Python 來完成,涉及到的庫不會(huì)超過 2 個(gè),基本就是 requests 和 json 庫。一般來說如果要獲取一個(gè)數(shù)據(jù),代碼類似如下(通過遞歸的方式獲取一個(gè)點(diǎn)的車輛信息):def get_car_list_by_pklId(pklId,page): headers = { "Host": "xxx.xxx.com, } content = { "pklId": pklId, "page": page } r = requests.post(" , json=content) json_data = json.loads(r.text) car_list = json_data['data']['list'] if json_data['data']['page']['has_next']: page += 1 car_list.append(get_car_list_by_pklId(pklId,page)) return car_list對(duì)于這樣的操作來說,真的只需要import requests和import json就可以啦~03 存數(shù)據(jù)在得到了對(duì)應(yīng)的數(shù)據(jù)之后可以考慮用文件或者數(shù)據(jù)庫的方式把內(nèi)容持久化下來方便之后的分析,此時(shí)可以使用pymongo庫,寥寥幾行代碼,數(shù)據(jù)就已經(jīng)很好地存儲(chǔ)下來。( 此處可參考我們之前發(fā)的文章 )力扣(LeetCode):Python + MongoDB 小型程序利器在 Python 中引入:import pymongo指定數(shù)據(jù)表并連接:myclient = pymongo.("mongodb://localhost:27017/") # 默認(rèn)的 MongoDB 監(jiān)聽地址 db = myclient["test_db"] # 使用上一步建立的 myclient 連接,并且使用 test_db 數(shù)據(jù)庫 table = db['cars'] # 使用 db 連接的 test_db 數(shù)據(jù)庫中的 cars 表 增刪改查:# 定義我們要插入的數(shù)據(jù),JSON 格式,在 Python 中就是 Dict 格式 data = {"pkl": 23, "car_num": 2, "date": datetime.datetime.utcnow()}插入一條記錄:# 插入一條記錄并返回插入 ID post_id = posts.insert_one(data).inserted_id 對(duì)外展示*,我們考慮對(duì)數(shù)據(jù)進(jìn)行可視化(畢竟這些內(nèi)容是要給別人看的),如果只是練習(xí)用的話可以簡(jiǎn)單一點(diǎn),考慮 ,如果需要對(duì)外展示的話,可以試試 Chart.js~*,當(dāng)我們完成了這些操作,就可以寫一篇文章記錄一下整個(gè)過程,這么做的好處有如下:證明自己的能力可以獨(dú)立從分析到實(shí)際實(shí)現(xiàn)完成一個(gè)小的項(xiàng)目吸引相關(guān)同好,通過評(píng)論得到一些發(fā)展意見從而優(yōu)化自己的流程記錄這次探索,相當(dāng)于積累了自己的文檔庫此外,如果你認(rèn)為這類問題具有通用性,可以考慮同時(shí)將代碼放到世界*的同性交友網(wǎng)站——GitHub 上面,不僅能獲得相關(guān)用戶討論,還能在個(gè)人社交媒體上進(jìn)行自我宣傳,如果可以吸引到有類似需求的用戶,既可以提升自己 GitHub 帳號(hào)的*度,還可以結(jié)識(shí)更多的朋友,激勵(lì)自己去創(chuàng)建更多的項(xiàng)目,增加更多的相關(guān)項(xiàng)目經(jīng)驗(yàn),完成一個(gè)正向的循環(huán),讓自己更加熟悉:發(fā)現(xiàn)問題,尋找思路,并且解決問題的一個(gè)具有算法思維的流程。本文作者:Nova聲明:本文歸 “力扣” 版權(quán)所有,如需轉(zhuǎn)載請(qǐng)聯(lián)系。
如果以上內(nèi)容沒有幫到您,歡迎電話聯(lián)系我們,或者聯(lián)系在線客服咨詢