java架构师进阶之独孤九剑:数据结构以及书籍推荐
這是整個java架構(gòu)師連載系列,分為9大步驟,我們現(xiàn)在還在第一個步驟:程序設計和開發(fā)->數(shù)據(jù)結(jié)構(gòu)與算法。
“
如果說 Java 是自動檔轎車,C 就是手動檔吉普。數(shù)據(jù)結(jié)構(gòu)呢?是變速箱的工作原理,
你完全可以不知道變速箱怎樣工作,就把自動檔的車子從 A 開到 B,而且未必就比懂得的人慢。寫程序這件事,和開車一樣,經(jīng)驗可以起到很大作用,但如果你不知道底層是怎么工作的,就永遠只能開車,既不會修車,也不能造車。如果你對這兩件事都不感興趣也就罷了,數(shù)據(jù)結(jié)構(gòu)懂得用就好。但若你此生在編程領域還有點更高的追求,數(shù)據(jù)結(jié)構(gòu)是繞不開的課題。
不想學好基礎的程序員很難進階到架構(gòu)師。
為什么要學習數(shù)據(jù)結(jié)構(gòu)
學習數(shù)據(jù)結(jié)構(gòu),并不僅僅是學習其中現(xiàn)成的那些隊列,堆棧,二叉樹,圖等經(jīng)典結(jié)構(gòu), 也不僅僅是學習其中的那些快速排序、冒泡排序等算法。
更重要的是你要學習一種思想:如何把現(xiàn)實問題轉(zhuǎn)化為計算機語言的表示。
當你用著java里面的容器類很爽的時候,你有沒有想過,怎么ArrayList就像一個無限擴充的數(shù)組,也好像鏈表之類的。好用嗎?好用,這就是數(shù)據(jù)結(jié)構(gòu)的用處,只不過你在不知不覺中使用了。
校招會發(fā)現(xiàn)大公司考的就是這類的題目,剛開始不會考你java的線程,容器,多態(tài)什么的特性,考的就是你的基礎,你的這些基礎扎實,學其他不是問題。
用于現(xiàn)實世界的存儲,我們使用的工具和建模。每種數(shù)據(jù)結(jié)構(gòu)有自己的優(yōu)點和缺點,想想如果Google的數(shù)據(jù)用的是數(shù)組的存儲,我們還能方便地查詢到所需要的數(shù)據(jù)嗎。
而算法,在這么多的數(shù)據(jù)中如何做到最快的插入,查找,刪除,也是在追求更快。
常用的數(shù)據(jù)結(jié)構(gòu)
鏈表
鏈表是一種由節(jié)點(Node)組成的線性數(shù)據(jù)集合,每個節(jié)點通過指針指向下一個節(jié)點。它是一種由節(jié)點組成,并能用于表示序列的數(shù)據(jù)結(jié)構(gòu)。
單鏈表:每個節(jié)點僅指向下一個節(jié)點,最后一個節(jié)點指向空(null)。
雙鏈表:每個節(jié)點有兩個指針p,n。p指向前一個節(jié)點,n指向下一個節(jié)點;最后一個節(jié)點指向空。
循環(huán)鏈表:每個節(jié)點指向下一個節(jié)點,最后一個節(jié)點指向第一個節(jié)點。
時間復雜度:
索引:O(n)
查找:O(n)
插入:O(1)
刪除:O(1)
棧
棧是一個元素集合,支持兩個基本操作:push用于將元素壓入棧,pop用于刪除棧頂元素。
后進先出的數(shù)據(jù)結(jié)構(gòu)(Last In First Out, LIFO)
時間復雜度
索引:O(n)
查找:O(n)
插入:O(1)
刪除:O(1)
隊列
隊列是一個元素集合,支持兩種基本操作:enqueue 用于添加一個元素到隊列,dequeue 用于刪除隊列中的一個元素。
先進先出的數(shù)據(jù)結(jié)構(gòu)(First In First Out, FIFO)。
時間復雜度
索引:O(n)
查找:O(n)
插入:O(1)
刪除:O(1)
樹
樹是無向、聯(lián)通的無環(huán)圖。
二叉樹
二叉樹是一個樹形數(shù)據(jù)結(jié)構(gòu),每個節(jié)點最多可以有兩個子節(jié)點,稱為左子節(jié)點和右子節(jié)點。
滿二叉樹(Full Tree):二叉樹中的每個節(jié)點有 0 或者 2 個子節(jié)點。
完美二叉樹(Perfect Binary):二叉樹中的每個節(jié)點有兩個子節(jié)點,并且所有的葉子節(jié)點的深度是一樣的。
完全二叉樹:二叉樹中除最后一層外其他各層的節(jié)點數(shù)均達到最大值,最后一層的節(jié)點都連續(xù)集中在最左邊。
二叉查找樹
二叉查找樹(BST)是一種二叉樹。其任何節(jié)點的值都大于等于左子樹中的值,小于等于右子樹中的值。
時間復雜度
索引:O(log(n))
查找:O(log(n))
插入:O(log(n))
刪除:O(log(n))
數(shù)據(jù)結(jié)構(gòu)和算法書籍推薦
1.算法導論
這本書深入淺出,全面地介紹了計算機算法。對每一個算法的分析既易于理解又十分有趣,并保持了數(shù)學嚴謹性。本書的設計目標全面,適用于多種用途。涵蓋的內(nèi)容有:算法在計算中的作用,概率分析和隨機算法的介紹。書中專門討論了線性規(guī)劃,介紹了動態(tài)規(guī)劃的兩個應用,隨機化和線性規(guī)劃技術(shù)的近似算法等,還有有關遞歸求解、快速排序中用到的劃分方法與期望線性時間順序統(tǒng)計算法,以及對貪心算法元素的討論。此書還介紹了對強連通子圖算法正確性的證明,對哈密頓回路和子集求和問題的NP完全性的證明等內(nèi)容。全書提供了900多個練習題和思考題以及敘述較為詳細的實例研究。
2.大話數(shù)據(jù)結(jié)構(gòu)
通篇以一種趣味方式來敘述,大量引用了各種各樣的生活知識來類比,并充分運用圖形語言來體現(xiàn)抽象內(nèi)容,對數(shù)據(jù)結(jié)構(gòu)所涉及到的一些經(jīng)典算法做到逐行分析、多算法比較。與市場上的同類數(shù)據(jù)結(jié)構(gòu)圖書相比,本書內(nèi)容趣味易讀,算法講解細致深刻,是一本非常適合自學的讀物。
3.數(shù)據(jù)結(jié)構(gòu)與算法
本書是國外數(shù)據(jù)結(jié)構(gòu)與算法分析方面的經(jīng)典教材,使用卓越的Java編程語言作為實現(xiàn)工具討論了數(shù)據(jù)結(jié)構(gòu)(組織大量數(shù)據(jù)的方法)和算法分析(對算法運行時間的估計)。 隨著計算機速度的不斷增加和功能的日益強大,人們對有效編程和算法分析的要求也不斷增長。本書把算法分析與最有效率的Java程序的開發(fā)有機地結(jié)合起來,深入分析每種算法,內(nèi)容全面、縝密嚴格,并細致講解精心構(gòu)造程序的方法。
你可能也喜歡:
總結(jié)
以上是生活随笔為你收集整理的java架构师进阶之独孤九剑:数据结构以及书籍推荐的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开源开放 | 中文相对复杂词汇识别数据集
- 下一篇: 领域应用 | 知识图谱在小米的应用与探索