堆是一種特殊的樹形資料結構,一般討論的堆都是二叉堆。堆的特點是根結點的值是所有結點中最小的或者最大的,並且根結點的兩個子樹也是乙個堆結構。
堆是一種比較特殊的資料結構,可以被看做一棵樹的陣列物件,具有以下的性質:
• 堆中某個節點的值總是不大於或不小於其父節點的值;
• 堆總是一棵完全二叉樹。
將根節點最大的堆叫做最大堆或大根堆,根節點最小的堆叫做最小堆或小根堆。常見的堆有二叉堆、斐波那契堆等。
堆的定義如下:n個元素的序列當且僅當滿足下關係時,稱之為堆。
(ki <= k2i,ki <= k2i+1)或者(ki >= k2i,ki >= k2i+1), (i = 1,2,3,4…n/2),滿足前者的表示式的成為小頂堆,滿足後者表示式的為大頂堆,這兩者的結構圖可以用完全二叉樹排列出來,示例圖如下:
因為堆有序的特點,一般用來做陣列中的排序,稱為堆排序。
以下2道題為leetcode中幾道典型習題,該型別題中可以看到都巧妙的用到了stl容器,降低演算法難度,建議練一下相關習題。
案例如下:
輸入:nums=[1,1,1,2,2,3],k=2
輸出:[1,2]
vector<
int>
topkfrequent
(vector<
int>
& nums,
int k));
for(
int i=
0;i)return vec;
}
案例如下:
matrix = [
[ 1, 5, 9],
[10, 11, 13],
[12, 13, 15]
],k = 8,
返回 13。
int
kthsmallest
(vector
int>>
& matrix,
int k)
}return q.
top();
}
《演算法筆記》堆
堆的常用操作 新建堆,插入元素,刪除堆頂 理論 1 downadjust low,high 的作用是調整這個閉區間範圍內的元素,使其滿足堆的性質 呼叫此函式的前提是除了low之外,其他節點滿足堆的性質 2 createheap 在建堆時是倒著從第乙個非葉節點元素開始呼叫downadjust 3 de...
演算法 之 堆 建立堆
給出乙個有n個元素的陣列a 1.n 要建立乙個包含這些元素的堆,可以這樣進行 從空的堆開始,不斷插入每乙個元素,直到a完全被轉移到堆中為止。因為插入第j個鍵值用時o log j 因此用這種方法建立堆疊的時間複雜性是o n log n 我們知道對應於堆h 1.n 的樹的節點可以方便地以自頂向下 從左到...
演算法筆記 資料結構 堆
堆是一棵完全二叉樹,樹中每個結點的值都不小於 或者不大於 其左右孩子結點的值 對於給定初始序列,如何建堆?給定陣列 85,55,82,57,68,92,99,98,66,56 建堆過程如下 利用陣列來儲存完全二叉樹,這樣結點就按層序儲存與陣列中,其中第乙個結點將儲存於陣列的1號位,並且陣列i號位表示...