如何徹底透析數據結構、算法這門課?

在這裏插入圖片描述
你是否曾跟我同樣,由於看不懂數據結構和算法,而一度懷疑是本身太笨?實際上,不少人在第一次接觸這門課時,都會有這種感受,以爲數據結構和算法很抽象,晦澀難懂,宛如天書。正是這個緣由,讓不少初學者對這門課望而卻步。

我我的以爲,其實真正的緣由是你沒有找到好的學習方法,沒有抓住學習的重點。實際上,數據結構和算法的東西並很少,經常使用的、基礎的知識點更是屈指可數。只要掌握了正確的學習方法,學起來並無看上去那麼難,更不須要什麼高智商、厚底子面試

還記得大學裏每次考前老師都要劃重點嗎?今天,我就給你劃劃咱們這門課的重點,再告訴你一些我總結的學習小竅門。相信有了這些以後,你學起來就會有的放矢、事半功倍了。算法

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

大部分數據結構和算法教材,在開篇都會給這兩個概念下一個明確的定義。可是,這些定義都很抽象,對理解這兩個概念並無實質性的幫助,反倒會讓你陷入死摳定義的誤區。畢竟,咱們學習,並非爲了考試,因此,概念背得再牢,不會用也就沒什麼用。編程

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

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

圖書館儲藏書籍你確定見過吧?爲了方便查找,圖書管理員通常會將書籍分門別類進行「存儲」。按照必定規律編號,就是書籍這種「數據」的存儲結構。數據結構和算法

那咱們如何來查找一本書呢?有不少種辦法,你固然能夠一本一本地找,也能夠先根據書籍類別的編號,是人文,仍是科學、計算機,來定位書架,而後再依次查找。籠統地說,這些查找方法都是算法。性能

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

那數據結構和算法有什麼關係呢?爲何大部分書都把這兩個東西放到一起來說呢?動畫

這是由於,數據結構和算法是相輔相成的。數據結構是爲算法服務的,算法要做用在特定的數據結構之上。 所以,咱們沒法孤立數據結構來說算法,也沒法孤立算法來說數據結構。.net

好比,由於數組具備隨機訪問的特色,經常使用的二分查找算法須要用數組來存儲數據。但若是咱們選擇鏈表這種數據結構,二分查找算法就沒法工做了,由於鏈表並不支持隨機訪問。

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

如今你對數據結構與算法是否是有了比較清晰的理解了呢?有了這些儲備,下面咱們來看看,究竟該怎麼學數據結構與算法。

學習這個專欄須要什麼基礎?

看到數據結構和算法裏的「算法」兩個字,不少人就會聯想到「數學」,以爲算法會涉及到不少深奧的數學知識。那我數學基礎不是很好,學起來會不會很吃力啊?

數據結構和算法課程確實會涉及一些數學方面的推理、證實,尤爲是在分析某個算法的時間、空間複雜度的時候,可是這個你徹底不須要擔憂。

這個專欄不會像《算法導論》那樣,裏面有很是複雜的數學證實和推理。我會由淺入深,從概念到應用,一點一點給你解釋清楚。你只要有高中數學水平,就徹底能夠學習

固然,我但願你最好有些編程基礎,若是有項目經驗就更好了。這樣我給你講數據結構和算法如何提升效率、如何節省存儲空間,你就會有很直觀的感覺。由於,對於每一個概念和實現過程,我都會從實際場景出發,不只教你「是什麼」,還會教你「爲何」,而且告訴你遇到同類型問題應該「怎麼作」。

學習的重點在什麼地方?

提到數據結構和算法,不少人就很頭疼,由於這裏面的內容實在是太多了。這裏,我就幫你梳理一下,應該先學什麼,後學什麼。你能夠對照看看,你屬於哪一個階段,而後有針對地進行學習。

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

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

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

因此,複雜度分析這個內容,我會用很大篇幅給你講透。你也必定要花大力氣來啃,必需要拿下,而且要搞得很是熟練。不然,後面的數據結構和算法也很難學好。

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

爲了讓你對數據結構和算法能有個全面的認識,我畫了一張圖,裏面幾乎涵蓋了全部數據結構和算法書籍中都會講到的知識點。 可是,做爲初學者,或者一個非算法工程師來講,你並不須要掌握圖裏面的全部知識點。不少高級的數據結構與算法,好比二分圖、最大流等,這些在咱們日常的開發中不多會用到。因此,你暫時能夠不用看。我仍是那句話,我們學習要學會找重點。若是不分重點地學習,眉毛鬍子一把抓,學起來確定會比較吃力。

因此,結合我本身的學習心得,還有這些年的面試、開發經驗,我總結了20個最經常使用的、最基礎數據結構與算法,無論是應付面試仍是工做須要,只要集中精力逐一攻克這20個知識點就足夠了。

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

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

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

學習數據結構和算法的過程,是很是好的思惟訓練的過程,因此,千萬不要被動地記憶,要多辯證地思考,多問爲何。若是你一直這麼堅持作,你會發現,等你學完以後,寫代碼的時候就會情不自禁地考慮到不少性能方面的事情,時間複雜度、空間複雜度很是高的垃圾代碼出現的次數就會愈來愈少。你的編程內功就真正獲得了修煉。

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

前面我給你劃了學習的重點,也講了學習這門課須要具有的基礎。做爲一個過來人,如今我就給你分享一下,專欄學習的一些技巧。掌握了這些技巧,可讓你化被動爲主動,學起來更加輕鬆,更加有動力!

1.邊學邊練,適度刷題

「邊學邊練」這一招很是有用。建議你每週花1~2個小時的時間,記住,時間要控制好,建議你每週花1~2個小時的時間,時間差異不要太偏離個人建議,學會管理時間的同時注重效率!集中把這周的三節內容涉及的數據結構和算法,全都本身寫出來,用代碼實現一遍。這樣必定會比單純地看或者聽的效果要好不少!

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

我我的的觀點是能夠「適度」刷題,但必定不要浪費太多時間在刷題上。咱們學習的目的仍是掌握,而後應用。除非你要面試Google、Facebook這樣的公司,它們的算法題目很是很是難,必須大量刷題,才能在短時間內提高應試正確率。若是是應對國內公司的技術面試,即使是BAT這樣的公司,你只要完全掌握這個專欄的內容,就足以應對。

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

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

不過,這也就是我們專欄學習的優點。專欄裏有不少跟你同樣的學習者。你能夠多在留言區寫下本身的疑問、思考和總結,也能夠常常看看別人的留言,和他們進行互動。

除此以外,若是你有疑問,你能夠隨時在留言區給我留言,我只要有空就會及時回覆你。你不要擔憂問的問題過小白。由於我初學的時候,也經常會被一些小白問題困擾。不懂一點都不丟人,只要你勇敢提出來,咱們一塊兒解決了就能夠了。

而你要作的就是,避免只知其一;不知其二,要想盡一切辦法去搞懂我講的全部內容。

3.打怪升級學習法

學習的過程當中,咱們碰到最大的問題就是,堅持不下來。 是的,不少基礎課程學起來都很是枯燥。爲此,我本身總結了一套「打怪升級學習法」

遊戲你確定玩過吧?爲何不少看起來很是簡單又沒有樂趣的遊戲,你會玩得不亦樂乎呢?這是由於,當你努力打到必定級別以後,天天看着本身的經驗值、戰鬥力在慢慢提升,那種天天都在一點一點成長的成就感就情不自禁地產生了。

因此,咱們在枯燥的學習過程當中,也能夠給本身設立一個切實可行的目標,就像打怪升級同樣。

好比,針對這個專欄,你就能夠設立這樣一個目標:每節課後的思考題都認真思考,而且回覆到留言區。當你看到不少人給你點贊以後,你就會爲了每次都能發一個漂亮的留言,而更加認真地學習。

固然,還有不少其餘的目標,好比,每節課後都寫一篇學習筆記或者學習心得;或者你還能夠每節課都找一下我講得不對、不合理的地方……諸如此類,你能夠總結一個適合你的「打怪升級攻略」。

若是你能這樣學習一段時間,不只能收穫到知識,你還會有意想不到的成就感。由於,這其實幫你改掉了一點學習的壞習慣。這個習慣一旦改掉了,你的人生也會變得不同。

4.知識須要沉澱,不要想試圖一會兒掌握全部

在學習的過程當中,必定會碰到「攔路虎」。若是哪一個知識點沒有怎麼學懂,不要着急,這是正常的。由於,想聽一遍、看一遍就把全部知識掌握,這確定是不可能的。永遠記住學習知識的過程是反覆迭代、不斷沉澱的過程

若是碰到「攔路虎」,你能夠盡情地在留言區問我,也能夠先沉澱一下,過幾天再從新學一遍。所謂,書讀百遍其義自見,我以爲是頗有道理的!

我講的這些學習方法,不只僅針對我們這一個課程的學習,其實徹底適用任何知識的學習過程。你能夠經過這個專欄的學習,實踐一下這些方法。若是效果不錯,再推廣到以後的學習過程當中。

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

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

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

最後,博主的這篇文章是摘自極客王爭老師的數據結構與算法專欄,因此徹底不用擔憂上面講的不到位,博主我只是簡單的總結而且簡單地標識一些重點,旨在分享,接下來的路途,博主我也會樂於分享該專欄的智慧結晶,畢竟 永遠記住學習知識的過程是反覆迭代、不斷沉澱的過程,不過我認爲這句話還不夠完美,而博主我認爲:學習知識的過程是反覆迭代、不斷沉澱、樂於分享的過程

推薦相關數據結構與算法文章:

動畫 | 大學四年結束以前必須透徹的排序算法

數據結構與算法分析有多重要?

時間空間複雜度分析:如何分析、統計算法的執行效率和資源消耗

...

數據結構與算法專欄

最後的最後,博主想說:

在這裏插入圖片描述

若是本文章對你有幫助,哪怕是一點點,請點個讚唄,謝謝~

歡迎各位關注個人公衆號,一塊兒探討技術,嚮往技術,追求技術...說好了來了就是盆友喔...

在這裏插入圖片描述
相關文章
相關標籤/搜索