配對堆

配對堆是一種實現簡單 、 均攤複雜度優越的堆數據結構 ， 由 、 羅伯特 · 塞奇威克 、 、 羅伯特 · 塔揚於1986年發明 。 配對堆是一種多叉樹 ， 並且可以被認爲是一種簡化的斐波那契堆 。 對於實現例如普林姆最小生成樹算法等算法 ， 配對堆是一個更優的選擇 ， 且支持以下操作 （ 假設該堆是最小堆 ） ： find - min （ 查找最小值 ） ： 返回堆頂 。 merge （ 合併 ） ： 比較兩個堆頂 ， 將堆頂較大的堆設爲另一個的孩子 。 insert （ 插入 ） ： 創建一個只有一個元素的堆 ， 併合並至原堆中 。 decrease - key （ 減小元素 ） （ 可選 ） ： 將以該節點爲根的子樹移除 ， 減小其權值 ， 併合並回去 。 delete - min （ 刪除最小值 ） ： 刪除根並將其子樹合併至一起 。 這裏有各種不同的方式 。 配對堆時間複雜度的分析靈感來源於伸展樹 。 其delete - min操作的時間複雜度爲 ， 而find - min 、 merge和insert操作的均攤時間複雜度均爲 。 確定配對堆每次進行decrease - key操作的均攤時間複雜度是困難的 。 最初 ， 基於經驗 ， 這個操作的時間複雜度被推測爲是 ， 但證明了對於某些操作序列 ， 每次decrease - key操作的時間複雜度至少爲 。 在那之後 ， 通過不同的均攤依據 ， Pettie證明了insert 、 merge及decrease - key操作的均攤時間複雜度均爲 ， 近似於 。 Elmasry後來介紹了一種配對堆的變體 ， 令其擁有所有斐波那契堆可以實現的操作 ， 且decrease - key操作的均攤時間複雜度爲 ， 但對於原始的數據結構 ， 仍未知準確的運行下限 。 此外 ， 能否使delete - min在均攤時間複雜度爲的同時 ， 令insert操作的均攤時間複雜度爲 ， 目前也仍未得到解決 。 儘管這比其他的 ， 例如能實現均攤時間的decrease - key的斐波那契堆 ， 這樣的優先隊列算法更差 ， 在實踐中配對堆的表現仍然很不錯 。 Stasko和Vitter ， Moret和Shapiro ， 以及Larkin 、 Sen和Tarjan 進行過配對堆和其他堆數據結構的實驗 。 他們得出的結論是, 配對堆通常比基於數組的二叉堆和D叉堆的實際操作速度更快 ， 而且在實踐中幾乎總是比其他基於指針的堆更快 ， 其中包括諸如斐波納契堆這樣的理論上更有效率的數據結構 。