圖解!24 張圖徹底弄懂 9 大常見數據結構

2021-02-13 算法愛好者

(給算法愛好者加星標,修煉編程內功)

作者:業餘碼農/Amazing10 (本文來自作者投稿)

數據結構想必大家都不會陌生,對於一個成熟的程式設計師而言,熟悉和掌握數據結構和算法也是基本功之一。數據結構本身其實不過是數據按照特點關係進行存儲或者組織的集合,特殊的結構在不同的應用場景中往往會帶來不一樣的處理效率。

常用的數據結構可根據數據訪問的特點分為線性結構和非線性結構。線性結構包括常見的鍊表、棧、隊列等,非線性結構包括樹、圖等。數據結構種類繁多,本文將通過圖解的方式對常用的數據結構進行理論上的介紹和講解,以方便大家掌握常用數據結構的基本知識。

本文提綱

 1  數組


數組可以說是最基本最常見的數據結構。數組一般用來存儲相同類型的數據,可通過數組名和下標進行數據的訪問和更新。數組中元素的存儲是按照先後順序進行的,同時在內存中也是按照這個順序進行連續存放。數組相鄰元素之間的內存地址的間隔一般就是數組數據類型的大小。

 2  鍊表


鍊表相較於數組,除了數據域,還增加了指針域用於構建鏈式的存儲數據。鍊表中每一個節點都包含此節點的數據和指向下一節點地址的指針。由於是通過指針進行下一個數據元素的查找和訪問,使得鍊表的自由度更高。

這表現在對節點進行增加和刪除時,只需要對上一節點的指針地址進行修改,而無需變動其它的節點。不過事物皆有兩極,指針帶來高自由度的同時,自然會犧牲數據查找的效率和多餘空間的使用。

一般常見的是有頭有尾的單鍊表,對指針域進行反向連結,還可以形成雙向鍊表或者循環鍊表。

鍊表和數組對比


鍊表和數組在實際的使用過程中需要根據自身的優劣勢進行選擇。鍊表和數組的異同點也是面試中高頻的考察點之一。這裡對單鍊表和數組的區別進行了對比和總結。



 3  跳表


從上面的對比中可以看出,鍊表雖然通過增加指針域提升了自由度,但是卻導致數據的查詢效率惡化。特別是當鍊表長度很長的時候,對數據的查詢還得從頭依次查詢,這樣的效率會更低。跳表的產生就是為了解決鍊表過長的問題,通過增加鍊表的多級索引來加快原始鍊表的查詢效率。這樣的方式可以讓查詢的時間複雜度從O(n)提升至O(logn)。

跳表通過增加的多級索引能夠實現高效的動態插入和刪除,其效率和紅黑樹和平衡二叉樹不相上下。目前redis和levelDB都有用到跳表。

從上圖可以看出,索引級的指針域除了指向下一個索引位置的指針,還有一個down指針指向低一級的鍊表位置,這樣才能實現跳躍查詢的目的。


 4  棧


棧是一種比較簡單的數據結構,常用一句話描述其特性,後進先出。棧本身是一個線性表,但是在這個表中只有一個口子允許數據的進出。這種模式可以參考腔腸動物...即進食和排洩都用一個口...

棧的常用操作包括入棧push和出棧pop,對應於數據的壓入和壓出。還有訪問棧頂數據、判斷棧是否為空和判斷棧的大小等。由於棧後進先出的特性,常可以作為數據操作的臨時容器,對數據的順序進行調控,與其它數據結構相結合可獲得許多靈活的處理。


 5  隊列


隊列是棧的兄弟結構,與棧的後進先出相對應,隊列是一種先進先出的數據結構。顧名思義,隊列的數據存儲是如同排隊一般,先存入的數據先被壓出。常與棧一同配合,可發揮最大的實力。

 6  樹


樹作為一種樹狀的數據結構,其數據節點之間的關係也如大樹一樣,將有限個節點根據不同層次關係進行排列,從而形成數據與數據之間的父子關係。常見的樹的表示形式更接近「倒掛的樹」,因為它將根朝上,葉朝下。

樹的數據存儲在結點中,每個結點有零個或者多個子結點。沒有父結點的結點在最頂端,成為根節點;沒有非根結點有且只有一個父節點;每個非根節點又可以分為多個不相交的子樹。

這意味著樹是具備層次關係的,父子關係清晰,家庭血緣關係明朗;這也是樹與圖之間最主要的區別。

別看樹好像很高級,其實可看作是鍊表的高配版。樹的實現就是對鍊表的指針域進行了擴充,增加了多個地址指向子結點。同時將「鍊表」豎起來,從而凸顯了結點之間的層次關係,更便於分析和理解。

樹可以衍生出許多的結構,若將指針域設置為雙指針,那麼即可形成最常見的二叉樹,即每個結點最多有兩個子樹的樹結構。二叉樹根據結點的排列和數量還可進一度劃分為完全二叉樹、滿二叉樹、平衡二叉樹、紅黑樹等。

完全二叉樹:除了最後一層結點,其它層的結點數都達到了最大值;同時最後一層的結點都是按照從左到右依次排布。

滿二叉樹:除了最後一層,其它層的結點都有兩個子結點。


平衡二叉樹


平衡二叉樹又被稱為AVL樹,它是一棵二叉排序樹,且具有以下性質:它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。

二叉排序樹:是一棵空樹,或者:若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;它的左、右子樹也分別為二叉排序樹。

樹的高度:結點層次的最大值

平衡因子:左子樹高度 - 右子樹高度

二叉排序樹意味著二叉樹中的數據是排好序的,順序為左結點<根節點<右結點,這表明二叉排序樹的中序遍歷結果是有序的。(還不懂二叉樹四種遍歷方式[前序遍歷、中序遍歷、後序遍歷、層序遍歷]的同學趕緊補習!)

平衡二叉樹的產生是為了解決二叉排序樹在插入時發生線性排列的現象。由於二叉排序樹本身為有序,當插入一個有序程度十分高的序列時,生成的二叉排序樹會持續在某個方向的字數上插入數據,導致最終的二叉排序樹會退化為鍊表,從而使得二叉樹的查詢和插入效率惡化。


平衡二叉樹的出現能夠解決上述問題,但是在構造平衡二叉樹時,卻需要採用不同的調整方式,使得二叉樹在插入數據後保持平衡。主要的四種調整方式有LL(左旋)、RR(右旋)、LR(先左旋再右旋)、RL(先右旋再左旋)。這裡先給大家介紹下簡單的單旋轉操作,左旋和右旋。LR和RL本質上只是LL和RR的組合。

在插入一個結點後應該沿搜索路徑將路徑上的結點平衡因子進行修改,當平衡因子大於1時,就需要進行平衡化處理。從發生不平衡的結點起,沿剛才回溯的路逕取直接下兩層的結點,如果這三個結點在一條直線上,則採用單旋轉進行平衡化,如果這三個結點位於一條折線上,則採用雙旋轉進行平衡化。

左旋:S為當前需要左旋的結點,E為當前結點的父節點。

左旋的操作可以用一句話簡單表示:將當前結點S的左孩子旋轉為當前結點父結點E的右孩子,同時將父結點E旋轉為當前結點S的左孩子。可用動畫表示:

右旋:S為當前需要左旋的結點,E為當前結點的父節點。右單旋是左單旋的鏡像旋轉。

左旋的操作同樣可以用一句話簡單表示:將當前結點S的左孩子E的右孩子旋轉為當前結點S的左孩子,同時將當前結點S旋轉為左孩子E的右孩子。可用動畫表示:

紅黑樹


平衡二叉樹(AVL)為了追求高度平衡,需要通過平衡處理使得左右子樹的高度差必須小於等於1。高度平衡帶來的好處是能夠提供更高的搜索效率,其最壞的查找時間複雜度都是O(logN)。但是由於需要維持這份高度平衡,所付出的代價就是當對樹種結點進行插入和刪除時,需要經過多次旋轉實現復衡。這導致AVL的插入和刪除效率並不高。

為了解決這樣的問題,能不能找一種結構能夠兼顧搜索和插入刪除的效率呢?這時候紅黑樹便申請出戰了。

紅黑樹具有五個特性:

每個葉結點(葉結點即指樹尾端NIL指針或NULL結點)都是黑的。對於任意結點而言,其到葉結點樹尾端NIL指針的每條路徑都包含相同數目的黑結點。

紅黑樹通過將結點進行紅黑著色,使得原本高度平衡的樹結構被稍微打亂,平衡程度降低。紅黑樹不追求完全平衡,只要求達到部分平衡。這是一種折中的方案,大大提高了結點刪除和插入的效率。C++中的STL就常用到紅黑樹作為底層的數據結構。


紅黑樹VS平衡二叉樹


除了上面所提及的樹結構,還有許多廣泛應用在資料庫、磁碟存儲等場景下的樹結構。比如B樹、B+樹等。這裡就先不介紹了誒,下次在講述相關存儲原理的時候將會著重介紹。(其實是因為懶)


 7  堆


了解完二叉樹,再來理解堆就不是什麼難事了。堆通常是一個可以被看做一棵樹的數組對象。堆的具體實現一般不通過指針域,而是通過構建一個一維數組與二叉樹的父子結點進行對應,因此堆總是一顆完全二叉樹。

對於任意一個父節點的序號n來說(這裡n從0算),它的子節點的序號一定是2n+1,2n+2,因此可以直接用數組來表示一個堆。

不僅如此,堆還有一個性質:堆中某個節點的值總是不大於或不小於其父節點的值。將根節點最大的堆叫做最大堆或大根堆,根節點最小的堆叫做最小堆或小根堆。

堆常用來實現優先隊列,在面試中經常考的問題都是與排序有關,比如堆排序、topK問題等。由於堆的根節點是序列中最大或者最小值,因而可以在建堆以及重建堆的過程中,篩選出數據序列中的極值,從而達到排序或者挑選topK值的目的。


 8  散列表


散列表也叫哈希表,是一種通過鍵值對直接訪問數據的機構。在初中,我們就學過一種能夠將一個x值通過一個函數獲得對應的一個y值的操作,叫做映射。散列表的實現原理正是映射的原理,通過設定的一個關鍵字和一個映射函數,就可以直接獲得訪問數據的地址,實現O(1)的數據訪問效率。在映射的過程中,事先設定的函數就是一個映射表,也可以稱作散列函數或者哈希函數。

散列表的實現最關鍵的就是散列函數的定義和選擇。一般常用的有以下幾種散列函數:

直接尋址法:取關鍵字或關鍵字的某個線性函數值為散列地址。

數字分析法:通過對數據的分析,發現數據中衝突較少的部分,並構造散列地址。例如同學們的學號,通常同一屆學生的學號,其中前面的部分差別不太大,所以用後面的部分來構造散列地址。

平方取中:當無法確定關鍵字裡哪幾位的分布相對比較均勻時,可以先求出關鍵字的平方值,然後按需要取平方值的中間幾位作為散列地址。這是因為:計算平方之後的中間幾位和關鍵字中的每一位都相關,所以不同的關鍵字會以較高的概率產生不同的散列地址。

取隨機數法:使用一個隨機函數,取關鍵字的隨機值作為散列地址,這種方式通常用於關鍵字長度不同的場合。

除留取餘法:取關鍵字被某個不大於散列表的表長 n 的數 m 除後所得的餘數 p 為散列地址。這種方式也可以在用過其他方法後再使用。該函數對 m 的選擇很重要,一般取素數或者直接用 n。

確定好散列函數之後,通過某個key值的確會得到一個唯一的value地址。但是卻會出現一些特殊情況。即通過不同的key值可能會訪問到同一個地址,這個現象稱之為衝突。

衝突在發生之後,當在對不同的key值進行操作時會使得造成相同地址的數據發生覆蓋或者丟失,是非常危險的。所以在設計散列表往往還需要採用衝突解決的辦法。

常用的衝突處理方式有很多,常用的包括以下幾種:

開放地址法(也叫開放尋址法):實際上就是當需要存儲值時,對Key哈希之後,發現這個地址已經有值了,這時該怎麼辦?不能放在這個地址,不然之前的映射會被覆蓋。這時對計算出來的地址進行一個探測再哈希,比如往後移動一個地址,如果沒人佔用,就用這個地址。如果超過最大長度,則可以對總長度取餘。這裡移動的地址是產生衝突時的增列序量。

再哈希法:在產生衝突之後,使用關鍵字的其他部分繼續計算地址,如果還是有衝突,則繼續使用其他部分再計算地址。這種方式的缺點是時間增加了。

鏈地址法:鏈地址法其實就是對Key通過哈希之後落在同一個地址上的值,做一個鍊表。其實在很多高級語言的實現當中,也是使用這種方式處理衝突的。

公共溢出區:這種方式是建立一個公共溢出區,當地址存在衝突時,把新的地址放在公共溢出區裡。

目前比較常用的衝突解決方法是鏈地址法,一般可以通過數組和鍊表的結合達到衝突數據緩存的目的。

左側數組的每個成員包括一個指針,指向一個鍊表的頭。每發生一個衝突的數據,就將該數據作為鍊表的節點連結到鍊表尾部。這樣一來,就可以保證衝突的數據能夠區分並順利訪問。

考慮到鍊表過長造成的問題,還可以使用紅黑樹替換鍊表進行衝突數據的處理操作,來提高散列表的查詢穩定性。


 9  圖


圖相較於上文的幾個結構可能接觸的不多,但是在實際的應用場景中卻經常出現。比方說交通中的線路圖,常見的思維導圖都可以看作是圖的具體表現形式。

圖結構一般包括頂點和邊,頂點通常用圓圈來表示,邊就是這些圓圈之間的連線。邊還可以根據頂點之間的關係設置不同的權重,默認權重相同皆為1。此外根據邊的方向性,還可將圖分為有向圖和無向圖。

圖結構用抽象的圖線來表示十分簡單,頂點和邊之間的關係非常清晰明了。但是在具體的代碼實現中,為了將各個頂點和邊的關係存儲下來,卻不是一件易事。


鄰接矩陣


目前常用的圖存儲方式為鄰接矩陣,通過所有頂點的二維矩陣來存儲兩個頂點之間是否相連,或者存儲兩頂點間的邊權重。

無向圖的鄰接矩陣是一個對稱矩陣,是因為邊不具有方向性,若能從此頂點能夠到達彼頂點,那麼彼頂點自然也能夠達到此頂點。此外,由於頂點本身與本身相連沒有意義,所以在鄰接矩陣中對角線上皆為0。

有向圖由於邊具有方向性,因此彼此頂點之間並不能相互達到,所以其鄰接矩陣的對稱性不再。

用鄰接矩陣可以直接從二維關係中獲得任意兩個頂點的關係,可直接判斷是否相連。但是在對矩陣進行存儲時,卻需要完整的一個二維數組。若圖中頂點數過多,會導致二維數組的大小劇增,從而佔用大量的內存空間。

而根據實際情況可以分析得,圖中的頂點並不是任意兩個頂點間都會相連,不是都需要對其邊上權重進行存儲。那麼存儲的鄰接矩陣實際上會存在大量的0。雖然可以通過稀疏表示等方式對稀疏性高的矩陣進行關鍵信息的存儲,但是卻增加了圖存儲的複雜性。

因此,為了解決上述問題,一種可以只存儲相連頂點關係的鄰接表應運而生。


鄰接表


在鄰接表中,圖的每一個頂點都是一個鍊表的頭節點,其後連接著該頂點能夠直接達到的相鄰頂點。相較於無向圖,有向圖的情況更為複雜,因此這裡採用有向圖進行實例分析。

在鄰接表中,每一個頂點都對應著一條鍊表,鍊表中存儲的是頂點能夠達到的相鄰頂點。存儲的順序可以按照頂點的編號順序進行。比如上圖中對於頂點B來說,其通過有向邊可以到達頂點A和頂點E,那麼其對應的鄰接表中的順序即B->A->E,其它頂點亦如此。

通過鄰接表可以獲得從某個頂點出發能夠到達的頂點,從而省去了對不相連頂點的存儲空間。然而,這還不夠。對於有向圖而言,圖中有效信息除了從頂點「指出去」的信息,還包括從別的頂點「指進來」的信息。這裡的「指出去」和「指進來」可以用出度和入度來表示。

入度:有向圖的某個頂點作為終點的次數和。

出度:有向圖的某個頂點作為起點的次數和。

由此看出,在對有向圖進行表示時,鄰接表只能求出圖的出度,而無法求出入度。這個問題很好解決,那就是增加一個表用來存儲能夠到達某個頂點的相鄰頂點。這個表稱作逆鄰接表。


逆鄰接表


逆鄰接表與鄰接表結構類似,只不過圖的頂點連結著能夠到達該頂點的相鄰頂點。也就是說,鄰接表時順著圖中的箭頭尋找相鄰頂點,而逆鄰接表時逆著圖中的箭頭尋找相鄰頂點。

鄰接表和逆鄰接表的共同使用下,就能夠把一個完整的有向圖結構進行表示。可以發現,鄰接表和逆鄰接表實際上有一部分數據時重合的,因此可以將兩個表合二為一,從而得到了所謂的十字鍊表。

十字鍊表


十字鍊表似乎很簡單,只需要通過相同的頂點分別鏈向以該頂點為終點和起點的相鄰頂點即可。

但這並不是最優的表示方式。雖然這樣的方式共用了中間的頂點存儲空間,但是鄰接表和逆鄰接表的鍊表節點中重複出現的頂點並沒有得到重複利用,反而是進行了再次存儲。因此,上圖的表示方式還可以進行進一步優化。

十字鍊表優化後,可通過擴展的頂點結構和邊結構來進行正逆鄰接表的存儲:(下面的弧頭可看作是邊的箭頭那端,弧尾可看作是邊的圓點那端)

data:用於存儲該頂點中的數據;

firstin指針:用於連接以當前頂點為弧頭的其他頂點構成的鍊表,即從別的頂點指進來的頂點;

firstout指針:用於連接以當前頂點為弧尾的其他頂點構成的鍊表,即從該頂點指出去的頂點;

邊結構通過存儲兩個頂點來確定一條邊,同時通過分別代表這兩個頂點的指針來與相鄰頂點進行連結:

tailvex:用於存儲作為弧尾的頂點的編號;

headvex:用於存儲作為弧頭的頂點的編號;

headlink 指針:用於連結下一個存儲作為弧頭的頂點的節點;

taillink 指針:用於連結下一個存儲作為弧尾的頂點的節點;

以上圖為例子,對於頂點A而言,其作為起點能夠到達頂點E。因此在鄰接表中頂點A要通過邊AE(即邊04)指向頂點E,頂點A的firstout指針需要指向邊04的tailvex。同時,從B出發能夠到達A,所以在逆鄰接表中頂點A要通過邊AB(即邊10)指向B,頂點A的firstin指針需要指向邊10的弧頭,即headlink指針。依次類推。

十字鍊表採用了一種看起來比較繁亂的方式對邊的方向性進行了表示,能夠在儘可能降低存儲空間的情況下增加指針保留頂點之間的方向性。具體的操作可能一時間不好弄懂,建議多看幾次上圖,弄清指針指向的意義,明白正向和逆向鄰接表的表示。


 10  總結


數據結構博大精深,沒有高等數學的諱莫如深,也沒有量子力學的玄乎其神,但是其在計算機科學的各個領域都具有強大的力量。本文試圖採用圖解的方式對九種數據結構進行理論上的介紹,但是其實這都是不夠的。

即便是簡單的數組、棧、隊列等結構,在實際使用以及底層實現上都會有許多優化設計以及使用技巧,這意味著還需要真正把它們靈活的用起來,才能夠算是真正意義上的熟悉和精通。但是本文可以作為常見數據結構的一個總結,當你對某些結構有些淡忘的時候,不妨重新回來看看。

覺得本文有幫助?請分享給更多人

關注「算法愛好者」加星標,修煉編程內功

好文章,我在看❤️

相關焦點

  • 圖解!24 張圖徹底弄懂九大常見數據結構!
    常用的數據結構可根據數據訪問的特點分為線性結構和非線性結構。線性結構包括常見的鍊表、棧、隊列等,非線性結構包括樹、圖等。數據結構種類繁多,本文將通過圖解的方式對常用的數據結構進行理論上的介紹和講解,以方便大家掌握常用數據結構的基本知識。
  • 圖解!一文徹底弄懂九大常見數據結構!
    數據結構想必大家都不會陌生,對於一個成熟的程式設計師而言,熟悉和掌握數據結構和算法也是基本功之一。數據結構本身其實不過是數據按照特點關係進行存儲或者組織的集合,特殊的結構在不同的應用場景中往往會帶來不一樣的處理效率。常用的數據結構可根據數據訪問的特點分為線性結構和非線性結構。
  • 【抱佛腳必備】18張圖帶你徹底搞定面試要考的數據結構!
    來源 | https://github.com/reng99/blogs數據結構是計算機存儲、組織數據的方式。數據結構是指相互直接存在一種或多種特殊關係的數據元素的集合。通常情況下,精心選擇數據結構可以帶來更高的運行或者存儲效率。作為一名程序猿,更需要了解下數據結構。
  • 9張圖幫你了解常見色彩心理學
    9張圖幫你了解常見色彩心理學9張圖幫你了解常見色彩心理學9張圖幫你了解常見色彩心理學9張圖幫你了解常見色彩心理學9張圖幫你了解常見色彩心理學9張圖幫你了解常見色彩心理學9張圖幫你了解常見色彩心理學9張圖幫你了解常見色彩心理學9張圖幫你了解常見色彩心理學
  • 多圖,一文了解 8 種常見的數據結構
    對於他的觀點,我不能再苟同了——所以我開始狂補計算機方面的基礎知識,這其中就包括我相對薄弱的數據結構。百度百科對數據結構的定義是:相互之間存在一種或多種特定關係的數據元素的集合。定義很抽象,需要大聲地朗讀幾遍,才有點感覺。怎麼讓這種感覺來得更強烈,更親切一些呢?我來列舉一下常見的 8 種數據結構,數組、鍊表、棧、隊列、樹、堆、圖、哈希表。
  • 「圖解」一張圖弄懂英語句子成分和句式
    本文就以思維導圖為工具,將英語句子結構進行邏輯梳理,希望對學習英語的你有所幫助。下圖所示為英語語法中,句子成分和句式的邏輯關係。英語句子成分和句式圖解其中,句子的組成元素:指構成句子的基本單位。仍然拿建築打比方,複雜句就像是一個別墅,一個大別墅一般都有多個低層聯排住宅,將多個房間組合在一起,既有聯繫(有共同的地基,共同組成別墅),又有區別(每個房間有自己的屋頂,具有相對獨立性)。如下圖:
  • 大數據常見面試題之數據倉庫
    Analytical Processing)是數據倉庫系統的主要應用,支持複雜的分析操作,側重決策支持,並且提供直觀易懂的查詢結果.典型的應用就是複雜的動態報表系統-1)實時性要求不是很高,很多應用的頂多是每天更新一下數據-2)數據量大,因為OLAP支持的是動態查詢,所以用戶也許要通過很多數據的統計後才能得到想要的信息,例如時間序列分析等,所以處理的數據量很大
  • 14張圖搞定高中英語詞綴和詞根!弄懂這些單詞更好背!
    新東方網>英語>英語學習>高中英語>正文14張圖搞定高中英語詞綴和詞根!弄懂這些單詞更好背!今天,分享給大家高中英語常見的所有詞根、詞綴匯總,希望對你的英語學習有幫助!
  • 圖解| 13張圖帶你速覽政法工作條例
    圖解 | 13張圖帶你速覽政法工作條例 2019-03-04 17:33 來源:澎湃新聞·澎湃號·政務
  • 前端學習數據結構與算法系列(一):初識數據結構與算法
    什麼是數據結構數據存儲於內存時,決定了數據順序和位置關係的便是「數據結構」數據結構一般分為兩個維度:邏輯結構和存儲結構邏輯結構邏輯結構即數據之間的關係,邏輯結構可以分為兩種:線性結構和非線性結構常見的非線性結構有:二維數組、樹等存儲結構邏輯結構指的是數據間的關係,而存儲結構是邏輯結構用計算機語言的實現。常見的存儲結構有:順序存儲、鏈式存儲、索引存儲、散列存儲。
  • 大數據時代人民網可視化數據新聞研究
    (2)選題題材和範圍 根據選取的一百個樣本的內容,將新聞選題分類成常見的七個部分:時政、社會、民生、環境、教育、軍事和科技,然後統計每類新聞的篇目。選題範圍主要限定在國內和國際兩大部分,可以體現人民網數據新聞的全球化視野。
  • 汽車行駛系統——輪胎的結構全面圖解
    汽車行駛系統——彈簧減震器結構圖解汽車行駛系統——車輪和車輞結構圖解汽車行駛系統——輪胎的結構全面圖解汽車傳動系統——傳動系的種類圖解 汽車傳動系統——離合器總成結構圖解
  • 圖解十大經典機器學習算法入門
    下圖是一部典型的智慧型手機上安裝的一些常見應用程式,可能很多人都猜不到,人工智慧技術已經是手機上很多應用程式的核心驅動力。圖解十大經典的機器學習算法圖2 決策樹原理示意圖隨機森林在源數據中隨機選取數據,組成幾個子集:
  • 圖解靜力學:一種融合形與力的結構分析方法
    在二十世紀初,鋼筋混凝土結構快速發展的時期,由於計算理論落後於實踐需求,圖解靜力學和模型試驗成為一種主要的結構設計方法。今天,由特約作者「MXC」介紹圖解靜力學,這種有著悠久歷史的結構分析方法。Graphic Statics,是一門用矢量圖形求解靜力學的方法,翻譯為「圖解靜力學」。
  • 尚矽谷Java數據結構與算法、設計模式教程雙雙發布
    算法是程序的靈魂,優秀的程序在對海量數據處理時,依然保持高速計算,就需要高效的數據結構和算法支撐。網上數據結構和算法的教程不少,但存在兩個問題:(1) 授課方式單一,大多是照著代碼念一遍,數據結構和算法本身就比較難理解,對基礎好的學員來說,還好一點,對基礎不好的學生來說,基本上就是聽天書了。
  • 《大話數據結構》pdf下載
    以一個計算機教師教學為場景,講解數據結構和相關算法的知識。通篇以一種趣味方式來敘述,大量引用了各種各樣的生活知識來類比,並充分運用圖形語言來體現抽象內容,對數據結構所涉及到的一些經典算法做到逐行分析、多算法比較。與市場上的同類數據結構圖書相比,本書內容趣味易讀,算法講解細緻深刻,是一本非常適合自學的讀物。本書以一個計算機教師教學為場景,講解數據結構和相關算法的知識。通篇?
  • 快速入門數據結構和算法
    阿里妹導讀:有哪些常見的數據結構?基本操作是什麼?常見的排序算法是如何實現的?各有什麼優缺點?
  • 汽車傳動系統——各類傳動的結構圖解
    汽車行駛系統——彈簧減震器結構圖解汽車行駛系統——車輪和車輞結構圖解汽車行駛系統——輪胎的結構全面圖解汽車傳動系統——傳動系的種類圖解 汽車傳動系統——離合器總成結構圖解
  • 重學數據結構(七、圖)
    圖是一種比線性表和樹更為複雜的數據結構。在線性表中,數據元素之間僅有線性關係,每個數據元素只有一個直接前驅和一個直接後繼;在樹形結構中,數據元素之間有著明顯的層次關係,並且每一層中的數據元素可能和下一層中的多個元素(即其孩子結點)相關,但只能和上一層中一個元素(即其雙親結點)相關; 而在圖結構中,結點之間的關係可以是任意的,圖中任意兩個數據元素之間都可能相關。
  • 【第3篇 | 數據結構與算法】一舉消滅十大常見(常考)排序算法(原理+動圖+代碼+)
    作者:書偉時間:2020/4/28數據結構與算法 | 系列第0篇 | 不會數據結構與算法的碼農有多牛?第1篇 | 算法複雜度分析(必會)第2篇 | 一文複習完7種數據結構(原理+代碼)正文共計6000+字,19張講解算法圖片,14張代碼截圖,所有代碼均可在筆者的GitHub(https://github.com/econe-zhangwei