回覆列表
-
1 # 人民郵電出版社
-
2 # 牛客網
對於學習演算法,我給大家的建議:
先找到線團,然後進入線團裡學著怎麼玩。為了進入線團,需要先把基礎知識掌握好。《演算法和資料結構》(教材),你一定要看完+理解。這裡面講的都是不能再基礎的東西了,覺得講得不好,自己搜維基百科。沒辦法,如果堅持不下來,你後面就受罪去吧。
再來就是練題,對於線上刷題平臺的題目,先不找解答,先自己實現,實現的多爛,複雜度多差,都堅持寫完。然後分析出複雜度。接下來去網上找答案,看到複雜度和你一樣或比你低的,直接略過。看到比你好的,重點看,一定要理解,然後分析為什麼比你的好,如果你真的理解了,你一定能找到別人最佳化的點。
……
我是《程式設計師程式碼面試指南--IT名企演算法與資料結構題目最優解》的作者 ,書籍涉及演算法與資料結構程式設計題目240道以上,並且個人實現出最優解,大部分題目為面試高頻。 這篇我想寫寫演算法的重要性、我個人是如何學習演算法以及一些如何學習演算法的建議。演算法在求職以及工作後的重要性求職面試必考(校招+社招),且國內工資越高的面試中演算法比重就越大。
我分別說一下國內和國外的行情。
國內的話,一般來講,工資高的公司在面試時演算法和資料結構題目的比重較大,工資一般的公司比重較小。當然同樣公司的不同崗位,要求也會不同,但總體趨勢就是 國內好公司愛考演算法和資料結構 。這是目前國內網際網路公司的情況。國外的網際網路公司呢,幾乎只考演算法和資料結構,很多年前就是這樣了,一直如此。我相信國內會逐漸變得像國外一樣,並不是崇洋媚外,而是演算法和資料結構題目真的能考出東西。先拋開演算法,我們來說說面試以及如何準備。
面試中都會考什麼呢?
面試中會考察演算法,作業系統,資料庫,計算機網路,程式語言,專案(校招涉及)/經歷(社招中涉及的更多)
如何準備?
作業系統,資料庫,計算機網路,程式語言這些都是平時學習,記住了,理解了,不忘記就可以了專案或者經歷是平時準備的,如果馬上面試了再去準備也是很難的,作假在面試中會直接被面試官看穿,所以這個平時就要準備好,如果是校招,那平時就要做一做有用的專案,如果是社招,平時在工作中就要用心做。演算法和資料結構,是真的需要好好寫程式碼才能掌握,不是說看了理解了就真正會的了。演算法筆試面試的特點就是沒有特點,什麼樣的題都可能遇到,因為根本沒有考綱,面試官就是普通的程式設計師,他們在工作中或者在網路上遇到什麼題不錯,就可能考,所以內容真的太多了,而且也無窮盡。這不是一個標準考試,這是能力考試。 所以,我建議大家面試或者筆試前抽出20%的時間去理解和記憶非演算法和資料結構的題目,剩下的時間就是去刷題。 今天學習演算法變得越來越重要,雖然每個公司行業不同、崗位複雜,但演算法能力強是分析能力和解決問題能力的提現。雖然計算機的處理能力越來越強,但好演算法的程式碼執行效率相比起沒有最佳化的程式碼,已經不能用快多少倍來描述了。計算機科學有自己的衡量標準,也就我們常說的複雜度標準。同時,學習演算法對理解底層實現是非常重要的,優秀的程式設計師專注細節和底層,具備演算法能力是起點更是基礎。包括今天很多的領域,比如機器學習,深度學習,還有大熱的AI領域,想要研究透徹,都離不開演算法好的大腦。還有很重要的,加薪和跳槽,演算法都起著非常重要的作用。學習演算法可不僅僅是刷題,這一過程中自己的思維和想法的提升才是學習演算法的最大好處。我是如何學習演算法的? 本科在華中科技大學計算機學院,這一期間能在學業上讓自己滿意的可能就是沒有掛科而已。碩士在芝加哥大學,出國之前就瞭解到想要在國外找工作的話,面試時幾乎只考演算法和資料結構的題目,於是開始了刷題,也就是蒐集這方面的題,並且用程式碼實現出來,不斷看題解和與高手討論。 就這樣從2010年到今天,刷了7年演算法和資料結構的面試題。剛開始其實只是為了找工作才開始刷題,但是半年之後就變成了興趣。 剛開始刷題的過程中很不順利,因為很多演算法和資料結構,教材也不會講。而且去網上搜各種各樣的分析文章也讀不懂,感覺基礎差的很遠。當時網上的分析文章,也不會像今天這麼易懂,高手都是把最核心的點說出來,但是我沒摸到人家想說的點之前,就已經不會了。於是就把很多很厚的書拿來啃,書上也看不懂就儘可能的找到高手向人家請教。對書上的題目實現了好幾遍,才發現入了門,頭腦也開始活泛起來。遇到不會的就查,發現一大片知識不知道就練。在網上發帖被嘲笑的日子,其實非常的漲見識,我很珍視那段歲月。當時在國外,學費也貴,因為錢的刺激和好勝心,居然沒有讓我變態,而是變成了一種鬥志,用了大量的時間好好刷題。剛開始程式碼實現演算法和資料結構的題目真的非常痛苦,因為這部分的內容相比其他方面的知識絕對算高門檻,而我最開始的基礎也並不好。現在我經常在網上給同學們講題,看到同學們表達的抱怨,那簡直就是當年的我。暗暗發下心願,如果有一天講課,絕對做一個人人都能聽懂的好老師。但不管怎麼引導,演算法學習都是一個脫皮換骨的痛苦過程,但好在會迅速上癮,堅持半年之後就能一直堅持下去了。 演算法和資料結構問題的技術累積需要長時間的投入,因為內容又多又雜又難,很多演算法是那種你很懷疑自己再來一輩子也可能想不到的解法。當時作為一個小白,一個演算法的意思看懂了,實現起來是如此的難,測試用例總能指出我的幼稚;寫了很多程式碼終於過了這一題,看到高手寫的實現,自己又幻滅了,高手寫的好棒,自己寫的……然後收拾起碎裂一地的三觀,重新出發。解了很多題目之後,類似的題目出現,自己還是會想很久。這讓我意識到,自己缺乏總結,於是開始了總結的過程,也萌生了寫書的衝動。刷完一道題其實是一件很難的事情,因為普通解法很容易,但是最優解真得去耐著性子研究好久,去查資料,去做最佳化,這個過程很漫長但是足夠迷人。到底應該怎樣學習演算法,作為過來人,給大家的建議 先跟大家聊聊演算法吧。 在網路上流行一句話:演算法分三種,競賽的演算法、面試的演算法、演算法。雖然我覺得這麼分非常讓人無語,但其實可以去這麼理解,因為競賽、面試和純理論的要求和限制是不同的,所以演算法在不同的要求中展現了不同的樣子。 對於競賽來說,每道題對輸入引數和樣本量的要求都是非常明確的,同時規定的非常明確的還有空間的限制和執行時間的限制。每一個競賽選手都非常熟練怎麼根據這些提前給好的限制,反推出自己需要實現一個什麼樣複雜度的解法才能透過。每一行程式碼包含著前輩和自己思考過的最佳化。 而對於面試來說,限制往往並不明確,造成這個現象的原因也很好理解。競賽中當然是分數最重要。在面試的過程中,與面試官的交流和體現自己想事情的方式、體現自己邏輯的嚴密更重要。所以同一道題,在競賽中必須寫清楚限制,而在面試中一道題剛開始的限制沒那麼多,目的就是縮短你理解題目的時間,讓面試者先寫出一點什麼,然後和麵試官展開討論,隨著討論的深入,再逐漸的把限制聊清楚。總之在面試的場合就是想看看你想問題的習慣、軌跡以及表達能力是否符合要求。 當然,不管是什麼要求下的演算法,經常練習演算法和資料結構題目對一個人在邏輯上的提升都是顯而易見的,在學校參加ACM並取得很好成績的同學,如果不是表達能力特別差的話,是一定會收穫很多offer的,因為思維被鍛鍊的很好。對於演算法,我給大家的建議:
先找到線團,然後進入線團裡學著怎麼玩。為了進入線團,需要先把基礎知識掌握好。《演算法和資料結構》(教材),你一定要看完+理解。這裡面講的都是不能再基礎的東西了,覺得講得不好,自己搜維基百科。沒辦法,如果堅持不下來,你後面就受罪去吧。
然後有一些很經典的書可以迅速讓你進入狀態
比如我這本《程式設計師程式碼面試指南》
還有《劍指offer》,配合線上練習
《程式設計師面試金典》配合線上練習,這些好書。
——————————
- 專業IT筆試面試備考平臺
- 最全C++JAVA前端等網際網路技術求職題庫
- 全面提升IT程式設計能力
- 程式設計師交友聖地
很多人都覺得演算法原理晦澀難懂,因而對學習演算法這件事望而卻步。其實,演算法並沒有我們想象中的那樣高深。
還記得宋丹丹老師的“把大象放進冰箱需要幾步”這個問題嗎?
第一步,把冰箱門開啟;第二步,把大象放進去;第三步,把冰箱門關上。這其實就是一個演算法問題,是不是很簡單!演算法的本質就是一系列解決問題的清晰指令,是對解題方案准確而完整的描述。當你在日常生活中解決問題的時候,其實已經在應用演算法思想了。
對於演算法的學習,閱讀書籍是一種非常高效和系統的學習方式。下面列舉了幾本從入門到應用不同程度的演算法書,大家可以根據自己的興趣和知識水平選擇合適的書籍進行針對性的學習。
《極簡演算法史 從數學到機器的故事》作者:[法] 呂克 德 布拉班迪爾,譯者:任軼在正式學習演算法知識前,不妨先了解一下演算法的發展歷史。演算法集數學、邏輯學、計算機科學三大領域的知識於一體。計算機科學的歷史也是人類夢想結合數學和邏輯學這兩大相近分支的歷史。這本書描繪了一場人類探索數學、演算法與邏輯思維,並走向人工智慧的夢想之旅,展現了哲學家、邏輯學家與數學家獨特的思維方式,探討了演算法與人工智慧對科學和社會的巨大影響 。適合對數學、哲學和演算法感興趣的大眾讀者。
對於入門級的學習者來說,大量文字的堆疊令人頭疼,很容易失去繼續學習的興趣。《演算法圖解》這本書使用了大量生動形象的插圖來解釋演算法涉及到的各種概念,比如,把記憶體比喻成抽屜,把連結串列的操作比喻成尋寶遊戲。就連對計算機專業學生都比較困難的K最近鄰演算法,都可以用“橙子還是柚子”來進行形象的描述。因此,這本書適合程式設計師、計算機專業相關師生以及對演算法感興趣的讀者閱讀。
《演算法(第4版)》,作者:[美] Robert Sedgewick Kevin Wayne,譯者:謝路雲作為演算法領域的參考書,《演算法(第4版)》全面介紹了關於演算法和資料結構的必備知識,特別針對排序、搜尋、圖處理和字串處理進行了論述。書中為每個演算法提供了完整Java程式碼,並提供了應用場景。它的另一大亮點是配套網站,提供了程式碼實現、測試資料、練習、教學課件等多種資源,瀏覽起來十分方便。這本書不僅適合計算機專業的學生,對所有對科學、數學或工程學感興趣的學生也十分有價值。
《計算機程式設計藝術 卷1,基本演算法(第3版)》,作者:[美] 高德納(Donald E. Knuth),譯者:李伯民 範明 蔣愛軍《計算機程式設計藝術》系列是公認的計算機科學領域權威之作,深入闡述了程式設計理論,對計算機領域的發展有著極為深遠的影響。本書是該系列的第 1 卷,講解基本演算法,從基本概念開始,然後講述資訊結構,並輔以大量的習題及答案。作者Donald E. Knuth是著名計算機科學家,演算法與程式設計技術的先驅者,曾獲美國計算機協會圖靈獎、美國國家科學獎章、美國數學學會的斯蒂爾獎等多種獎項。
《演算法謎題》,作者:[美] Anany Levitin Maria Levitin,譯者:趙勇 徐章寧 高博求解演算法謎題是培養和鍛鍊演算法思維能力一種最有效和最有樂趣的途徑。這本書是一本經典演算法謎題的合集。書中包括了一些古已有之的謎題,數學和計算機科學有一部分知識就發源於此,還有一些較新的謎題,其中有一部分謎題被用作知名IT企業的面試題。因此,這本書適合計算機專業的高校教師和學生,想要培養和訓練演算法思維和計算思維的IT專業人士,以及在準備面試的應聘者和麵試官閱讀參考。
當然,除了必備的工具書以外,堅持學習才能真正學好甚至精通演算法。希望透過對這些演算法書的研讀,你能對演算法知識有自己獨到的見解,並應用到自己的工作和生活中。