做專案的時候聽說了最大最小堆這種資料結構,於是就來學習一下。
最大最小堆算是二叉堆的變形,結構與二叉堆類似,只是節點的排列順序有所不同。相較於二叉堆,最大最小堆能夠同時支援最大值或最小值的查詢(o(1
)o(1)
o(1)
)和刪除(o
(logn
)o(\log n)
o(logn
))操作。
相較於用兩個二叉堆或用平衡樹實現相同的功能,最大最小堆唯一的優勢大概就是只需要開乙個大小為 n
nn 的陣列。
最大最小堆的結構和二叉堆一樣,都是一棵滿二叉樹。若令根節點深度為 0
00,則滿足在以深度為偶數的節點為根的子樹中,根節點為子樹的最小值,否則為子樹的最大值。上述條件等價於,深度為偶數的點小於父親且大於祖父,深度為奇數的點大於父親且小於祖父(假設鍵值兩兩不同)。
那麼根節點就是最小值,根節點兩個兒子的較大值就是最大值。
主要的操作分為上移和下移,時間複雜度均為 o
(logn
)o(\log n)
o(logn)。
min_shift_down(index)
函式在假設編號為index
的節點的子樹中,除根以外均滿足最大最小堆的性質,且根節點的深度為偶數,並把根節點下移調整來滿足性質。
void min_max_heap::
min_shift_down
(int index)
min_shift_up(index)
函式在假設整個堆若不看編號為index
的節點,均滿足最大最小堆的性質,且index
的深度為偶數,並把index
上移調整來滿足性質。
void min_max_heap::
min_shift_up
(int index)
else
//否則需要根據祖父情況進行討論
}}
洛谷 p3378 【模板】堆
#include
using
namespace std;
class
min_max_heap
heap;
bool min_max_heap::
is_min_level
(int index)
void min_max_heap::
swap
(int x,
int y)
int min_max_heap::
parent
(int index)
int min_max_heap::
grandparent
(int index)
bool min_max_heap::
has_parent
(int index)
bool min_max_heap::
has_grandparent
(int index)
bool min_max_heap::
has_child
(int index)
bool min_max_heap::
has_grandchild
(int index)
int min_max_heap::
min_child
(int index)
int min_max_heap::
max_child
(int index)
int min_max_heap::
min_grandchild
(int index)
}int min_max_heap::
max_grandchild
(int index)
}void min_max_heap::
min_shift_down
(int index)
void min_max_heap::
max_shift_down
(int index)
void min_max_heap::
min_shift_up
(int index)
else}}
void min_max_heap::
max_shift_up
(int index)
else}}
int min_max_heap::
min(
)int min_max_heap::
max(
)void min_max_heap::
insert
(int val)
void min_max_heap::
delete_min()
void min_max_heap::
delete_max()
}int
main()
else
if(op ==2)
printf
("%d\n"
, heap.
min())
;else heap.
delete_min()
;}return0;
}
最大最小堆介紹
最大最小堆 1.定義 最小最大堆是一棵完全二叉樹,且其中每個元素有乙個key資料成員。樹的各層交替為最小層和最大層。根結點在最小層。設x是最小最大堆的任意結點。若x在最小 最大 層上,則x中的元素的key值在以x為根的子樹的所有元素中是最小 最大 的。位於最小 最大 層的結點稱為最小 最大 結點。2...
最大堆 最小堆
堆是一種經過排序的完全二叉樹,其中任一非終端節點的資料值均不大於 或不小於 其左孩子和右孩子節點的值。最大堆和最小堆是 二叉堆的兩種形式。最大堆 根結點的鍵值是所有堆結點鍵值中最大者。最小堆 根結點的鍵值是所有堆結點鍵值中最小者。而最大 最小堆集結了最大堆和最小堆的優點,這也是其名字的由來。最大 最...
最大堆 最小堆
堆的定義是 n個元素的序列,當且僅當滿足如下關係時被成為堆 1 ki k2i 且 ki k2i 1 或 2 ki k2i 且 ki k2i 1 i 1,2,n 2 當滿足 1 時,為最小堆,當滿足 2 時,為最大堆。若將此序列對應的一維陣列堪稱是乙個完全二叉樹,則2i和2i 1個節點分別是節點i的左...