最大最小堆(min max heap)

2021-10-19 13:17:38 字數 2654 閱讀 7186

做專案的時候聽說了最大最小堆這種資料結構,於是就來學習一下。

最大最小堆算是二叉堆的變形,結構與二叉堆類似,只是節點的排列順序有所不同。相較於二叉堆,最大最小堆能夠同時支援最大值或最小值的查詢(o(1

)o(1)

o(1)

)和刪除(o

(log⁡n

)o(\log n)

o(logn

))操作。

相較於用兩個二叉堆或用平衡樹實現相同的功能,最大最小堆唯一的優勢大概就是只需要開乙個大小為 n

nn 的陣列。

最大最小堆的結構和二叉堆一樣,都是一棵滿二叉樹。若令根節點深度為 0

00,則滿足在以深度為偶數的節點為根的子樹中,根節點為子樹的最小值,否則為子樹的最大值。上述條件等價於,深度為偶數的點小於父親且大於祖父,深度為奇數的點大於父親且小於祖父(假設鍵值兩兩不同)。

那麼根節點就是最小值,根節點兩個兒子的較大值就是最大值。

主要的操作分為上移和下移,時間複雜度均為 o

(log⁡n

)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的左...