筆者作為一名非科班出身的程序員担映,想系統(tǒng)地補充“數(shù)據(jù)結(jié)構(gòu)與算法”這一塊知識,入了極客時間的專欄《數(shù)據(jù)結(jié)構(gòu)與算法之美》淋肾,希望能以筆記的形式總結(jié)硫麻、分享所學,更以督促學習樊卓。
本章內(nèi)容源于對專欄以下章節(jié)的學習筆記:
- 從今天起拿愧,跨過“數(shù)據(jù)結(jié)構(gòu)與算法”這道坎
- 為什么要學習數(shù)據(jù)結(jié)構(gòu)和算法?
- 如何抓住重點碌尔,系統(tǒng)高效地學習數(shù)據(jù)結(jié)構(gòu)與算法浇辜?
經(jīng)驗篇
作者開篇介紹了兩個和數(shù)據(jù)結(jié)構(gòu)與算法有關(guān)的例子:
- 1.在作者的學生時代券敌,為了幫他提高編程能力,師兄給了他一本《算法導論》柳洋,使他對算法開始著迷待诅。通過對數(shù)據(jù)結(jié)構(gòu)與算法的研究,編程能力有了質(zhì)的飛躍熊镣。他認為那是他人生為數(shù)不多的轉(zhuǎn)折點之一卑雁。
- 2.一位在騰訊工作10年的T4大牛,跳槽去區(qū)塊鏈領(lǐng)域绪囱,用了不到半年時間测蹲,就把區(qū)塊鏈的整個技術(shù)脈絡(luò)摸清楚了。他曾經(jīng)說毕箍,像區(qū)塊鏈弛房、人工智能這些看似很新的技術(shù),其實一點兒都不“新”而柑。最初學編程的時候文捶,他就把那些基礎(chǔ)的知識都學透了。當面臨行業(yè)變動媒咳、新技術(shù)更迭的時候粹排,他不斷發(fā)現(xiàn),那些所謂的新技術(shù)涩澡,核心和本質(zhì)的東西其實就是當初學的那些知識顽耳。
基礎(chǔ)知識就像是一座大樓的地基,它決定了我們的技術(shù)高度妙同。而要想快速做出點事情射富,前提條件一定是基礎(chǔ)能力過硬,“內(nèi)功”要到位粥帚。
我們都知道基礎(chǔ)無外乎就是操作系統(tǒng)胰耗、計算機網(wǎng)絡(luò)、編譯原理等芒涡,當然還有數(shù)據(jù)結(jié)構(gòu)和算法柴灯。
人生路上,我們會遇到很多的坎费尽≡海跨過去,你就可以成長旱幼,跨不過去就是困難和停滯查描。而在后面很長的一段時間里,你都需要為這個困難買單。對于我們技術(shù)人來說冬三,更是這樣鸯两。既然數(shù)據(jù)結(jié)構(gòu)和算法這個坎,我們總歸是要跨過去长豁,為什么不是現(xiàn)在呢?
目的篇
我們?yōu)槭裁匆獙W習數(shù)據(jù)結(jié)構(gòu)和算法忙灼?
1.通關(guān)大廠面試
- 就校招而言匠襟,沒有實際項目經(jīng)驗,公司只能考察基礎(chǔ)知識是否牢固该园。
- 就社招而言酸舍,越是厲害的公司越重視考察數(shù)據(jù)結(jié)構(gòu)與算法等基礎(chǔ)知識,相對短期能力里初,公司更看中你的長期潛力啃勉。
擺正心態(tài):我們學任何知識都是為了“用”的,是為了解決實際工作問題双妨。
2.避免只會業(yè)務操作
在基礎(chǔ)框架中淮阐,一般都柔和了很多基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)和算法的設(shè)計思想。掌握數(shù)據(jù)結(jié)構(gòu)和算法刁品,不管對于閱讀框架源碼泣特,還是理解其背后的設(shè)計思想,都是非常有用的挑随。
3.開源框架的目標
相同原理的框架状您,為什么有的人寫的就可以在GitHub上被很多人使用,甚至被官方收錄兜挨?歸根結(jié)底在于細節(jié)膏孟,比如算法的優(yōu)化、數(shù)據(jù)存儲效率拌汇、內(nèi)存的優(yōu)化等等柒桑。
4.對編程的追求
不想只會寫湊合的代碼,對編程有所追求担猛。性能好壞起碼是評判代碼非常重要的一個標準幕垦。
小結(jié):學習數(shù)據(jù)結(jié)構(gòu)和算法,并不是為了死記硬背幾個知識點傅联。目的是建立時間復雜度先改、空間復雜度意識,寫出高質(zhì)量的代碼蒸走,能夠設(shè)計基礎(chǔ)架構(gòu)仇奶,提升編程技能,訓練邏輯思維,積攢人生經(jīng)驗该溯,以此獲得工作回報岛抄,實現(xiàn)你的價值,完善你的人生狈茉。掌握了數(shù)據(jù)結(jié)構(gòu)與算法夫椭,你看待問題的深度,解決問題的角度就會完全不一樣氯庆。
方法篇
如何系統(tǒng)高效地學習數(shù)據(jù)結(jié)構(gòu)與算法蹭秋?
1.數(shù)據(jù)結(jié)構(gòu)與算法的定義
從廣義上講,數(shù)據(jù)結(jié)構(gòu)就是指一組數(shù)據(jù)的存儲結(jié)構(gòu)堤撵。算法就是操作數(shù)據(jù)的一組方法仁讨。
2.數(shù)據(jù)結(jié)構(gòu)與算法的關(guān)系
數(shù)據(jù)結(jié)構(gòu)和算法是相輔相成的。數(shù)據(jù)結(jié)構(gòu)是為算法服務的实昨,算法要作用在特定的數(shù)據(jù)結(jié)構(gòu)之上洞豁。
3.學習認知要求
搞清楚:是什么、為什么荒给、怎么做丈挟?
4.學習重點
- 首先要掌握一個數(shù)據(jù)結(jié)構(gòu)與算法中最重要的概念——復雜度分析;
- 10個數(shù)據(jù)結(jié)構(gòu):數(shù)組志电、鏈表礁哄、棧、隊列溪北、散列表桐绒、二叉樹、堆之拨、跳表茉继、圖、Trie 樹蚀乔;
- 10個算法:遞歸烁竭、排序、二分查找吉挣、搜索派撕、哈希算法、貪心算法睬魂、分治算法终吼、回溯算法、動態(tài)規(guī)劃氯哮、字符串匹配算法际跪;
- 學習它們的來歷、自身的特點、適合解決的問題以及實際的應用場景姆打。
5.學習技巧
- 邊學邊練良姆,適度刷題
- 多問、多思考幔戏、多互動
- 打怪升級學習法:留言玛追、筆記、心得闲延、找錯
- 知識需要沉淀豹缀,不要想試圖一下子掌握所有:學習知識的過程是反復迭代、不斷沉淀的過程慨代,書讀百遍其義自見