陣列表示
公式運算
堆就是用陣列實現的完全二叉樹,所以它沒有使用父指標或者子指標。
堆根據「堆屬性」來排序,「堆屬性」決定了樹中節點的位置。
堆的根節點中存放的是最大或者最小元素,但是其他節點的排序順序是未知的。
例如,在乙個最大堆中,最大的那乙個元素總是位於 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.向上維護 如果節...