堆之左偏樹

2021-09-10 19:48:47 字數 1132 閱讀 1632

左偏樹(左偏堆),優勢:兩個左偏樹合併效率高o(logn)

外結點:乙個結點的孩子數不滿兩個,就稱之為外結點。

距離(dist):每個節點上有個距離(dist)的屬性,dist的值為該結點到最近的外結點所經過的邊的個數。外結點的dist=0。空結點的dist=-1。

左偏樹定義:

1.是一顆二叉樹。

2.是個堆。

3.每個節點的左節點的dist >=右結點dist

根據定義,易得

左偏樹性質:

節點的鍵值小於或等於它的左右子節點的鍵值。(堆性質)

節點的左子節點的距離不小於右子節點的距離。(左偏性質)

節點的距離等於它的右子節點的距離加1。

一棵n個節點的左偏樹root節點的距離最多為floor(log(n+1))-1。(完全二叉樹時最多)

左偏樹合併:複雜度是o(logn)

//左偏樹合併

struct node

//大致思路如下,寫起來十分簡單。

node *ltreemerge(node *a,node *b)

node *merge(node *a,node *b)

return a;

}

左偏樹的構建:

1.通用方法,節點乙個個插入。

時間複雜度 = log1+log2+log3...logn = o(nlogn)

2.和構建霍夫曼樹很像,將候選節點視為n個左偏樹,盡量選取dist最小的兩個左偏樹合併。可以通過佇列實現。

時間複雜度 = o(n) 證明略了,之後會專門寫一篇部落格,講一下時間複雜度的計算。

左偏樹的插入,刪除:

都可以看作是左偏樹合併,此處不在贅述。

簡述一下左偏樹的意義:

左偏樹合併的時候其實就是遍歷根到最近的外部節點的過程。因為左偏樹的結構保證了右節點dist比左結點,所以不會出現普通堆合併的極端情況:右子樹極長,合併耗時接近o(n)。

每次合併的時間複雜度在o(1)~o(logn)的區間內,o(1)時,是根結點dist為0時出現。o(logn)時,是完全二叉樹時出現。

優勢:1.左偏樹的作用就是相對快速的堆合併,當然,它並不是最快的堆合併的資料結構,也有合併複雜度為o(1)的。

2.左偏樹實現十分簡單。

可並堆之左偏樹

可並堆 mergeable heap 是一類抽象資料型別,它除了支援一般的優先佇列的基本操作以外,還支援額外的合併操作。而可並堆有多種,包括斜堆,左偏樹,二項堆,配對堆,斐波那契堆等。這裡我們只介紹左偏樹 leftist tree 它是最常用的一種可並堆。至於為什麼說最常用,我們會在後面講到。先挖個...

可並堆之左偏樹總結

左偏樹,顧名思義,是左邊的結點權值較大的樹形資料結構。主要用於兩個優先佇列的快速合併,是可並堆的一種實現方式。定義與性質 外結點 乙個結點的右子結點為空就為外結點 距離 結點一直向右,直到外結點所經歷的步數,每個結點距離等於右兒子的距離 1。左偏樹的父親結點的優先順序高於兒子結點 父親結點的左子節點...

左偏樹(可並堆)

左偏樹其實是一種可並堆,它可以 o log2 n o l og2n 合併兩個堆。那左偏?也就是說他左邊肯定有什麼東西比右邊大 別著急,在左偏樹上有乙個叫距離的東西 個點的距離,被定義為它子樹中離他最近的外節點到這個節點的距離 這與樹的深度不同 其中我們定義乙個節點為外節點,當且僅當這個節點的左子樹和...