姓名:楊嘉儀
學號:20021210658
轉載自:https://blog.csdn.net/yeyazhishang/article/details/82353846
【嵌牛導讀】
本文介紹了數(shù)組冻璃,棧手销,鏈表裳凸,隊列,樹,圖通熄,堆耙旦,散列表等八大數(shù)據(jù)結構脱羡。
【嵌牛鼻子】
數(shù)據(jù)結構
【嵌牛正文】
數(shù)據(jù)結構分類
數(shù)據(jù)結構是指相互之間存在著一種或多種關系的數(shù)據(jù)元素的集合和該集合中數(shù)據(jù)元素之間的關系組成 锉罐。
常用的數(shù)據(jù)結構有:數(shù)組绕娘,棧,鏈表险领,隊列,樹绢陌,圖,堆臭笆,散列表等,如圖所示:
每一種數(shù)據(jù)結構都有著獨特的數(shù)據(jù)存儲方式耗啦,下面為大家介紹它們的結構和優(yōu)缺點帜讲。
數(shù)組是可以再內存中連續(xù)存儲多個元素的結構似将,在內存中的分配也是連續(xù)的,數(shù)組中的元素通過數(shù)組下標進行訪問在验,數(shù)組下標從0開始。例如下面這段代碼就是將數(shù)組的第一個元素賦值為 1腋舌。
int[] data = new int[100];data[0] = 1;
優(yōu)點:
1赞辩、按照索引查詢元素速度快
2授艰、按照索引遍歷數(shù)組方便
缺點:
1、數(shù)組的大小固定后就無法擴容了
2淮腾、數(shù)組只能存儲一種類型的數(shù)據(jù)
3、添加洲押,刪除的操作慢圆凰,因為要移動其他的元素。
適用場景:
頻繁查詢送朱,對存儲空間要求不大干旁,很少增加和刪除的情況。
2回怜、棧
棧是一種特殊的線性表换薄,僅能在線性表的一端操作,棧頂允許操作轻要,棧底不允許操作。 棧的特點是:先進后出冲泥,或者說是后進先出壁涎,從棧頂放入元素的操作叫入棧志秃,取出元素叫出棧。
棧的結構就像一個集裝箱竟坛,越先放進去的東西越晚才能拿出來钧舌,所以,棧常應用于實現(xiàn)遞歸功能方面的場景延刘,例如斐波那契數(shù)列。
3驾荣、隊列
隊列與棧一樣普泡,也是一種線性表,不同的是撼班,隊列可以在一端添加元素,在另一端取出元素砰嘁,也就是:先進先出。從一端放入元素的操作稱為入隊矮湘,取出元素為出隊,示例圖如下:
使用場景:因為隊列先進先出的特點磕蛇,在多線程阻塞隊列管理中非常適用十办。
4、鏈表
鏈表是物理存儲單元上非連續(xù)的呵燕、非順序的存儲結構炸枣,數(shù)據(jù)元素的邏輯順序是通過鏈表的指針地址實現(xiàn)弄唧,每個元素包含兩個結點霍衫,一個是存儲元素的數(shù)據(jù)域 (內存空間),另一個是指向下一個結點地址的指針域澄干。根據(jù)指針的指向柠傍,鏈表能形成不同的結構,例如單鏈表惧笛,雙向鏈表,循環(huán)鏈表等拜效。
鏈表的優(yōu)點:
鏈表是很常用的一種數(shù)據(jù)結構各谚,不需要初始化容量,可以任意加減元素赴穗;
添加或者刪除元素時只需要改變前后兩個元素結點的指針域指向地址即可膀息,所以添加,刪除很快潜支;
缺點:
因為含有大量的指針域,占用空間較大毁腿;
查找元素需要遍歷鏈表來查找已烤,非常耗時妓羊。
適用場景:
數(shù)據(jù)量較小,需要頻繁增加躁绸,刪除操作的場景
5臣嚣、樹
樹是一種數(shù)據(jù)結構剥哑,它是由n(n>=1)個有限節(jié)點組成一個具有層次關系的集合。把它叫做 “樹” 是因為它看起來像一棵倒掛的樹株婴,也就是說它是根朝上,而葉朝下的困介。它具有以下的特點:
每個節(jié)點有零個或多個子節(jié)點;
沒有父節(jié)點的節(jié)點稱為根節(jié)點座哩;
每一個非根節(jié)點有且只有一個父節(jié)點;
除了根節(jié)點外姜骡,每個子節(jié)點可以分為多個不相交的子樹缠诅;
在日常的應用中,我們討論和用的更多的是樹的其中一種結構士败,就是二叉樹。
二叉樹是樹的特殊一種谅将,具有如下特點:
1重慢、每個結點最多有兩顆子樹,結點的度最大為2隅熙。
2核芽、左子樹和右子樹是有順序的,次序不能顛倒轧简。
3、即使某結點只有一個子樹哮独,也要區(qū)分左右子樹察藐。
二叉樹是一種比較有用的折中方案舟扎,它添加,刪除元素都很快浸须,并且在查找方面也有很多的算法優(yōu)化邦泄,所以,二叉樹既有鏈表的好處肌索,也有數(shù)組的好處特碳,是兩者的優(yōu)化方案,在處理大批量的動態(tài)數(shù)據(jù)方面非常有用午乓。
擴展:
二叉樹有很多擴展的數(shù)據(jù)結構,包括平衡二叉樹梢灭、紅黑樹蒸其、B+樹等,這些數(shù)據(jù)結構二叉樹的基礎上衍生了很多的功能摸袁,在實際應用中廣泛用到,例如mysql的數(shù)據(jù)庫索引結構用的就是B+樹蜂大,還有HashMap的底層源碼中用到了紅黑樹蝶怔。這些二叉樹的功能強大,但算法上比較復雜,想學習的話還是需要花時間去深入的察迟。
6耳高、散列表
散列表所踊,也叫哈希表,是根據(jù)關鍵碼和值 (key和value) 直接進行訪問的數(shù)據(jù)結構碌燕,通過key和value來映射到集合中的一個位置继薛,這樣就可以很快找到集合中的對應元素。
記錄的存儲位置=f(key)
這里的對應關系f成為散列函數(shù)遏考,又稱為哈希 (hash函數(shù)),而散列表就是把Key通過一個固定的算法函數(shù)既所謂的哈希函數(shù)轉換成一個整型數(shù)字青团,然后就將該數(shù)字對數(shù)組長度進行取余咖楣,取余結果就當作數(shù)組的下標,將value存儲在以該數(shù)字為下標的數(shù)組空間里娃肿,這種存儲空間可以充分利用數(shù)組的查找優(yōu)勢來查找元素瘪松,所以查找的速度很快。
哈希表在應用中也是比較常見的宵睦,就如Java中有些集合類就是借鑒了哈希原理構造的,例如HashMap桐智,HashTable等烟馅,利用hash表的優(yōu)勢,對于集合的查找元素時非常方便的郑趁,然而,因為哈希表是基于數(shù)組衍生的數(shù)據(jù)結構捆憎,在添加刪除元素方面是比較慢的,所以很多時候需要用到一種數(shù)組鏈表來做躲惰,也就是拉鏈法。拉鏈法是數(shù)組結合鏈表的一種結構础拨,較早前的hashMap底層的存儲就是采用這種結構,直到jdk1.8之后才換成了數(shù)組加紅黑樹的結構滔蝉,其示例圖如下:
從圖中可以看出僚焦,左邊很明顯是個數(shù)組,數(shù)組的每個成員包括一個指針立肘,指向一個鏈表的頭名扛,當然這個鏈表可能為空,也可能元素很多融蹂。我們根據(jù)元素的一些特征把元素分配到不同的鏈表中去,也是根據(jù)這些特征超燃,找到正確的鏈表意乓,再從鏈表中找出這個元素约素。
哈希表的應用場景很多,當然也有很多問題要考慮圣猎,比如哈希沖突的問題,如果處理的不好會浪費大量的時間慢显,導致應用崩潰。
7荚藻、堆
堆是一種比較特殊的數(shù)據(jù)結構,可以被看做一棵樹的數(shù)組對象,具有以下的性質:
堆中某個節(jié)點的值總是不大于或不小于其父節(jié)點的值眉撵;
堆總是一棵完全二叉樹。
將根節(jié)點最大的堆叫做最大堆或大根堆罐韩,根節(jié)點最小的堆叫做最小堆或小根堆污朽。常見的堆有二叉堆、斐波那契堆等矾睦。
堆的定義如下:n個元素的序列{k1,k2,ki,…,kn}當且僅當滿足下關系時炎功,稱之為堆枚冗。
(ki <= k2i,ki <= k2i+1)或者(ki >= k2i,ki >= k2i+1), (i = 1,2,3,4…n/2)赁温,滿足前者的表達式的成為小頂堆淤齐,滿足后者表達式的為大頂堆,這兩者的結構圖可以用完全二叉樹排列出來更啄,示例圖如下:
因為堆有序的特點锈死,一般用來做數(shù)組中的排序,稱為堆排序待牵。
8、圖
圖是由結點的有窮集合V和邊的集合E組成偎行。其中,為了與樹形結構加以區(qū)別蛤袒,在圖結構中常常將結點稱為頂點,邊是頂點的有序偶對缴允,若兩個頂點之間存在一條邊珍德,就表示這兩個頂點具有相鄰關系。
按照頂點指向的方向可分為無向圖和有向圖:
圖是一種比較復雜的數(shù)據(jù)結構薄料,在存儲數(shù)據(jù)上有著比較復雜和高效的算法泵琳,分別有鄰接矩陣 、鄰接表谷市、十字鏈表、鄰接多重表蛛倦、邊集數(shù)組等存儲結構歌懒,這里不做展開,讀者有興趣可以自己學習深入溯壶。