乙個配對堆是一棵滿足堆序性質的樹,樹上每個節點儲存其關鍵字、子節點指標、兄弟節點指標和前驅指標。當該節點為其父節點的第乙個兒子,即父節點的子節點指標指向該節點時,該節點的前驅指標指向其父節點;否則該節點的前驅指標指向該節點的前乙個兄弟,即該節點的前驅指標指向的節點的兄弟節點指標指向該節點。
配對堆可以以較高的效率支援合併維護、單元素插入維護、單元素關鍵字減值維護、單最值查詢刪除維護。從經驗上看,配對堆的時間複雜度和斐波那契堆的類似,不過關於此點截止到筆者撰寫本文為止尚未得到理論證明。
對於配對堆的定義**如下:
#define nil -1
struct pairing_heap_node
phdata[max_n];
struct pairing_heap
pairheap[max_n];
將根節點關鍵字較大的配對堆的根節點,作為根節點關鍵字較小的配對堆的根節點的第乙個兒子,更新指標,即可在常數時間內完成合併維護。
對於配對堆的合併維護**如下:
pairing_heap ph_merge(pairing_heap ph1,pairing_heap ph2)
}else
ph0=ph2;
return ph0;
}
在單元素插入維護中,將單元素看作乙個只有乙個元素的配對堆,和待插入的配對堆合併即可。
對於配對堆的單元素插入維護**如下:
int ph_memory[max_n],ph_memtop=0
;int ph_newnode()
void ph_insert(pairing_heap &ph0,int key)
由於無法確定單元素關鍵字減值後是否破壞堆序,故將以該節點為根的整個子樹從其父節點的子節點的兄弟指標鏈裡刪去,作為乙個新配對堆,與原配對堆合併即可。
對於配對堆的單元素關鍵字減值維護**如下:
void ph_decreasekey(pairing_heap &ph0,int
pos,int k)
}
根據堆序,配對堆中的最小元素即該配對堆根節點的關鍵字。將根節點刪除後,我們先將所有子樹兩兩合併,這樣子樹數目減半後,從最後乙個子樹向前合併,得到維護後的新配對堆。
對於配對堆的單最值查詢刪除維護**如下:
#define ph_findmin(ph0) (ph0.root!=nil?phdata[ph0.root].key:nil)
pairing_heap ph_deletenode(int pos)
pairing_heap ph_mergepair(pairing_heap ph0)
int ph_deletemin(pairing_heap &ph0)
作為一種易於實現的資料結構,配對堆可謂是斐波那契堆的簡化版。不過,也正是由於配對堆的不規則性,故其理論時間複雜度的分析較為困難。但在實踐中,配對堆不失為一種高效簡便的資料結構。 資料結構 配對堆
題目描述 如題,初始小根堆為空,我們需要支援以下3種操作 操作1 1 x 表示將x插入到堆中 操作2 2 輸出該小根堆內的最小數 操作3 3 刪除該小根堆內的最小數 輸入輸出格式 輸入格式 第一行包含乙個整數n,表示操作的個數 接下來n行,每行包含1個或2個正整數,表示三種操作,格式如下 操作1 1...
資料結構 堆
最大堆 最小堆 堆的定義是 n個元素的序列,當且僅當滿足如下關係時被成為堆 1 ki k2i 且 ki k2i 1 或 2 ki k2i 且 ki k2i 1 i 1,2,n 2 當滿足 1 時,為最小堆,當滿足 2 時,為最大堆。若將此序列對應的一維陣列堪稱是乙個完全二叉樹,則2i和2i 1個節點...
資料結構 堆
資料結構 堆的操作和實現 當應用優先順序佇列或者進行堆排序時,一般利用堆來實現。堆是乙個完全 除最底層 外都是滿的 二叉樹,並滿足如下條件 1 根結點若有子樹,則子樹一定也是堆。2 根結點一定大於 或小於 子結點。因為要求堆必須是完全二叉樹,所以可以用線性的資料結構,比如陣列,來實現堆。利用陣列實現...