如何抓住重點,系統高效地學習數據結構與算法?

你是否曾跟我一樣,因為看不懂數據結構和算法,而一度懷疑是自己太笨?實際上,很多人在第一次接觸這門課時,都會有這種感覺,覺得數據結構和算法很抽象,晦澀難懂,宛如天書。正是這個原因,讓很多初學者對這門課望而卻步。

我個人覺得,其實真正的原因是你沒有找到好的學習方法,沒有抓住學習的重點。實際上,數據結構和算法的東西并不多,常用的、基礎的知識點更是屈指可數。只要掌握了正確的學習方法,學起來并沒有看上去那么難,更不需要什么高智商、厚底子。

還記得大學里每次考前老師都要劃重點嗎?今天,我就給你劃劃我們這門課的重點,再告訴你一些我總結的學習小竅門。相信有了這些之后,你學起來就會有的放矢、事半功倍了。
戳此試讀,42000+程序員加入\u0026gt;\u0026gt;\u0026gt;

什么是數據結構?什么是算法?

大部分數據結構和算法教材,在開篇都會給這兩個概念下一個明確的定義。但是,這些定義都很抽象,對理解這兩個概念并沒有實質性的幫助,反倒會讓你陷入死摳定義的誤區。畢竟,我們現在學習,并不是為了考試,所以,概念背得再牢,不會用也就沒什么用。

雖然我們說沒必要深挖嚴格的定義,但是這并不等于不需要理解概念。下面我就從廣義和狹義兩個層面,來幫你理解數據結構與算法這兩個概念。

從廣義上講,數據結構就是指一組數據的存儲結構。算法就是操作數據的一組方法。

圖書館儲藏書籍你肯定見過吧?為了方便查找,圖書管理員一般會將書籍分門別類進行“存儲”。按照一定規律編號,就是書籍這種“數據”的存儲結構。

那我們如何來查找一本書呢?有很多種辦法,你當然可以一本一本地找,也可以先根據書籍類別的編號,是人文,還是科學、計算機,來定位書架,然后再依次查找。籠統地說,這些查找方法都是算法。

從狹義上講,也就是我們專欄要講的,是指某些著名的數據結構和算法,比如隊列、棧、堆、二分查找、動態規劃等。這些都是前人智慧的結晶,我們可以直接拿來用。我們要講的這些經典數據結構和算法,都是前人從很多實際操作場景中抽象出來的,經過非常多的求證和檢驗,可以高效地幫助我們解決很多實際的開發問題。

那數據結構和算法有什么關系呢?為什么大部分書都把這兩個東西放到一塊兒來講呢?

這是因為,數據結構和算法是相輔相成的。數據結構是為算法服務的,算法要作用在特定的數據結構之上。因此,我們無法孤立數據結構來講算法,也無法孤立算法來講數據結構。

比如,因為數組具有隨機訪問的特點,常用的二分查找算法需要用數組來存儲數據。但如果我們選擇鏈表這種數據結構,二分查找算法就無法工作了,因為鏈表并不支持隨機訪問。

數據結構是靜態的,它只是組織數據的一種方式。如果不在它的基礎上操作、構建算法,孤立存在的數據結構就是沒用的。

現在你對數據結構與算法是不是有了比較清晰的理解了呢?有了這些儲備,下面我們來看看,究竟該怎么學數據結構與算法。

學習這個專欄需要什么基礎?

看到數據結構和算法里的“算法”兩個字,很多人就會聯想到“數學”,覺得算法會涉及到很多深奧的數學知識。那我數學基礎不是很好,學起來會不會很吃力啊?

數據結構和算法課程確實會涉及一些數學方面的推理、證明,尤其是在分析某個算法的時間、空間復雜度的時候,但是這個你完全不需要擔心。

這個專欄不會像《算法導論》那樣,里面有非常復雜的數學證明和推理。我會由淺入深,從概念到應用,一點一點給你解釋清楚。你只要有高中數學水平,就完全可以學習。

當然,我希望你最好有些編程基礎,如果有項目經驗就更好了。這樣我給你講數據結構和算法如何提高效率、如何節省存儲空間,你就會有很直觀的感受。因為,對于每個概念和實現過程,我都會從實際場景出發,不僅教你“是什么”,還會教你“為什么”,并且告訴你遇到同類型問題應該“怎么做”。

學習的重點在什么地方?

提到數據結構和算法,很多人就很頭疼,因為這里面的內容實在是太多了。這里,我就幫你梳理一下,應該先學什么,后學什么。你可以對照看看,你屬于哪個階段,然后有針對地進行學習。

想要學習數據結構與算法,首先要掌握一個數據結構與算法中最重要的概念——復雜度分析。

這個概念究竟有多重要呢?可以這么說,它幾乎占了數據結構和算法這門課的半壁江山,是數據結構和算法學習的精髓。

數據結構和算法解決的是如何更省、更快地存儲和處理數據的問題,因此,我們就需要一個考量效率和資源消耗的方法,這就是復雜度分析方法。所以,如果你只掌握了數據結構和算法的特點、用法,但是沒有學會復雜度分析,那就相當于只知道操作口訣,而沒掌握心法。只有把心法了然于胸,才能做到無招勝有招!

所以,復雜度分析這個內容,我會用很大篇幅給你講透。你也一定要花大力氣來啃,必須要拿下,并且要搞得非常熟練。否則,后面的數據結構和算法也很難學好。

搞定復雜度分析,下面就要進入數據結構與算法的正文內容了。

為了讓你對數據結構和算法能有個全面的認識,我畫了一張圖,里面幾乎涵蓋了所有數據結構和算法書籍中都會講到的知識點。
\"\"

但是,作為初學者,或者一個非算法工程師來說,你并不需要掌握圖里面的所有知識點。很多高級的數據結構與算法,比如二分圖、最大流等,這些在我們平常的開發中很少會用到。所以,你暫時可以不用看。我還是那句話,咱們學習要學會找重點。如果不分重點地學習,眉毛胡子一把抓,學起來肯定會比較吃力。

所以,結合我自己的學習心得,還有這些年的面試、開發經驗,我總結了20個最常用的、最基礎數據結構與算法,不管是應付面試還是工作需要,只要集中精力逐一攻克這20個知識點就足夠了。

這里面有10個數據結構:數組、鏈表、棧、隊列、散列表、二叉樹、堆、跳表、圖、Trie樹;10個算法:遞歸、排序、二分查找、搜索、哈希算法、貪心算法、分治算法、回溯算法、動態規劃、字符串匹配算法。

掌握了這些基礎的數據結構和算法,再學更加復雜的數據結構和算法,就會非常容易、非常快。

在學習數據結構和算法的過程中,你也要注意,不要只是死記硬背,不要為了學習而學習,而是要學習它的“來歷”“自身的特點”“適合解決的問題”以及“實際的應用場景”。對于每一種數據結構或算法,我都會從這幾個方面進行詳細講解。只要你掌握了我每節課里講的內容,就能在開發中靈活應用。

學習數據結構和算法的過程,是非常好的思維訓練的過程,所以,千萬不要被動地記憶,要多辯證地思考,多問為什么。如果你一直這么堅持做,你會發現,等你學完之后,寫代碼的時候就會不由自主地考慮到很多性能方面的事情,時間復雜度、空間復雜度非常高的垃圾代碼出現的次數就會越來越少。你的編程內功就真正得到了修煉。

一些可以讓你事半功倍的學習技巧

前面我給你劃了學習的重點,也講了學習這門課需要具備的基礎。作為一個過來人,現在我就給你分享一下,專欄學習的一些技巧。掌握了這些技巧,可以讓你化被動為主動,學起來更加輕松,更加有動力!

1.邊學邊練,適度刷題

“邊學邊練”這一招非常有用。建議你每周花1~2個小時的時間,集中把這周的三節內容涉及的數據結構和算法,全都自己寫出來,用代碼實現一遍。這樣一定會比單純地看或者聽的效果要好很多!

有面試需求的同學,可能會問了,那我還要不要去刷題呢?

我個人的觀點是可以“適度”刷題,但一定不要浪費太多時間在刷題上。我們學習的目的還是掌握,然后應用。除非你要面試Google、Facebook這樣的公司,它們的算法題目非常非常難,必須大量刷題,才能在短期內提升應試正確率。如果是應對國內公司的技術面試,即便是BAT這樣的公司,你只要徹底掌握這個專欄的內容,就足以應對。

2.多問、多思考、多互動

學習最好的方法是,找到幾個人一起學習,一塊兒討論切磋,有問題及時尋求老師答疑。但是,離開大學之后,既沒有同學也沒有老師,這個條件就比較難具備了。

不過,這也就是咱們專欄學習的優勢。專欄里有很多跟你一樣的學習者。你可以多在留言區寫下自己的疑問、思考和總結,也可以經常看看別人的留言,和他們進行互動。

除此之外,如果你有疑問,你可以隨時在留言區給我留言,我只要有空就會及時回復你。你不要擔心問的問題太小白。因為我初學的時候,也常常會被一些小白問題困擾。不懂一點都不丟人,只要你勇敢提出來,我們一起解決了就可以了。

我也會力爭每節課都最大限度地給你講透,幫你掃除知識盲點,而你要做的就是,避免一知半解,要想盡一切辦法去搞懂我講的所有內容。

3.打怪升級學習法

學習的過程中,我們碰到最大的問題就是,堅持不下來。是的,很多基礎課程學起來都非常枯燥。為此,我自己總結了一套“打怪升級學習法”。

游戲你肯定玩過吧?為什么很多看起來非常簡單又沒有樂趣的游戲,你會玩得不亦樂乎呢?這是因為,當你努力打到一定級別之后,每天看著自己的經驗值、戰斗力在慢慢提高,那種每天都在一點一點成長的成就感就不由自主地產生了。

所以,我們在枯燥的學習過程中,也可以給自己設立一個切實可行的目標,就像打怪升級一樣。

比如,針對這個專欄,你就可以設立這樣一個目標:每節課后的思考題都認真思考,并且回復到留言區。當你看到很多人給你點贊之后,你就會為了每次都能發一個漂亮的留言,而更加認真地學習。

當然,還有很多其他的目標,比如,每節課后都寫一篇學習筆記或者學習心得;或者你還可以每節課都找一下我講得不對、不合理的地方……諸如此類,你可以總結一個適合你的“打怪升級攻略”。

如果你能這樣學習一段時間,不僅能收獲到知識,你還會有意想不到的成就感。因為,這其實幫你改掉了一點學習的壞習慣。這個習慣一旦改掉了,你的人生也會變得不一樣。

4.知識需要沉淀,不要想試圖一下子掌握所有

在學習的過程中,一定會碰到“攔路虎”。如果哪個知識點沒有怎么學懂,不要著急,這是正常的。因為,想聽一遍、看一遍就把所有知識掌握,這肯定是不可能的。學習知識的過程是反復迭代、不斷沉淀的過程。

如果碰到“攔路虎”,你可以盡情地在留言區問我,也可以先沉淀一下,過幾天再重新學一遍。所謂,書讀百遍其義自見,我覺得是很有道理的!

我講的這些學習方法,不僅僅針對咱們這一個課程的學習,其實完全適用任何知識的學習過程。你可以通過這個專欄的學習,實踐一下這些方法。如果效果不錯,再推廣到之后的學習過程中。

內容小結

今天,我帶你劃了劃數據結構和算法的學習重點,復雜度分析,以及10個數據結構和10個算法。

這些內容是我根據平時的學習和工作、面試經驗積累,精心篩選出來的。只要掌握這些內容,應付日常的面試、工作,基本不會有問題。

除此之外,我還給你分享了我總結的一些學習技巧,比如邊學邊練、多問、多思考,還有兩個比較通用的學習方法,打怪升級法和沉淀法。掌握了這些學習技巧,可以讓你學習過程中事半功倍。所以,你一定要好好實踐哦!

戳此立即訂閱,42000+程序員已經加入\u0026gt;\u0026gt;\u0026gt;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/276061.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/276061.shtml
英文地址,請注明出處:http://en.pswp.cn/news/276061.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Google Map瀏覽下載器

很久沒有更新博客了,最近為了玩Google Map,專門寫了個小工具。用以在瀏覽Google地圖時,將關心區域的圖片保存到本地。軟件主界面如下圖: 主界面提取子庫主要功能有: 1、可以瀏覽Google網站的三種圖:交通、地…

vue xunidom_vue的虛擬dom(Virtual DOM )

模板轉換成視圖的過程在底層實現中Vue會將模板編譯成渲染函數,當然我們也可以不寫模板,直接寫渲染函數,以獲得更好的控制。渲染函數:渲染函數是用來生成Virtual DOM的;VNode虛擬節點:vnode可以理解成dom節點…

mysql之union合并查詢

轉載鏈接:http://www.cnblogs.com/zzwlovegfj/archive/2012/06/23/2559592.html union:聯合的意思,即把兩次或多次查詢結果合并起來。 要求:兩次查詢的列數必須一致 推薦:列的類型可以不一樣,但推薦查詢的每一列&#…

Node.js 開發者 2020 年度報告

大家好,我是若川。歡迎加我微信 ruochuan12,長期交流學習。今天分享一篇Node.js報告,記得當時我還參與填寫這個調查問卷了,Node.js的重要性不言而喻。微信預計閱讀只需7分鐘。點擊下方卡片關注我,或者查看源碼系列文章…

[SPS2010] 使用心得 7 - ebook for Installation

[SPS2010] 使用心得 7 - ebook for Installation 一本有關Sharepoint 2010安裝的ebook (英語) http://sharepoint2007tips.com/Documents/Installing%20and%20Configuring%20SharePoint%202010.pdf 相當詳細,目前為止僅有的可以下載的。 posted on 2010-…

視覺設計_視覺設計:

視覺設計What does the customer first see in your application? Yes, its your application design. So it is very important to pay attention to how the design is made. There’s so many factors to include, like how usually people meaning a symbol, how their pr…

開源分布式中間件 DBLE 快速入門指南

2019獨角獸企業重金招聘Python工程師標準>>> 環境準備 DBLE項目資料 DBLE官方網站:https://opensource.actionsky.com 可以詳細了解DBLE的背景和應用場景,本文不涉及到的細節都可在官方文檔獲得更細節都信息;對于剛了解到同學&…

文字輸入限制_從拼音輸入法的興起看漢字文化圈的衰落

曾經韓國的報紙是這樣的:現在的則是這樣的:(上面兩圖均來自網絡,如有侵權請告知)二戰之后,曾經廣泛使用漢字的朝韓跟越南都走上了廢除漢字之路。日本雖然依然使用漢字,卻也發布了《當用漢字表》…

JS彈出窗口

轉載鏈接:http://www.jb51.net/article/32747.htm 如何利用網頁彈出各種形式的窗口,我想大家大多都是知道些的,但那種多種多樣的彈出式窗口是怎么搞出來的,我們今天就來學習一下: 1.彈啟一個全屏窗口 windows.open(…

跟各位讀者朋友分享下公眾號運營策略

大家好,我是若川。歡迎加我微信 ruochuan12,加群交流學習。目前我的公眾號運營策略,分享給各位讀者朋友。點擊下方卡片關注我,或者查看源碼等系列文章。可能大多數關注的人不知道,我的公眾號取名為若川視野的原因。「若…

[轉載]用PHP的ob_start();控制您的瀏覽器cache!

FROM http://www.phpchina.com/html/28/1628-3870.html Output Control 函數可以讓你自由控制腳本中數據的輸出。它非常地有用,特別是對于:當你想在數據已經輸出后,再輸出文件頭的情況。輸出控制函數不對使用 header() 或 setcookie(), 發送的…

oracle 帶有變量的語句_【成都校區】Oracle SQL語句之常見優化方法總結

本帖出自于黑馬程序員成都中心,更多資源可關注微信公眾號1、SQL語句盡量用大寫的;因為oracle總是先解析SQL語句,把小寫的字母轉換成大寫的再執行。2、使用表的別名: 當在SQL語句中連接多個表時, 盡量使用表的別名并把別名前綴于每…

js 獲取上下文后面的路徑_通過在數據后面顯示上下文來可視化公眾意見

js 獲取上下文后面的路徑In 1824, The Harrisburg Pennsylvanian, a newspaper from a town in Pennsylvania conducted the first known public opinion polls in history, and successfully predicted the result of the vote in the close race between Andrew Jackson and …

甘肅甘南步班郵遞員:草原上的“遞愛”艱途

圖為甘肅甘南藏族自治州碌曲縣郎木寺鎮郵政支局的投遞員進行投遞工作。(資料圖) 鐘欣 攝 中新網蘭州1月25日電 (吳玉蒿)漸近春節,劉權英投遞郵件的工作愈加繁重。現年45歲的劉權英是甘肅甘南藏族自治州碌曲縣郎木寺鎮郵政支局的一名投遞員。由…

核心編程6——線程

Note 0:了進程實際是由兩個組件組成的:一個進程內核對象和一個地址空間.類似地,線程也由兩個組件組成:一個是線程的內核對象,操作系統用它管理線程.內核對象還是系統用來存放線程統計信息的地方.一個線程堆棧,用于維護線程執行時所需的所有函數參數和局部變量.Note 1:進程是有惰…

PHP解決搶購、秒殺、搶樓、抽獎等阻塞式高并發庫存防控超量的思路方法

轉載鏈接:http://www.4u4v.net/thinking-approach-to-buy-spike-grab-floor-sweepstakes-and-other-high-concurrent-blocking-prevention-excess-inventory-solve-php.html 如今在電商行業里,秒殺搶購活動已經是商家常用促銷手段。但是庫存數量有限,而同…

看了就會的 Node.js 三大基礎模塊常用 API

大家好,我是若川。歡迎加我微信 ruochuan12,加群交流學習。今天分享一篇nodejs基礎的文章。點擊下方卡片關注我,或者查看源碼等系列文章。在日常使用 Node 進行開發的時候,會使用到一些文件系統、路徑操作等基礎 API,這…

vue-cli3插件初體驗

vue-cli3發布自2018年8月,距離現在還不是特別久,最好搭建項目剛好用到,所以寫下這篇文章,記錄一下踩坑經歷。vue的作者說過,vue-cli的本質是模版的拉取,太多的配置導致了模版的難以維護,所以重構…

ios設計登錄功能_親愛的產品設計師,這是iOS 14的新功能

ios設計登錄功能On June 22, 2020 Apple previewed iOS 14 for the first time. As always there are quite some changes you should know about as a product designer like widgets, pickers, app clips, permissions and more.2020年6月22日,Apple首次預覽iOS 1…

c++ int 轉 short_C/C++結構體內存對齊

在面試或工作中,經常會遇到內存對齊的問題。這里結合我的理解談一談對內存對齊的理解。1. 為什么要內存對齊,不對齊會怎么樣?內存中存放數據是為了給CPU使用,CPU訪問內存數據時會受到地址總線寬度的限制,也就是一次能從…