常用數(shù)據(jù)結(jié)構(gòu)對(duì)比及其應(yīng)用場(chǎng)景

目錄

  • 1.各種表的對(duì)比
    參考基本數(shù)據(jù)結(jié)構(gòu)ADT及其實(shí)現(xiàn)
    1.1 三種表
    1.2 表的兩種實(shí)現(xiàn)(數(shù)組宋距、鏈表)之間的對(duì)比
    1.3 棧和隊(duì)列的應(yīng)用
  • 2.有序數(shù)組的二分查找附鸽、查找樹(搜索樹)尝盼、跳躍表之間的關(guān)系
    2.1 有序數(shù)組的二分查找、二叉搜索樹與跳躍表
    參考查找樹(搜索樹)
    ??2.1.1 三者的本質(zhì)是一樣——快速索引中間元素
    ??2.1.2 來看看二叉搜索樹和跳躍表的定義
    2.2 普通二叉搜索樹、伸展樹與各種平衡搜索樹
    ??2.2.1 普通二叉搜索樹——保證平均情況O(lgn)
    ??2.2.2 伸展樹——保證攤還代價(jià)為O(lgn)
    ??2.2.3 平衡搜索樹——帶有平衡條件的二叉搜索樹(使得樹高最壞情況下為O(lgn))
    2.3 紅黑樹丈氓、1-2-3確定性跳躍表與2-3-4樹及2-3樹
    參考紅黑樹專題
    ??2.3.1 2-3樹
    ??2.3.2 2-3-4樹
    ??2.3.3 基于2-3樹的左傾紅黑樹
    ??2.3.4 基于2-3-4樹的左傾紅黑樹
    ??2.3.5 1-2-3確定性跳躍表與2-3-4樹
    ??參考隨機(jī)算法中的跳躍表
    2.4 二叉搜索樹與B樹
    參考查找樹(搜索樹)中的B樹
  • 3.各種查找數(shù)據(jù)結(jié)構(gòu)的對(duì)比
    3.1 對(duì)比
    3.2 各種查找數(shù)據(jù)結(jié)構(gòu)的應(yīng)用
    ??3.2.1 紅黑樹的應(yīng)用
    ??3.2.2 B/B+樹的應(yīng)用
    ??3.2.3 Trie樹(字典樹)的應(yīng)用
    ??3.2.4 radix樹的應(yīng)用
    ??3.2.5 哈希算法的應(yīng)用
  • 4.各種堆(優(yōu)先隊(duì)列)之間的對(duì)比
    參考優(yōu)先隊(duì)列——堆
    4.1 堆(優(yōu)先隊(duì)列)與搜索樹之間的對(duì)比
    4.2 各種堆(優(yōu)先隊(duì)列)之間的對(duì)比
    ??4.2.1 二叉堆與d-堆(數(shù)組實(shí)現(xiàn))——合并困難
    ??4.2.2 可合并堆——鏈?zhǔn)浇Y(jié)構(gòu)
    ??4.2.3 van Emde Boas樹——特定條件下突破比較類型堆的限制
    ??4.2.4 配對(duì)堆——結(jié)構(gòu)限制特別少的堆(簡(jiǎn)單性造就了高效率:合并Θ(1)软免,DecreaseKey為O(lgn))
    4.3 堆(優(yōu)先隊(duì)列)的應(yīng)用
    ??4.3.1 帶寬管理(網(wǎng)絡(luò)路由器)
    ??4.3.2 離散事件模擬
    ??4.3.3 Dijkstra算法
    ??4.3.4 Huffman編碼
    ??4.3.5 Best-first搜索算法(比如A*搜索算法)
    ??4.3.6 Prim算法
    ??4.3.7 ROAM triangulation algorithm

1.各種表的對(duì)比

1.1 三種表

  • 普通表
  • 棧是LIFO表(后進(jìn)先出)
  • 隊(duì)列是FIFO表(先進(jìn)先出)

1.2 表的兩種實(shí)現(xiàn)(數(shù)組宫纬、鏈表)之間的對(duì)比

核心本質(zhì)只有一條:就是數(shù)組需要連續(xù)存放,所以需要事先劃定一塊連續(xù)空間大谢蚋堋(提前占有哪怔,以防被占用),這才導(dǎo)致了數(shù)組鏈表的所有區(qū)別向抢。

  • 存放:數(shù)組在連續(xù)存放的认境,鏈表不需要
    因?yàn)榇娣诺倪@個(gè)特性導(dǎo)致了下面的區(qū)別:
    a. 訪問:數(shù)組可以常數(shù)時(shí)間訪問第k個(gè)元素,鏈表需要從前向后遍歷
    b. 插入和刪除:數(shù)組需要移動(dòng)很多元素挟鸠,鏈表常數(shù)時(shí)間即可完成
  • 數(shù)組一般需要確定大小叉信,鏈表是動(dòng)態(tài)分配分配
    因此數(shù)組一般是從棧中分配空間(廣義上的數(shù)組,也可以從堆中獲取艘希,數(shù)組本質(zhì)上只不過是指針的語法糖衣)硼身,鏈表是從堆中分配空間

1.3 棧和隊(duì)列的應(yīng)用

  • 棧的對(duì)用
    平衡符號(hào)(括號(hào)的成對(duì)匹配)
    后綴表達(dá)式
    中綴到后綴的轉(zhuǎn)換
    函數(shù)調(diào)用
  • 隊(duì)列的應(yīng)用
    排隊(duì)論
    任務(wù)隊(duì)列
    在圖論中有大量應(yīng)用
    消息隊(duì)列
    linux內(nèi)核進(jìn)程隊(duì)列(按優(yōu)先級(jí)排隊(duì))

2.有序數(shù)組的二分查找、查找樹(搜索樹)覆享、跳躍表之間的關(guān)系

2.1 有序數(shù)組的二分查找佳遂、二叉搜索樹與跳躍表

2.1.1 三者的本質(zhì)是一樣——快速索引中間元素

  • 對(duì)于一個(gè)靜態(tài)表(不允許插入),對(duì)其在初始化是就排序是值得的撒顿。
    但是現(xiàn)代應(yīng)用需要同時(shí)能夠支持高效的查找和插入兩種操作的數(shù)據(jù)結(jié)構(gòu)(符號(hào)表)丑罪。
  • 怎樣找到這種數(shù)據(jù)結(jié)構(gòu)(符號(hào)表)?
    1)高效插入凤壁,需要鏈?zhǔn)浇Y(jié)構(gòu)
    2)二分查找能夠快速進(jìn)行查找(二分查找的高效來自于能夠快速通過索引取得任何子數(shù)組的中間元素)
    因此將二者結(jié)合起來吩屹,就是二叉查找樹和跳躍表。

2.1.2 來看看二叉搜索樹和跳躍表的定義

  • (直接將中間元素放在根節(jié)點(diǎn))二叉搜索樹中的關(guān)鍵字總是以滿足二叉搜索樹性質(zhì)的方式來存儲(chǔ):
    設(shè)x是二叉搜索樹中的一個(gè)結(jié)點(diǎn)拧抖。如果y是x左子樹中的一個(gè)結(jié)點(diǎn)煤搜,那么y.key <= x.key。如果y是x右子樹中的一個(gè)結(jié)點(diǎn)唧席,那么y.key >= x.key擦盾。


  • (結(jié)點(diǎn)帶有指向中間元素的索引)
    1)k階結(jié)點(diǎn):帶有k個(gè)指針的結(jié)點(diǎn)嘲驾。任意k階上的第i階(i <= k)指針指向的下一個(gè)結(jié)點(diǎn)至少具有i階。
    2)大約有一半的結(jié)點(diǎn)是1階厌衙;大約1/4的結(jié)點(diǎn)是2階距淫;一般的,大約1/2^i的結(jié)點(diǎn)是i階結(jié)點(diǎn)婶希。按照這個(gè)概率分布隨機(jī)選擇結(jié)點(diǎn)的階數(shù)榕暇。最容易的方法是拋一枚硬幣直到正面出現(xiàn)并把拋硬幣的總次數(shù)作為該節(jié)點(diǎn)的階數(shù)。


2.2 普通二叉搜索樹喻杈、伸展樹與各種平衡搜索樹

2.2.1 普通二叉搜索樹——保證平均情況O(lgn)

  • 高度為h的二叉搜索樹彤枢,查找、插入和刪除運(yùn)行時(shí)間均為O(h)筒饰。
    二叉搜索樹(節(jié)點(diǎn)數(shù)為n)最壞情況下缴啡,高度h = n,隨機(jī)構(gòu)造的二叉搜索樹的期望高度為O(lgn)瓷们。

2.2.2 伸展樹——保證攤還代價(jià)為O(lgn)

  • 當(dāng)一個(gè)結(jié)點(diǎn)被訪問后业栅,它就要經(jīng)過一系列AVL樹的旋轉(zhuǎn)被放到根上。
    因?yàn)樵S多應(yīng)用中谬晕,當(dāng)一個(gè)結(jié)點(diǎn)被訪問碘裕,它就很可能不久再次被訪問到,如果碰到O(N)的結(jié)點(diǎn)攒钳,沒有被移動(dòng)帮孔,那么很難得到O(lgN)攤還時(shí)間。
  • 保證從空樹開始任意連續(xù)M次對(duì)數(shù)的操作最多花費(fèi)O(MlogN)不撑。雖然這種保證不排除任意一次操作花費(fèi)O(N)時(shí)間文兢。一棵伸展樹每次操作的攤還代價(jià)是O(logN)。

2.2.3 平衡搜索樹——帶有平衡條件的二叉搜索樹(使得樹高最壞情況下為O(lgn))

  • AVL(Adelson-Velskii和Landis)樹:一棵AVL樹是其每個(gè)結(jié)點(diǎn)的左子樹和右子樹的高度最多差1的二叉查找樹焕檬。(空樹的高度定義為-1)
    在高度為h的AVL樹中姆坚,最少節(jié)點(diǎn)數(shù)S(h)由S(h) = S(h-1) + S(h-2) + 1,由n >= S(h)实愚,可以得到h的最大界旷偿。


  • 一棵紅黑樹是滿足下面紅黑性質(zhì)的二叉搜索樹(本質(zhì)上是基于2-3-4樹的紅黑樹):
    1)每個(gè)結(jié)點(diǎn)或是紅色的,或是黑色的
    2)根節(jié)點(diǎn)是黑色的
    3)每個(gè)葉節(jié)點(diǎn)NIL時(shí)黑色的(這條性質(zhì)可去掉)
    4)如果一個(gè)結(jié)點(diǎn)是紅色的爆侣,則它的兩個(gè)子節(jié)點(diǎn)都是黑色的
    5)對(duì)每個(gè)結(jié)點(diǎn),從該節(jié)點(diǎn)到其所有后代葉節(jié)點(diǎn)的簡(jiǎn)單路徑上幢妄,均包含相同數(shù)目的黑色結(jié)點(diǎn)
    紅黑樹確保沒有一條路徑會(huì)比其他路徑長(zhǎng)處2倍兔仰,因而近似于平衡的。(一條最長(zhǎng)的路徑是黑紅相間蕉鸳,一條最短的是全黑乎赴,但是黑色結(jié)點(diǎn)個(gè)數(shù)是相等的忍法。)


2.3 紅黑樹、1-2-3確定性跳躍表與2-3-4樹及2-3樹

2.3.1 2-3樹

  • 2-3樹是一棵完美平衡的2-3查找樹榕吼,也即根節(jié)點(diǎn)到所有空鏈接都應(yīng)該是相同
  • 2-3樹包含以下結(jié)點(diǎn):
    1)2-結(jié)點(diǎn):含有一個(gè)健和兩條鏈接
    2)3-結(jié)點(diǎn):含有兩個(gè)鍵和三條鏈接



2.3.2 2-3-4樹

  • 2-3-4樹是一棵完美平衡的2-3-4查找樹饿序,也即根節(jié)點(diǎn)到所有空鏈接都應(yīng)該是相同
  • 2-3-4樹包含以下結(jié)點(diǎn):
    1)2-結(jié)點(diǎn):含有一個(gè)健和兩條鏈接
    2)3-結(jié)點(diǎn):含有兩個(gè)鍵和三條鏈接
    3)4-結(jié)點(diǎn):含有三個(gè)鍵和四條鏈接


樹高:

  • 最壞情況lgN(全是2-結(jié)點(diǎn))
  • 最好情況log4N = 1/2lgN(全是4-結(jié)點(diǎn))

2.3.3 基于2-3樹的左傾紅黑樹

基于2-3樹的左傾紅黑樹是含有紅黑鏈接并滿足下列條件的二叉查找樹:

  • 紅鏈接均為左鏈接
  • 沒有任何一個(gè)結(jié)點(diǎn)同時(shí)和兩條紅鏈接相連
  • 該樹是完美黑色平衡的,即任意空連接到根節(jié)點(diǎn)的路徑上黑鏈接數(shù)量相同羹蚣。
  • 鏈接的顏色保存在鏈接的兒子結(jié)點(diǎn)中
對(duì)應(yīng)關(guān)系

對(duì)應(yīng)關(guān)系

2.3.4 基于2-3-4樹的左傾紅黑樹

  • 基于2-3-4樹的左傾紅黑樹中3-結(jié)點(diǎn)和4-結(jié)點(diǎn)具有唯一的對(duì)應(yīng):


  • 如下是不允許:


    不允許右傾

    不允許上下連續(xù)兩個(gè)紅鏈接
  • 因此基于2-3-4樹的左傾紅黑樹和2-3-4樹有唯一的一一對(duì)應(yīng)關(guān)系


2.3.5 1-2-3確定性跳躍表與2-3-4樹

  • 鏈接:如果至少存在一個(gè)指針從一個(gè)元素指向另一個(gè)元素原探,則稱兩個(gè)元素是鏈接的
  • 間隙容量:兩個(gè)在高度為h鏈接的元素間的間隙容量等于他們之間高度為h-1的元素個(gè)數(shù)
  • 1-2-3確定性跳躍表:每一個(gè)間隙(除在頭和尾之間可能的零間隙外)的容量為1、2顽素、3咽弦。

2.4 二叉搜索樹與B樹

  • B樹的結(jié)點(diǎn)可以有很多孩子。B樹以一種自然的方式推廣了二叉搜索樹胁出。
    如果B樹的一個(gè)內(nèi)部結(jié)點(diǎn)x包含x.n個(gè)關(guān)鍵字型型,那么結(jié)點(diǎn)x就有x.n+1個(gè)子域。結(jié)點(diǎn)x中的關(guān)鍵字就是分割點(diǎn)全蝶,它把結(jié)點(diǎn)x中所處理的關(guān)鍵字的屬性分割成x.n+1一個(gè)子域闹蒜,每一個(gè)子域由x的一個(gè)孩子處理。




    一棵包含最小可能關(guān)鍵字的B樹:


3.各種查找數(shù)據(jù)結(jié)構(gòu)的對(duì)比

3.1 對(duì)比


3.2 各種查找數(shù)據(jù)結(jié)構(gòu)的應(yīng)用

3.2.1 紅黑樹的應(yīng)用

  • STL中的map和set的實(shí)現(xiàn)
  • 著名的linux進(jìn)程調(diào)度[Completely Fair Scheduler]抑淫,用紅黑樹管理進(jìn)程控制塊
  • epoll在內(nèi)核中的實(shí)現(xiàn)绷落,用紅黑樹管理事件塊
  • nginx中,用紅黑樹管理timer等
  • Java的TreeMap實(shí)現(xiàn)

3.2.2 B/B+樹的應(yīng)用

  • B和B+主要用在文件系統(tǒng)以及數(shù)據(jù)庫中做索引等丈冬,比如Mysql:B-Tree Index in MySql

3.2.3 Trie樹(字典樹)的應(yīng)用

  • 用在統(tǒng)計(jì)和排序大量字符串嘱函,如自動(dòng)機(jī)
  • trie 樹的一個(gè)典型應(yīng)用是前綴匹配,比如下面這個(gè)很常見的場(chǎng)景埂蕊,在我們輸入時(shí)往弓,搜索引擎會(huì)給予提示
  • IP選路,也是前綴匹配蓄氧,一定程度會(huì)用到trie

3.2.4 radix樹的應(yīng)用

3.2.5 哈希算法的應(yīng)用

hash就是一個(gè)function函似,但不要太狹隘,函數(shù)的輸入不一定得是數(shù)字喉童,它還可以是其它所有的二進(jìn)制數(shù)據(jù)(字符串撇寞、文件等),但必須得有以下特點(diǎn):
1)同一個(gè)輸入一定對(duì)應(yīng)著同一個(gè)輸出堂氯;
2)不同輸入的輸出可能會(huì)一樣蔑担;
下面通過兩個(gè)常見的使用場(chǎng)景解釋可能比較容易理解;

  • 應(yīng)用場(chǎng)景一:構(gòu)建查找表比如在數(shù)據(jù)結(jié)構(gòu)中的hash表咽白,輸入是key啤握,簡(jiǎn)單的function如key/N,輸出是數(shù)組下標(biāo)晶框,但因?yàn)榈诙€(gè)特點(diǎn)排抬,不同key可能會(huì)得到相同的輸出懂从,所以在各類語言中的hashmap庫實(shí)現(xiàn)時(shí),會(huì)針對(duì)的做相應(yīng)處理蹲蒲,比如從沖突的地方繼續(xù)做hash運(yùn)算番甩,直到不沖突為止等;

  • 應(yīng)用場(chǎng)景二:數(shù)字簽名
    本質(zhì)還是一樣届搁,利用hash 的function對(duì)輸入做運(yùn)算缘薛,這些運(yùn)算不局限于上述應(yīng)用的數(shù)字運(yùn)算,還可以有各類位運(yùn)算等咖祭,所以輸入也就不再局限于數(shù)字了掩宜,而是只要是二進(jìn)制數(shù)據(jù)就行,比如字符串么翰、文件等牺汤。雖然輸入、function浩嫌、輸出形式不一樣檐迟,上述的兩個(gè)特點(diǎn)還是成立的。除此之外码耐,為了保證簽名的要求追迟,hash function的設(shè)置者會(huì)針對(duì)性的研究function的實(shí)現(xiàn)方法,以獲得第三個(gè)特點(diǎn):

3)已知輸出骚腥,不可反推得到輸入敦间。

4.各種堆(優(yōu)先隊(duì)列)之間的對(duì)比

參考優(yōu)先隊(duì)列維基百科

4.1 堆(優(yōu)先隊(duì)列)與搜索樹之間的對(duì)比

1)(最大)堆的定義
優(yōu)先隊(duì)列是允許至少下列兩種操作的數(shù)據(jù)結(jié)構(gòu):

  • 1)Insert
  • 2)DeleteMax 找出、返回和刪除優(yōu)先隊(duì)列中最大的元素

并且一般的實(shí)現(xiàn)都以最壞情形O(lgn)支持上面兩個(gè)操作束铭。

2)查找樹的定義
支持SEARCH(Find)廓块、MINIMUM(FindMin)、MAXIMUM(Find Max)契沫、PREDECESSOR带猴、SUCCESSOR、INSERT和DELETE等集合操作懈万。

3)對(duì)比

  • 查找樹可以實(shí)現(xiàn)對(duì)的所有操作拴清,并且平衡查找樹可以實(shí)現(xiàn)最壞情形O(lgn)支持堆的操作(Insert、DeleteMax)
    但是查找樹還提供很多其他堆不需要的操作
  • 查找樹里面的元素是全部有序的会通,而堆只需要時(shí)刻能有效地找出最值口予,因此無需全部有序
    因此堆的實(shí)現(xiàn)可以比查找樹更簡(jiǎn)單

4.2 各種堆(優(yōu)先隊(duì)列)之間的對(duì)比

4.2.1 二叉堆與d-堆(數(shù)組實(shí)現(xiàn))——合并困難

1)二叉堆(數(shù)組實(shí)現(xiàn))

  • 二叉堆是一個(gè)數(shù)組,可以被看成一個(gè)近似的完全二叉樹涕侈。樹上的每一個(gè)結(jié)點(diǎn)對(duì)應(yīng)數(shù)組中的一個(gè)元素苹威。除了最底層外,該樹是完全充滿的驾凶。而且是從左向右填充牙甫。
  • 對(duì)于最大堆而言:最大元應(yīng)該在根上,并且任意子樹也應(yīng)該是一個(gè)最大堆调违。也即窟哺,除了根以外的所有節(jié)點(diǎn)i都要滿足:
    A[Parent(i)] >= A[i]


2)d-堆是二叉堆的簡(jiǎn)單推廣(4-堆勝過二叉堆)

3-堆

4.2.2 可合并堆——鏈?zhǔn)浇Y(jié)構(gòu)

1)二叉堆為什么合并困難?

  • 數(shù)組實(shí)現(xiàn)技肩,合并需要把一個(gè)數(shù)組拷貝到另一個(gè)數(shù)組且轨,花費(fèi)為Θ(n)
  • 所有支持高效合并的數(shù)據(jù)結(jié)構(gòu)都需要使用鏈?zhǔn)浇Y(jié)構(gòu)(鏈表、二叉樹等)虚婿,支持高效合并的可合并堆:
    斜堆
    左式堆
    二項(xiàng)隊(duì)列
    斐波那契堆
    van Emde Boas樹

2)斜堆與左式堆

  • 斜堆:是具有堆序的二叉樹旋奢,但是不存在對(duì)樹的結(jié)構(gòu)限制。不同于左式堆然痊,關(guān)于任意結(jié)點(diǎn)的零路徑長(zhǎng)的任何信息都不保留至朗。斜堆的右路徑在任何時(shí)候都可以任意長(zhǎng)。
    因此所有操作的最壞情形為O(N)剧浸,但是攤還時(shí)間為O(lgn)

  • 左式堆:是具有堆序的二叉樹锹引,對(duì)于堆中的每一個(gè)結(jié)點(diǎn),左兒子的零路徑長(zhǎng)至少與右兒子的零路徑長(zhǎng)一樣大唆香。
    零路徑長(zhǎng):定義為任一結(jié)點(diǎn)到一個(gè)沒有兩個(gè)兒子的結(jié)點(diǎn)的最短路徑長(zhǎng)嫌变。(具有0個(gè)或1個(gè)兒子結(jié)點(diǎn)的零路徑長(zhǎng)尾0,NULL為-1)
    左式堆趨向于加深左路徑躬它,所以右路徑短腾啥。執(zhí)行合并的時(shí)間與右路徑的長(zhǎng)的和成正比。右路徑最長(zhǎng)不超過O(lgn)冯吓,因此合并的(最壞)時(shí)間界為O(lgn)倘待。


  • 斜堆——左式堆
    等價(jià)于
    伸展樹——AVL樹

3)二項(xiàng)隊(duì)列與斐波那契堆——針對(duì)斜堆、左式堆的進(jìn)一步改進(jìn)

  • 斜堆桑谍、左式堆以O(shè)(lgn)時(shí)間支持合并延柠、插入和DeleteMax
    二項(xiàng)隊(duì)列進(jìn)行了改進(jìn):以最壞O(lgn)時(shí)間支持合并、DeleteMax锣披,并且插入平均花費(fèi)常數(shù)時(shí)間贞间。
    二線隊(duì)列是堆序樹(二項(xiàng)樹)的集合,稱為森林雹仿。每一個(gè)高度上至多存在一棵二項(xiàng)樹增热。高度為0的二項(xiàng)樹是一棵單節(jié)點(diǎn)樹;高度為k的二項(xiàng)樹Bk通過將一棵二項(xiàng)樹Bk-1附接到另一棵二項(xiàng)樹Bk-1的根上而構(gòu)成胧辽。

  • 斐波那契堆:是二項(xiàng)隊(duì)列的推廣
    通過添加兩個(gè)新的觀念:
    a. DECREASE-KEY的一種不同的實(shí)現(xiàn)方法:之前的方法是把元素朝向根節(jié)點(diǎn)上濾峻仇。這種方法不能實(shí)現(xiàn)O(1)的攤還時(shí)間界,因此需要一種新的方法邑商。(斐波那契堆是直接剪切掉摄咆,放到根鏈表中)
    b. 懶惰合并:只有當(dāng)兩個(gè)堆需要合并時(shí)才進(jìn)行合并凡蚜。類似于懶惰刪除。對(duì)于懶惰合并吭从,合并是低廉的朝蜘。但是因?yàn)閼卸韬喜⒉⒉粚?shí)際把樹結(jié)合在一起,所以DeleteMax操作可能會(huì)遇到很多樹涩金,從而使得這種操作的代價(jià)高昂谱醇。 特別地,一次昂貴DeleteMax必須在其前面要有大量非常低廉的合并操作


  • 斐波那契堆與二叉堆時(shí)間對(duì)比


4.2.3 van Emde Boas樹——特定條件下突破比較類型堆的限制

  • 基于比較的各種堆有時(shí)間界
    二叉堆步做、紅黑樹副渴、斐波那契堆,不論是最壞或攤還情況全度,至少有一項(xiàng)重要操作需O(lgn)時(shí)間煮剧。
    原因是這些數(shù)據(jù)結(jié)構(gòu)都是基于關(guān)鍵字比較來做決定的∷显兀基于比較的排序算法的下界是Ω(nlgn)說明至少有一個(gè)操作必須Ω(lgn)轿秧。因?yàn)槿绻鸌NSERT和EXTRACT-MIN操作均需要O(lgn),那么可以通過先執(zhí)行n次INSERT操作咨堤,接著再執(zhí)行n次EXTRACT-MIN操作來實(shí)現(xiàn)O(nlgn)時(shí)間內(nèi)對(duì)n個(gè)關(guān)鍵字的排序菇篡。

  • 突破基于比較排序堆的是界——線性時(shí)間排序的啟發(fā)
    當(dāng)關(guān)鍵字是有界范圍內(nèi)的整數(shù)是,可以突破排序下界限制一喘。
    同理驱还,van Emde Boas樹支持優(yōu)先隊(duì)列操作以及一些其他操作(SEARCH、INSERT凸克、DELETE议蟆、MINIMUM、MAXIMUM萎战、SUCESSOR咐容、PREDECESSOR),每個(gè)操作最壞情況運(yùn)行時(shí)間為O(lglgn)蚂维。
    前提是:這種數(shù)據(jù)結(jié)構(gòu)限制關(guān)鍵字為0~n-1的整數(shù)且無重復(fù)戳粒。

  • van Emde Boas樹的關(guān)鍵思想
    1)直接尋址
    維護(hù)一個(gè)u位的數(shù)組A[0..u-1],以存儲(chǔ)一個(gè)值來自全域{0, 1, 2, ..., u-1}的動(dòng)態(tài)集合虫啥。若值x屬于動(dòng)態(tài)集合蔚约,則A[x]位1;否則為0.
    2)疊加二叉樹結(jié)構(gòu)
    在位向量上疊加一棵二叉樹涂籽,來縮短位向量的掃描苹祟。內(nèi)部節(jié)點(diǎn)存儲(chǔ)的位是其兩個(gè)孩子的邏輯或。
    3)疊加的二叉樹結(jié)構(gòu)是遞歸結(jié)構(gòu),每次遞歸都以平方根大小縮減全域
    4)并且一棵vEB樹中含有兩個(gè)屬性:
    min存儲(chǔ)vEB樹中的最小元素(該元素不出現(xiàn)在任何子遞歸樹中)树枫;
    max存儲(chǔ)vEB樹中的最大元素直焙。





    如下實(shí)例,表示集合{2,3,4,5,7,14,15}:



    image.png

4.2.4 配對(duì)堆——結(jié)構(gòu)限制特別少的堆(簡(jiǎn)單性造就了高效率:合并Θ(1)砂轻,DecreaseKey為O(lgn))

配對(duì)堆的基本操作是兩個(gè)多路堆序樹的合并箕般,因此叫配對(duì)堆。
配對(duì)堆被標(biāo)示成堆序樹:



結(jié)點(diǎn)的構(gòu)造:

  • LeftChild —— 左兒子
  • NextSibling —— 右兄弟
  • Prev —— 作為最左兒子舔清,該指針指向其父親;否則該指針指向其做兄弟

4.3 堆(優(yōu)先隊(duì)列)的應(yīng)用

4.3.1 帶寬管理(網(wǎng)絡(luò)路由器)

4.3.2 離散事件模擬

4.3.3 Dijkstra算法

4.3.4 Huffman編碼

4.3.5 Best-first搜索算法(比如A*搜索算法)

4.3.6 Prim算法

4.3.7 ROAM triangulation algorithm

ROAM——Real-time Optimally Adapting Meshes

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末曲初,一起剝皮案震驚了整個(gè)濱河市体谒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌臼婆,老刑警劉巖抒痒,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異颁褂,居然都是意外死亡故响,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門颁独,熙熙樓的掌柜王于貴愁眉苦臉地迎上來彩届,“玉大人,你說我怎么就攤上這事誓酒≌寥洌” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵靠柑,是天一觀的道長(zhǎng)寨辩。 經(jīng)常有香客問我,道長(zhǎng)歼冰,這世上最難降的妖魔是什么靡狞? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮隔嫡,結(jié)果婚禮上甸怕,老公的妹妹穿的比我還像新娘。我一直安慰自己畔勤,他們只是感情好蕾各,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著庆揪,像睡著了一般式曲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天吝羞,我揣著相機(jī)與錄音兰伤,去河邊找鬼谱秽。 笑死戚长,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的胞谭。 我是一名探鬼主播恨溜,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼符衔,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了糟袁?” 一聲冷哼從身側(cè)響起判族,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎项戴,沒想到半個(gè)月后形帮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡周叮,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年辩撑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仿耽。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡合冀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出氓仲,到底是詐尸還是另有隱情水慨,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布敬扛,位于F島的核電站晰洒,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏啥箭。R本人自食惡果不足惜谍珊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望急侥。 院中可真熱鬧砌滞,春花似錦、人聲如沸坏怪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽铝宵。三九已至打掘,卻和暖如春华畏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背尊蚁。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工亡笑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人横朋。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓仑乌,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親琴锭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子晰甚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345