-
1 # 此生唯一
-
2 # 嵌入式宏思微想
演算法,是每一個計算機及相關專業科班出身的人都會學習過的技術。一直以來,演算法被稱為資料結構加程式。其本質上來講,我認為,演算法是由程式語言實現的怎樣完成目標的方法。衡量一個演算法的好壞優劣,有時間複雜度與空間複雜度。一個優質的演算法,最基本的是簡單而有理論支撐,有理有據且通俗易懂。
要學好演算法,不是容易的事,要做好一個優秀的演算法工程師,更是難上加難。很多人學習演算法,基本上停留在如何用演算法的層面上,而且還不一定用得好。
學好演算法,基本要求是,紮實的數學基礎,強大的邏輯思維,豐富的業務知識,勤奮好學的心態。學好演算法,可以依次從幾個梯度循序漸進,瞭解,會用,理解,剖析,融會貫通,舉一反三。
如果你帶有一點點天賦,恭喜你,會容易很多,量變到質量將會很快實現。如果沒有任何天賦,那隻能靠努力,一萬小時理論,是唯一且最好的辦法,沒有之一。多看,多想,多用,多創新……
學好演算法,有沒有捷徑?沒有。但要用好演算法,有捷徑。專業論壇,經典書籍,開源資料,職業前輩等等,都會給你良好指導,這就是用好演算法的捷徑,比自己摸索要快多了。
-
3 # 人民郵電出版社
演算法能力的考察,向來是頂級科研機構和IT公司面試時最具備區分度的成分,這足以說明演算法學習的重要性。雖然很多IT行業的學生畏懼演算法複雜的邏輯和推理,將演算法學習視為洪水猛獸,但掌握了正確的學習方法和順序,演算法其實沒有那麼難~
在這裡為想要在演算法學習上快人一步的題主以及正在學習演算法的小夥伴們提供一份由易到難,由具體應用到全域性思想的演算法學習書單,演算法小白可以從頭學起,已經有一定演算法基礎的讀者也可以更進一步,瞭解演算法更深層次的內涵。
1.演算法入門:掌握基本知識對於沒有程式設計或演算法基礎的小白來說,趣味性和清晰明瞭的概念解釋必不可少。趣味故事、豐富的插圖能幫助讀者迅速入門。
本書從演算法之美娓娓道來,沒有高深的原理,也沒有枯燥的公式,透過趣味故事引出演算法問題,包含50多個例項及完美圖解,結合學生提問,分析演算法本質,並給出程式碼實現的詳細過程和執行結果。本書可作為程式設計師的學習用書,也適合從未有過程式設計經驗但又對演算法有強烈興趣的初學者使用,同時也可作為高等院校計算機、數學及相關專業的師生用書和培訓學校的教材。
這是一本充滿智慧和趣味的演算法入門書。沒有枯燥的描述,沒有難懂的公式,一切以實際應用為出發點,透過幽默的語言配以可愛的插圖來講解演算法。你更像是在閱讀一個個輕鬆的小故事或是在玩一把趣味解謎遊戲,在輕鬆愉悅中便掌握演算法精髓,感受演算法之美。
《啊哈!演算法》中涉及的資料結構有棧、佇列、連結串列、樹、並查集、堆和圖等;涉及的演算法有排序、列舉、深度和廣度優先搜尋、圖的遍歷,當然還有圖論中不可以缺少的四種最短路徑演算法、兩種最小生成樹演算法、割點與割邊演算法、二分圖的最大匹配演算法等。
這是一本像小說一樣有趣的演算法入門書,示例豐富,圖文並茂,以讓人容易理解的方式闡釋了演算法,旨在幫助程式設計師在日常專案中更好地發揮演算法的能量。書中的前三章將幫助你打下基礎,帶你學習二分查詢、大O表示法、兩種基本的資料結構以及遞迴等。餘下的篇幅將主要介紹應用廣泛的演算法,具體內容包括:面對具體問題時的解決技巧,比如,何時採用貪婪演算法或動態規劃;散列表的應用;圖演算法;K最近鄰演算法。
這本書在美亞評分4.7,在作者線上演算法課程的基礎之上編寫的,是四卷本系列的第1卷。這個線上課程2012年起就定期更新,它建立在作者在斯坦福大學教授多年的本科課程的基礎之上。也許你有所耳聞。如果你更喜歡聽和看,可以在YouTobe上搜索這本書的主題課程,免費觀看。這本書詳細講解演算法基礎,展現演算法本質 ,是一本囊括基本演算法知識的詳解指南。集斯坦福大學教授多年教學經驗,深入淺出,通俗易懂。
2.演算法進階,結合程式設計實踐深入理解演算法原理程式執行的結果能夠幫助我們理解演算法的執行原理,也能夠幫助我們發現演算法的缺點,從而有針對性地進行演算法的最佳化,因此,在掌握基本演算法知識的基礎上,程式設計實踐必不可少。
本書循序漸進、由淺入深地講解Python演算法的核心技術,並透過具體例項的實現過程演練各個知識點的具體使用流程。全書共13章,包括演算法,資料結構,常用的演算法思想、線性表、佇列和棧,樹,圖,查詢演算法,內部排序演算法,經典的資料結構問題,數學問題的解決,經典演算法問題的解決,影象問題的解決,遊戲和演算法等內容。
這是一本介紹透過解決複雜謎題來學習程式設計的書,書中的程式碼用Python語言編寫。與以往的程式設計書不同,本書將對程式碼功能的理解與程式語言語法和語義的理解分離開來,從解每個謎題開始,先給出解謎題的演算法,隨後用Python語法和語義實現對應的演算法,並適當做出解釋。本書包含了21個謎題,其中很多謎題都廣為流傳,如多皇后、漢諾塔、在幾秒鐘內解決數獨問題、驗證六度分隔猜想等,每個謎題後面都配有不同難度的程式設計習題,幫讀者加深對相關演算法的理解。
本書在演算法謎題的趣味性和計算機程式設計的實用性之間搭建了一座橋樑,內容饒有趣味,講述易於理解,適合已掌握初級程式設計概念並對演算法感興趣的學習者閱讀和參考。
這本書結合C++程式語言,以問題為驅動,討論了演算法的構思和設計,以及C++語言的強大程式設計功能。本書由80多個計算問題分門別類,串聯而成,適於作為程式設計師的參考書,高校各專業學生學習“資料結構”“演算法設計分析”“程式設計”等課程的擴充套件讀物,也可以作為上述課程的實驗或課程設計的材料,還可以作為準備參加國內或國際程式設計賽事的讀者的賽前訓練材料。
《演算法(第4版)》作為演算法領域的經典參考書,全面介紹了關於演算法和資料結構的必備知識,並特別針對排序、搜尋、圖處理和字串處理進行了論述。第4版具體給出了每位程式設計師應知應會的50個演算法,提供了實際的Java程式碼,而且這些Java程式碼實現採用了模組化的程式設計風格,讀者可以方便地加以改造。配套網站還提供了《演算法(第4版)》內容的摘要及更多的程式碼實現、測試資料、練習、教學課件等資源。
這本書涉及面試、演算法、機器學習三個主題。書中的每道程式設計題目都給出了多種思路、多種解法,不斷最佳化、逐層遞進。這本書第1章到第6章分別闡述字串、陣列、樹、查詢、動態規劃、海量資料處理等相關的程式設計面試題和演算法,第7章介紹機器學習的兩個演算法—K近鄰和SVM。書中的每一道題都是面試的高頻題目,反覆出現在近5年各大公司的筆試和麵試中,對面試備考有著極強的參考價值。
3.AI時代必學的演算法:跟上時代的步伐人工智慧時代,機器學習在搜尋、廣告、計算機視覺、語音、自然語言處理、機器人等多個技術方向大展身手,演算法學習也要跟上時代的步伐。
這本書是微信整合搜尋演算法組組長路彥雄的全新作品,深入淺出講解自然語言處理和機器學習技術,微博總閱讀量超30萬次。本書結合作者多年學習和從事自然語言處理相關工作的經驗,力圖用生動形象的方式深入淺出地介紹自然語言處理的理論、方法和技術,拋棄掉繁瑣的證明,提取出演算法的核心。本書前面章節介紹了學習機器學習需要掌握的一些數學基礎,幫助讀者儘快地掌握自然語言處理所必備的知識和技能。
資料科學(Data Science)是從資料中提取知識的技術,是一門有關機器學習、統計學與資料探勘的交叉學科。資料科學包含了多種領域的不同元素,包括訊號處理、數學、機率模型技術和理論、計算機程式設計、統計學等。
本書講解了7種重要的資料分析方法,它們分別是k最近鄰演算法、樸素貝葉斯演算法、決策樹、隨機森林、k-means聚類、迴歸分析以及時間序列分析。全書共7章,每一章都以一個簡單的例子開始,先講解演算法的基本概念與知識,然後透過對案例進行擴充套件以講解一些特殊的分析演算法。這種方式有益於讀者深刻理解演算法。本書適合資料分析人員、機器學習領域的從業人員以及對演算法感興趣的讀者閱讀。
OpenCV演算法精解,機器學習演算法必備,十大演算法全涵蓋,夯實機器學習數學基礎。本書首先對正態貝葉斯分類器、K近鄰演算法、支援向量機、決策樹、AdaBoost、梯度提升樹、隨機森林、極端隨機樹、期望極大值、神經網路這十大經典的機器學習演算法進行具體的原理分析,然後給出OpenCV的相關原始碼的逐句解釋,最後完成一個基於OpenCV的應用例項。相信讀者透過這3個步驟的學習,足以實現對算法理解的目的。
這本書專注於兩類核心的“演算法族”,即懲罰線性迴歸和整合方法,並透過程式碼例項來展示所討論的演算法的使用原則。全書共分為7 章,詳細討論了預測模型的兩類核心演算法、預測模型的構建、懲罰線性迴歸和整合方法的具體應用和實現。本書主要針對想提高機器學習技能的Python 開發人員,幫助他們解決某一特定的專案或是提升相關的技能。
美團是國內O2O(Online To Offline,是指將線下的商務機會與網際網路結合,讓網際網路成為線下交易的前臺)領域領先的服務平臺。《美團機器學習實踐 》全面介紹了美團在多個重要方面對機器學習的應用,涵蓋搜尋、推薦、廣告、風控、機器學習、計算機視覺、語音、自然語言處理、智慧排程、機器人和無人配送等多個技術方向。非常適合有一定機器學習基礎的工程技術人員和在校大學生學習和閱讀。透過這本書,有經驗的演算法工程師可以瞭解美團在這方面的做法,在校大學生可以學習機器學習演算法如何在具體的業務場景中落地。
這本書收錄了超過100道機器學習演算法工程師的面試題目和解答,其中大部分源於Hulu(美國著名影片網站)演算法研究崗位的真實場景。這本書不僅囊括了機器學習的基本知識,而且還包含了成為優秀演算法工程師的相關技能,更重要的是凝聚了筆者對人工智慧領域的一顆熱忱之心,旨在培養讀者發現問題、解決問題、擴充套件問題的能力,建立對機器學習的熱愛,共繪人工智慧世界的宏偉藍圖。
4.演算法經典:瞭解歷久彌新的演算法思想掌握了演算法的入門和應用,或許能較為輕鬆地應對面試和日常的專案實踐,但如果想了解在IT領域影響深遠的指導思想,以下經典不可不讀。
《計算機程式設計藝術 卷1 基本演算法(第3版)》《計算機程式設計藝術 卷2 半數值演算法 第3版》《計算機程式設計藝術 卷3 排序與查詢(第2版)》《計算機程式設計藝術 卷4A:組合演算法(一)》作者:[美] 高德納(Donald E. Knuth)
《計算機程式設計藝術》系列深入闡述了程式設計理論,對計算機領域的發展有著極為深遠的影響。這套書不僅適合從事計算機科學、計算數學等各方面工作的人員閱讀,也適合高等院校相關專業的師生作為教學參考書,對於想深入理解計算機演算法的讀者,是一份必不可少的珍品。
《程式設計珠璣》是歷史上最偉大的計算機科學著作之一,融深邃思想、實戰技術與趣味軼事於一爐。這兩本書圍繞程式設計人員面對的一系列實際問題,透過一些精心設計的有趣而又頗具指導意義的程式,對實用程式設計技巧及基本設計原則進行透徹而睿智的描述,對演算法的最佳化提供了寶貴的經驗和指導。
演算法學習之路沒有捷徑可走,正確的方法、持續的學習缺一不可。演算法學習過程中也一定會遇到門檻和瓶頸,但找對方法,你會發現演算法其實很好玩~
-
4 # 牛客網
對於學習演算法,我給大家的建議:
先找到線團,然後進入線團裡學著怎麼玩。為了進入線團,需要先把基礎知識掌握好。《演算法和資料結構》(教材),你一定要看完+理解。這裡面講的都是不能再基礎的東西了,覺得講得不好,自己搜維基百科。沒辦法,如果堅持不下來,你後面就受罪去吧。
再來就是練題,對於線上刷題平臺的題目,先不找解答,先自己實現,實現的多爛,複雜度多差,都堅持寫完。然後分析出複雜度。接下來去網上找答案,看到複雜度和你一樣或比你低的,直接略過。看到比你好的,重點看,一定要理解,然後分析為什麼比你的好,如果你真的理解了,你一定能找到別人最佳化的點。
……
我是《程式設計師程式碼面試指南--IT名企演算法與資料結構題目最優解》的作者 ,書籍涉及演算法與資料結構程式設計題目240道以上,並且個人實現出最優解,大部分題目為面試高頻。 這篇我想寫寫演算法的重要性、我個人是如何學習演算法以及一些如何學習演算法的建議。演算法在求職以及工作後的重要性求職面試必考(校招+社招),且國內工資越高的面試中演算法比重就越大。
我分別說一下國內和國外的行情。
國內的話,一般來講,工資高的公司在面試時演算法和資料結構題目的比重較大,工資一般的公司比重較小。當然同樣公司的不同崗位,要求也會不同,但總體趨勢就是 國內好公司愛考演算法和資料結構 。這是目前國內網際網路公司的情況。國外的網際網路公司呢,幾乎只考演算法和資料結構,很多年前就是這樣了,一直如此。我相信國內會逐漸變得像國外一樣,並不是崇洋媚外,而是演算法和資料結構題目真的能考出東西。先拋開演算法,我們來說說面試以及如何準備。
面試中都會考什麼呢?
面試中會考察演算法,作業系統,資料庫,計算機網路,程式語言,專案(校招涉及)/經歷(社招中涉及的更多)
如何準備?
作業系統,資料庫,計算機網路,程式語言這些都是平時學習,記住了,理解了,不忘記就可以了專案或者經歷是平時準備的,如果馬上面試了再去準備也是很難的,作假在面試中會直接被面試官看穿,所以這個平時就要準備好,如果是校招,那平時就要做一做有用的專案,如果是社招,平時在工作中就要用心做。演算法和資料結構,是真的需要好好寫程式碼才能掌握,不是說看了理解了就真正會的了。演算法筆試面試的特點就是沒有特點,什麼樣的題都可能遇到,因為根本沒有考綱,面試官就是普通的程式設計師,他們在工作中或者在網路上遇到什麼題不錯,就可能考,所以內容真的太多了,而且也無窮盡。這不是一個標準考試,這是能力考試。 所以,我建議大家面試或者筆試前抽出20%的時間去理解和記憶非演算法和資料結構的題目,剩下的時間就是去刷題。 今天學習演算法變得越來越重要,雖然每個公司行業不同、崗位複雜,但演算法能力強是分析能力和解決問題能力的提現。雖然計算機的處理能力越來越強,但好演算法的程式碼執行效率相比起沒有最佳化的程式碼,已經不能用快多少倍來描述了。計算機科學有自己的衡量標準,也就我們常說的複雜度標準。同時,學習演算法對理解底層實現是非常重要的,優秀的程式設計師專注細節和底層,具備演算法能力是起點更是基礎。包括今天很多的領域,比如機器學習,深度學習,還有大熱的AI領域,想要研究透徹,都離不開演算法好的大腦。還有很重要的,加薪和跳槽,演算法都起著非常重要的作用。學習演算法可不僅僅是刷題,這一過程中自己的思維和想法的提升才是學習演算法的最大好處。我是如何學習演算法的? 本科在華中科技大學計算機學院,這一期間能在學業上讓自己滿意的可能就是沒有掛科而已。碩士在芝加哥大學,出國之前就瞭解到想要在國外找工作的話,面試時幾乎只考演算法和資料結構的題目,於是開始了刷題,也就是蒐集這方面的題,並且用程式碼實現出來,不斷看題解和與高手討論。 就這樣從2010年到今天,刷了7年演算法和資料結構的面試題。剛開始其實只是為了找工作才開始刷題,但是半年之後就變成了興趣。 剛開始刷題的過程中很不順利,因為很多演算法和資料結構,教材也不會講。而且去網上搜各種各樣的分析文章也讀不懂,感覺基礎差的很遠。當時網上的分析文章,也不會像今天這麼易懂,高手都是把最核心的點說出來,但是我沒摸到人家想說的點之前,就已經不會了。於是就把很多很厚的書拿來啃,書上也看不懂就儘可能的找到高手向人家請教。對書上的題目實現了好幾遍,才發現入了門,頭腦也開始活泛起來。遇到不會的就查,發現一大片知識不知道就練。在網上發帖被嘲笑的日子,其實非常的漲見識,我很珍視那段歲月。當時在國外,學費也貴,因為錢的刺激和好勝心,居然沒有讓我變態,而是變成了一種鬥志,用了大量的時間好好刷題。剛開始程式碼實現演算法和資料結構的題目真的非常痛苦,因為這部分的內容相比其他方面的知識絕對算高門檻,而我最開始的基礎也並不好。現在我經常在網上給同學們講題,看到同學們表達的抱怨,那簡直就是當年的我。暗暗發下心願,如果有一天講課,絕對做一個人人都能聽懂的好老師。但不管怎麼引導,演算法學習都是一個脫皮換骨的痛苦過程,但好在會迅速上癮,堅持半年之後就能一直堅持下去了。 演算法和資料結構問題的技術累積需要長時間的投入,因為內容又多又雜又難,很多演算法是那種你很懷疑自己再來一輩子也可能想不到的解法。當時作為一個小白,一個演算法的意思看懂了,實現起來是如此的難,測試用例總能指出我的幼稚;寫了很多程式碼終於過了這一題,看到高手寫的實現,自己又幻滅了,高手寫的好棒,自己寫的……然後收拾起碎裂一地的三觀,重新出發。解了很多題目之後,類似的題目出現,自己還是會想很久。這讓我意識到,自己缺乏總結,於是開始了總結的過程,也萌生了寫書的衝動。刷完一道題其實是一件很難的事情,因為普通解法很容易,但是最優解真得去耐著性子研究好久,去查資料,去做最佳化,這個過程很漫長但是足夠迷人。到底應該怎樣學習演算法,作為過來人,給大家的建議 先跟大家聊聊演算法吧。 在網路上流行一句話:演算法分三種,競賽的演算法、面試的演算法、演算法。雖然我覺得這麼分非常讓人無語,但其實可以去這麼理解,因為競賽、面試和純理論的要求和限制是不同的,所以演算法在不同的要求中展現了不同的樣子。 對於競賽來說,每道題對輸入引數和樣本量的要求都是非常明確的,同時規定的非常明確的還有空間的限制和執行時間的限制。每一個競賽選手都非常熟練怎麼根據這些提前給好的限制,反推出自己需要實現一個什麼樣複雜度的解法才能透過。每一行程式碼包含著前輩和自己思考過的最佳化。 而對於面試來說,限制往往並不明確,造成這個現象的原因也很好理解。競賽中當然是分數最重要。在面試的過程中,與面試官的交流和體現自己想事情的方式、體現自己邏輯的嚴密更重要。所以同一道題,在競賽中必須寫清楚限制,而在面試中一道題剛開始的限制沒那麼多,目的就是縮短你理解題目的時間,讓面試者先寫出一點什麼,然後和麵試官展開討論,隨著討論的深入,再逐漸的把限制聊清楚。總之在面試的場合就是想看看你想問題的習慣、軌跡以及表達能力是否符合要求。 當然,不管是什麼要求下的演算法,經常練習演算法和資料結構題目對一個人在邏輯上的提升都是顯而易見的,在學校參加ACM並取得很好成績的同學,如果不是表達能力特別差的話,是一定會收穫很多offer的,因為思維被鍛鍊的很好。對於演算法,我給大家的建議:
先找到線團,然後進入線團裡學著怎麼玩。為了進入線團,需要先把基礎知識掌握好。《演算法和資料結構》(教材),你一定要看完+理解。這裡面講的都是不能再基礎的東西了,覺得講得不好,自己搜維基百科。沒辦法,如果堅持不下來,你後面就受罪去吧。
然後有一些很經典的書可以迅速讓你進入狀態
比如我這本《程式設計師程式碼面試指南》
還有《劍指offer》,配合線上練習
《程式設計師面試金典》配合線上練習,這些好書。
——————————
- 專業IT筆試面試備考平臺
- 最全C++JAVA前端等網際網路技術求職題庫
- 全面提升IT程式設計能力
- 程式設計師交友聖地
-
5 # IT人張飛洪
上學時候傻,為了校招,看了不下於五本演算法書,加上LeetCode,刷了大半年。
總共一兩千道題啊……不刷怕考到……忘了刷,刷了忘……毛都快掉沒了……
現在工作近十年,輾轉幾個大廠,由當年的應試者變成了出題人,才知道,完全不必這麼辛苦。
任何事情都遵循28原則,我們只要把握住那20%,就能拿到80分!
凡事都講究價效比!
省下來的時間,談個女朋友,它不香麼???!!!
這裡把我這些年的出題經驗告訴大家,希望大家知道哪些是重點,應該怎麼學資料結構和演算法。
直接上乾貨,我花了兩天的時間做了一張圖,涵蓋資料結構和演算法書籍中都會講到的知識點。並給出了常用演算法的平均時間複雜度,對於必須要學的內容前面加了星標
這裡面涉及到了近二十種資料結構:陣列、連結串列、棧、佇列、散列表、二叉樹、堆、跳錶、圖、Trie 樹;超四十種常見演算法思想:遞迴、排序、二分查詢、搜尋、雜湊演算法、貪心演算法、分治演算法、回溯演算法、動態規劃、字串匹配演算法。
掌握了這些基礎的資料結構和演算法,再學更加複雜的資料結構和演算法,就會非常容易、非常快。
演算法導圖及推薦學習資料下載mp.weixin.qq.com
資料結構與演算法的區別資料結構怎麼學怎麼學習演算法演算法太難懂?那是你不知道這些模擬網站一、資料結構與演算法的區別很多同學搞不明白,資料結構與演算法有什麼區別,甚至有些同學以為資料結構中就包含了演算法。
其實,是字面意思就能知道個大概,資料結構主要講解資料的組織形式,換句話說,我就是我們要怎樣把這些資料儲存起來,所以有列表、堆、棧、樹、圖,這是資料結構的重點。
而演算法,則注重的是思想,比如列表裡的元素怎麼排序、怎麼在當前的儲存結構中找到最大的數和最小的數?等等,說白了就是解決現實中問題的思想。所以才會有分治思想、貪心思想、動態規劃這些經典演算法。
二、資料結構怎麼學關於資料結構,我想說的是,它是這四大件中最簡單、最基礎的一個。離開了資料結構,幾乎任何的程式都會失效,所以在討論資料結構的時候,常常要把演算法也連帶著說一說。
要單純地掌握常見的資料結構,就如同拆解一個個精妙的儀器件一樣有趣和簡單。正因為資料結構這個東西在程式中的作用,和儀器部件特別相像,不同的資料結構有著不同的特性,因此要想學好資料結構,圖解是必備武器!
這裡強推中國大學上,浙江大學的開設的《資料結構》課程,涵蓋了常用的資料結構和演算法。
輔以教材參考書,強推《大話資料結構》,光看封面你就知道這本書的風格了
沒錯,這就是大名鼎鼎的《大話設計模式》的作者出的,絕對頂。
三、怎麼學習演算法演算法課常常和資料結構課放在一起,在有些高校中,會存在“資料結構與演算法”和“演算法設計與分析”這樣的兩門課。
學習演算法的套路很簡單,多看、多寫、多上機,既然是思想的集合,看得多了,自然無師自通。
至於刷題,很多同學都知道要刷LeetCode。
LeetCode題庫:(2123題)
總共兩千多道題,而且有些題,非常難,就算每天10題,也至少刷半年。這顯然不適合絕大部分同學。
所以,我們要找到最核心、最重要的題集,即可
比如,如果時間緊張,可以先刷《程式設計師面試寶典》裡的題目,總共109題。
刷完以後,有時間,可以再刷《劍指offfer》的題目,共75題。
因為這兩本書,都是面向面試的高頻題彙總,自然有很多題目是重合的。這也正能說明這兩本書的重要性。
如果專攻面試的話,還有兩本不錯的書推薦:
《程式設計珠璣》這本書的豆瓣評分非常高,有 9 分。
這本書最大的特色就是講了很多針對海量資料的處理技巧。這個可能是其他演算法書籍很少涉及的。面試的時候,海量資料處理的問題也是經常會問的,特別是校招面試。不管是開拓眼界,還是應付面試,這本書都很值得一看。
《程式設計之美》這本書有多位作者,其中絕大部分是微軟的工程師,所以書的質量很有保證。不過,這裡面的演算法題目稍微有點難,也不是很系統,這也是我把它歸到面試這一部分的原因。如果你有一定基礎,也喜歡鑽研些演算法問題,或者要面試 Google、Facebook 這樣的公司,可以拿這本書裡的題,先來自測一下。
當然,我也有一本谷歌師兄總結的高頻面試演算法習題集,包含了常見的資料結構和演算法彙總,無論是排版還是內容,都是非常棒。
演算法導圖及推薦書籍資料下載mp.weixin.qq.com
四、演算法太難懂?那是你不知道有這些模擬網站演算法的難點在於,根本沒辦法在腦子裡抽象出它的步驟啊
對於做個幾何題都費勁的男孩子來說,那更是要了他的親命了。
今天,我就給大家推薦幾個演算法視覺化的網站。
沒錯,就是寫了程式碼以後,可以看見他們是怎麼一步步求出結果的。
1、https://visualgo.net/en
目前網站支援中文,印尼文,日文等多語言版本。
最關鍵的是,它幾乎包含了所有演算法!!!!
在搜尋選項中你可以根據關鍵詞查詢到你想要的演算法。
點進去一個具體的演算法之後,會有兩種方式的視覺化呈現方式,一種是電子講座模式,一種是示例模式。其中示例模式是以動畫方式呈現,你可以控制動畫的快進與倒退,電子講座模式是以知識點講解模式呈現,你可以手動控制頁面的進度。兩種方式都可以幫助你演示每個步驟的過程程式碼。
接下來我們演示一下氣泡排序的執行過程,如下圖所示:
另外,你還可以建立一組自定義的數,然後讓動畫顯示“你的演算法”。
除此之外,還支援線上測試喲~
2、Algorithm Visualizer
在Algorithm Visualizer,大家可以很清楚的看到演算法執行的整個過程,很直觀,便於大家學習。
我們用它來演示一下氣泡排序的執行過程,如下圖所示:
https://github.com/algorithm-visualizer/algorithm-visualizer
3、Data Structure Visualization
目前已經有很多常用的資料結構與演算法的視覺化,如:常見的陣列、連結串列、佇列、二叉搜尋樹、紅黑樹、各種排序等,如下圖所示:
比如,我們用它來模擬一個二叉搜尋樹,如下圖所示:
我們再用它來演示一下快速排序演算法,如下圖所示:
把這些內容學會,演算法應該說是非常牢固了,無論是校招還是工作,都已經非常夠用了。
但程式設計師的人生不是隻有演算法的學習,我們還有校招、面試、青春飯等等的困惑,我把我這些年的所知所得,整理成了一本書,開源到github上了。相信會對大家很有幫助,大家可以去看.
地址:https://github.com/harvic/FightingCoder
好了,這篇就到這了,希望大家畢業都能找到好工作。
回覆列表
演算法和資料結構是密不可分的,如果你想讓程式碼執行效率提高千百倍,那麼演算法和資料結構是必須要學的!
通常在計算機領域,表示演算法時間有一個方法叫做大O表示法,比如O(N)常數級,O(log2n)對數級,O(n2)平方級等等!
舉個栗子:從一個有4294967296(2的32次方)這麼大的數量中找到某個數,如果是使用順序查詢(大O記數法為O(N)),平均查詢次數需要總數量的的一半,也就是平均20多億次,而使用二分法查詢(大O計數法為O(log2n)),查詢次數為log以2為底n的對數,也就是32,what??只要32次,沒錯,從20多億次變為32次!效率提高了幾千萬倍!(當然,二分法查詢需要保證這組數是有序的)。
由此可見,演算法是追求快速度,高效率的路上不得不學的,然而怎麼學好演算法呢?
1,興趣:程式設計師當了很多年,沒有什麼是像演算法一樣讓我頭疼的了,光是排序演算法就有不知道多少種,像冒泡,快排,插入排序,希爾排序等等這些就夠喝一壺的了,還有查詢演算法中的二分查詢,二叉樹查詢,紅黑樹,hash,可以說學習的時候覺得每一個都很經典,每一個都很難,要不是興趣使然,很難從演算法的路上走下去!
2,堅持:每天或者每週都要堅持沉浸在演算法的世界裡,很多演算法由於在平時的開發中很難碰到,所以需要經常性的去看看,去回顧!一個演算法一個演算法的掌握,就是記憶效率中的貝瑟爾曲線一樣,經常的去鞏固學過的東西,溫故而知新!
3,寫demo:光說不練假把式,在學習演算法的過程中,使用自己熟悉的程式語言實現這些演算法,儘量涉及到演算法中存在的坑,然後經常回來回顧這些Demo!
4,使用:演算法都是用來使用的,我們可以在程式碼中使用演算法實現業務邏輯,以追求更佳的效能,也可以從一些成熟的資料結構中追尋演算法的軌跡,比如JAVA中的HashMap,hash演算法是一種key-value的儲存形式,對每一個儲存的數或者物件對key使用hash演算法,然後同一個hash值的物件放入同一個連結串列中!
再舉個栗子:一個250000(500*500)的數(無序的,二分法不適用),如果使用順序查詢需要比較125000次,如果對1....250000進行hash,key對應的陣列大小為500,每一個連結串列中存500,剛好存完250000個數(理想的情況下),我要查詢有個數的時候,只要算出hash值,找到陣列中的那個key,平均250次,再從連結串列中查找出那個value,平均250次,也就是說我只需要500次的比較查詢,就能找到,比順序查詢快了幾百倍以上!
當然,在JAVA8中,hashMap的演算法已經發生了更改,在衝突(因為key對應的hash值分佈不均,導致某些key對應的值較多)比較嚴重的時候會自動轉為紅黑樹進行儲存和獲取,所以學習HashMap可以學到hash演算法,紅黑樹等,是不是很強大?
分享兩個網頁動態檢視排序演算法的網站:
https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
http://www.atool.org/sort.php
演算法一途,博大精深,如果大家都能深度掌握,變為行業內的大佬級人物,就指日可待了,不說了,我去看兩年前寫的Demo去了!更多的技術分享,敬請關注。。。