? ?1、 數(shù)組(Arrary)
? ? ? ? ? ? ? ? 數(shù)組是一種線性結(jié)構(gòu)的數(shù)據(jù),連續(xù)的存儲(chǔ)空間和相同的類型數(shù)據(jù)。查詢速度快,但是數(shù)組的容量固定,無(wú)法擴(kuò)容,只能存儲(chǔ)同類型的數(shù)據(jù),對(duì)于添加和刪除元素比較慢
? ? ? ? 2、棧(Stark)
? ? ? ? ? ? ? ? 棧是一種先進(jìn)后出的一種結(jié)構(gòu),好比水桶。例如虛擬機(jī)棧,方法棧等
? ? ? ? 3、鏈表(Linked List)
? ? ? ? ? ? ? ? 鏈表是一種線性的鏈?zhǔn)浇Y(jié)構(gòu),鏈表的內(nèi)存不是連續(xù)的,前一個(gè)節(jié)點(diǎn)存儲(chǔ)的地址不一定就是一個(gè)元素,可能是一個(gè)引用,通過(guò)這個(gè)引用可以拿到對(duì)應(yīng)的對(duì)象。鏈表是通過(guò)一個(gè)節(jié)點(diǎn)指向另一個(gè)節(jié)點(diǎn)的地址將元素串起來(lái)。
? ? ? ? ? ? ? ? 單向鏈表:最簡(jiǎn)單的鏈表格式。鏈表的最小單元為節(jié)點(diǎn),每一個(gè)節(jié)點(diǎn)包含了數(shù)據(jù)和指向下一個(gè)節(jié)點(diǎn)的指針。
? ? ? ? ? ? ? ? 雙向鏈表:兩個(gè)方向的鏈表。鏈表的每個(gè)節(jié)點(diǎn)包含了數(shù)據(jù)以及前一個(gè)節(jié)點(diǎn)地址的指針和后一個(gè)節(jié)點(diǎn)的地址指針。這種數(shù)據(jù)結(jié)構(gòu)的好處是通過(guò)當(dāng)前節(jié)點(diǎn)可以通過(guò)時(shí)間復(fù)雜度o(1)很快定位到前置節(jié)點(diǎn)和后置節(jié)點(diǎn),但是通過(guò)前置指針和后置指針的配置增加了內(nèi)存的消耗。
? ? ? ? ? ? ? ? 循環(huán)鏈表:跟雙向列表差不多,但是唯一的區(qū)別就是尾節(jié)點(diǎn)的后置指針指向頭節(jié)點(diǎn),頭節(jié)點(diǎn)也有指針指向了尾節(jié)點(diǎn)。
? ? ? ? 3、哈希(Hash)
? ? ? ? ? ? ? ? 哈希也叫做散列。通過(guò)key-vlue的方式存儲(chǔ),在很大程度上提高了數(shù)據(jù)的查詢,增加和刪除。hash結(jié)合數(shù)組和鏈表的特性(數(shù)組查詢快,鏈表增刪快)。
? ? ? ? ? ? ? ? Java最經(jīng)典的HashMap的底層實(shí)現(xiàn)是數(shù)組+鏈表+紅黑樹(shù)
? ? ? ? ? ? ? ? hash函數(shù)在hash表中起到至關(guān)重要作用,數(shù)據(jù)通過(guò)hash函數(shù)生成一個(gè)固定的hash值,通過(guò)hash值可以很快的定位到元素。但是hash值不是唯一的,就將hash值相同的放入鏈表中,如果鏈表的長(zhǎng)度超過(guò)8,或者大小超過(guò)64,就將鏈表轉(zhuǎn)化為紅黑樹(shù)。
? ? ? ? 4、隊(duì)列(Queue)
? ? ? ? ? ? ? ? 隊(duì)列是特殊的線性結(jié)構(gòu),一種先進(jìn)先出的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)的刪除操作只能在頭部操作,插入在尾部操作。
? ? ? ? 5、樹(shù)(Tree)
? ? ? ? ? ? ? ? 樹(shù)是一種線性結(jié)構(gòu),有節(jié)點(diǎn)組成的集合。
? ? ? ? ? ? ? ? 二叉樹(shù):每一個(gè)節(jié)點(diǎn)最多有兩個(gè)子樹(shù)
? ? ? ? ? ? ? ? 完全二叉樹(shù):除了最外層節(jié)點(diǎn),其他的節(jié)點(diǎn)都達(dá)到最大的層數(shù)
? ? ? ? ? ? ? ? 滿二叉樹(shù):一個(gè)樹(shù)的節(jié)點(diǎn)要么是葉子節(jié)點(diǎn),要么就是有兩個(gè)節(jié)點(diǎn)
? ? ? ? ? ? ? ? 平衡二叉樹(shù):任何節(jié)點(diǎn)的子樹(shù)高度差不超過(guò)1;
? ? ? ? ? ? ? ? 二叉查找樹(shù):任意節(jié)點(diǎn)的左子樹(shù)都不能為空,并且左子樹(shù)所有節(jié)點(diǎn)的值都小于根節(jié)點(diǎn);任意節(jié)點(diǎn)的右子樹(shù)不能為空,并且右子樹(shù)所有節(jié)點(diǎn)的值都大于根節(jié)點(diǎn);任意節(jié)點(diǎn)的左右子樹(shù)都是一個(gè)二叉查找樹(shù)。
? ? ? ? ? ? ? ? B樹(shù):一種堆讀寫(xiě)優(yōu)化的自平衡二叉樹(shù),在數(shù)據(jù)庫(kù)索引的常用索引數(shù)據(jù)的結(jié)構(gòu)。
? ? ? ? ? ? ? ? B+樹(shù):所有非葉子節(jié)點(diǎn)都是索引部分,節(jié)點(diǎn)中僅包含根節(jié)點(diǎn)的最大或者最小的關(guān)鍵字;所有葉子節(jié)點(diǎn)包含了所有關(guān)鍵字的信息以及含有這些關(guān)鍵字記錄的指針,而且葉子節(jié)點(diǎn)數(shù)據(jù)根據(jù)關(guān)鍵節(jié)點(diǎn)的大小從小到大排列;m個(gè)子樹(shù)的中間節(jié)點(diǎn)包含有m個(gè)元素,每個(gè)元素不包含數(shù)據(jù),只包含索引。
? ? ? ? ? ? ? ? 紅黑樹(shù)
? ? ? ? ? ? ? ? 紅黑樹(shù)是一種平衡二叉樹(shù),通過(guò)顏色約束樹(shù)的平衡。每一個(gè)元素要么紅色,要么黑色;根節(jié)點(diǎn)一定是黑色;每個(gè)葉子節(jié)點(diǎn)都是黑色的;如果一個(gè)節(jié)點(diǎn)為紅色,那么他的所有子節(jié)點(diǎn)都是黑色,因?yàn)槊恳粭l路徑上都不能出現(xiàn)相鄰兩個(gè)節(jié)點(diǎn)是同一顏色;每一個(gè)葉子節(jié)點(diǎn)的所有路徑存在的黑色節(jié)點(diǎn)都相同。
? ? ? ? 6、堆(Heap)
? ? ? ? ? ? ? ? 堆是一種特殊的樹(shù)形結(jié)構(gòu),父節(jié)點(diǎn)的值大于等于子節(jié)點(diǎn)的值或者小于子節(jié)點(diǎn)的值。對(duì)于max heap根節(jié)點(diǎn)是所有節(jié)點(diǎn)的最大值 或者min heap根節(jié)點(diǎn)值是所有節(jié)點(diǎn)最小的值。
? ? ? ? 7、圖(Graph)
? ? ? ? ? ? ? ? 一個(gè)圖就是一些頂點(diǎn)的集合,這些頂點(diǎn)通過(guò)一系列邊結(jié)對(duì)(連接)。頂點(diǎn)用圓圈表示,邊就是這些圓圈之間的連線。頂點(diǎn)之間通過(guò)邊連接。
? ? ? ? ? ? ? ? 節(jié)點(diǎn)之間的關(guān)系是任意的,圖中任意兩個(gè)數(shù)據(jù)元素之間都有可能相關(guān)。