資料結構 堆 heap

2021-10-08 22:03:41 字數 2203 閱讀 5139

陣列表示

公式運算

堆就是用陣列實現的完全二叉樹,所以它沒有使用父指標或者子指標。

堆根據「堆屬性」來排序,「堆屬性」決定了樹中節點的位置。

堆的根節點中存放的是最大或者最小元素,但是其他節點的排序順序是未知的。

例如,在乙個最大堆中,最大的那乙個元素總是位於 index 0 的位置,但是最小的元素則未必是最後乙個元素。–唯一能夠保證的是最小的元素是乙個葉節點,但是不確定是哪乙個。

父節點的值比每乙個子節點的值都要大

父節點的值比每乙個子節點都要笑

陣列可以儲存為

[10,

7,2,

5,1]

如果 i 是節點的索引,那麼下面的公式就給出了它的父節點和子節點在陣列中的位置

parent

(i)=

floor

((i -1)

/2)left

(i)=

2i +

1right

(i)=

2i +

2

right(i)就是簡單的left(i) + 1。左右節點總是處於相鄰的位置驗證:

注:根節點(10)沒有父節點,因為 -1 不是乙個有效的陣列索引。同樣,節點 (2),(5)和(1) 沒有子節點,因為這些索引已經超過了陣列的大小,所以我們在使用這些索引值的時候需要保證是有效的索引值。

在最大堆中,父節點的值總是要大於(或者等於)其子節點的值。這意味下面的公式對陣列中任意乙個索引 i都成立

array[

parent

(i)]

>= array[i]

樹的高度是指從樹的根節點到最低的業績點所需要的步數

即:高度是指節點之間的邊的最大值。

乙個高度為h的堆有h+1層

如果乙個堆有 n 個節點,那麼它的高度是h = floor(log2(n))

這是因為我們總是要將這一層完全填滿以後才會填充新的一層。上面的例子有 15 個節點,所以它的高度是floor(log2(15)) = floor(3.91) = 3

如果最下面的一層已經填滿,那麼那一層包含2^h個節點。

樹中這一層以上所有的節點數目為2^h - 1

存在最大堆,堆的陣列是:[ 10, 7, 2, 5, 1 ]

插入16到陣列尾部,陣列變為:[ 10, 7, 2, 5, 1, 16 ]

當前,堆屬性不滿足

恢復堆屬性:

存在最大堆

刪除後的樹:

取出陣列的最後乙個元素,將其放在樹的頂部,再修復堆屬性

移除堆的元素會破壞最大堆或最小堆屬性

將要刪除的元素和最後乙個元素交換

資料結構 堆(heap)

堆 heap 也被稱為優先佇列 priority queue 佇列中允許的操作是先進先出 fifo 在隊尾插入元素,在隊頭取出元素。而堆也是一樣,在堆底插入元素,在堆頂取出元素,但是堆中元素的排列不是按照到來的先後順序,而是按照一定的優先順序排列的。這個優先順序可以是元素的大小或者其他規則。如圖一所...

資料結構之堆Heap

1.概述 堆 也叫優先佇列 是一棵完全二叉樹,它的特點是父節點的值大於 小於 兩個子節點的值 分別稱為大頂堆和小頂堆 它常用於管理演算法執行過程中的資訊,應用場景包括堆排序,優先佇列等。2.堆的基本操作 堆是一棵完全二叉樹,高度為o lg n 其基本操作至多與樹的高度成正比。在介紹堆的基本操作之前,...

Heap 資料結構之堆

堆是一種資料結構,是一棵二叉樹 盡量地滿足完全二叉樹的規律 他有乙個特點,就是兩個兒子的值均大於或小於父節點。那麼這個堆就被稱為大頂堆或小頂堆。同一級的元素不比較大小,它可以用到優先佇列之中,還有其他很神奇的應用。其實就是乙個步驟 如果它不滿足堆的性質,那麼就繼續維護,否則結束。1.向上維護 如果節...