数据结构之堆Heap
堆(也叫優先隊列),是一棵完全二叉樹,它的特點是父節點的值大于(小于)兩個子節點的值(分別稱為大頂堆和小頂堆)。它常用于管理算法執行過程中的信息,應用場景包括堆排序,優先隊列等。
2. 堆的基本操作
堆是一棵完全二叉樹,高度為O(lg n),其基本操作至多與樹的高度成正比。在介紹堆的基本操作之前,先介紹幾個基本術語:
A:用于表示堆的數組,下標從1開始,一直到n
PARENT(t):節點t的父節點,即floor(t/2)
RIGHT(t):節點t的左孩子節點,即:2*t
LEFT(t):節點t的右孩子節點,即:2*t+1
HEAP_SIZE(A):堆A當前的元素數目
下面給出其主要的四個操作(以大頂堆為例):
2.1 Heapify(A,n,t)
該操作主要用于維持堆的基本性質。假定以RIGHT(t)和LEFT(t)為根的子樹都已經是堆,然后調整以t為根的子樹,使之成為堆。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | void Heapify(int A[], int n, int t) { ??int left = LEFT(t); ??int right = RIGHT(t); ??int max = t; ??if(left <= n)???? max = A[left] > A[max] ? left : max; ??if(right <= n)???? max = A[right] > A[max] ? right : max; ??if(max != A[t]) ??{ ????swap(A, max, t); ????Heapify(A, n, max); ??} } |
2.2? BuildHeap(A,n)
該操作主要是將數組A轉化成一個大頂堆。思想是,先找到堆的最后一個非葉子節點(即為第n/2個節點),然后從該節點開始,從后往前逐個調整每個子樹,使之稱為堆,最終整個數組便是一個堆。
| 1 2 3 4 5 6 7 8 9 10 11 | void BuildHeap(int A[], int n) { ??int i; ??for(i = n/2; i<=n; i++) ??Heapify(A, n, i); } |
2.3 GetMaximum(A,n)
該操作主要是獲取堆中最大的元素,同時保持堆的基本性質。堆的最大元素即為第一個元素,將其保存下來,同時將最后一個元素放到A[1]位置,之后從上往下調整A,使之成為一個堆。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | void GetMaximum(int A[], int n) { ??int max = A[1]; ??A[1] = A[n]; ??n--; ??Heapify(A, n, 1); ??return max; } |
2.4? Insert(A, n, t)
向堆中添加一個元素t,同時保持堆的性質。算法思想是,將t放到A的最后,然后從該元素開始,自下向上調整,直至A成為一個大頂堆。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | void Insert(int A[], int n, int t) { ??n++; ??A[n] = t; ??int p = n; ??while(p >1 && A[PARENT(p)] < t) ??{ ????A[p] = A[PARENT(p)]; ????p = PARENT(p); ??} ??A[p] = t; ??return max; } |
3.? 堆的應用
3.1? 堆排序
堆的最常見應用是堆排序,時間復雜度為O(N lg N)。如果是從小到大排序,用大頂堆;從大到小排序,用小頂堆。
3.2? 在O(n lg k)時間內,將k個排序表合并成一個排序表,n為所有有序表中元素個數。
【解析】取前100 萬個整數,構造成了一棵數組方式存儲的具有小頂堆,然后接著依次取下一個整數,如果它大于最小元素亦即堆頂元素,則將其賦予堆頂元素,然后用Heapify調整整個堆,如此下去,則最后留在堆中的100萬個整數即為所求 100萬個數字。該方法可大大節約內存。
3.3 一個文件中包含了1億個隨機整數,如何快速的找到最大(小)的100萬個數字?(時間復雜度:O(n lg k))
4. 總結
堆是一種非常基礎但很實用的數據結構,很多復雜算法或者數據結構的基礎就是堆,因而,了解和掌握堆這種數據結構顯得尤為重要。
5. 參考資料
(1)經典算法教程《算法導論》
———————————————————————————————
更多關于數據結構和算法的介紹,請查看:數據結構與算法匯總
———————————————————————————————-
原創文章,轉載請注明:?轉載自董的博客
本文鏈接地址:?http://dongxicheng.org/structure/heap/
總結
以上是生活随笔為你收集整理的数据结构之堆Heap的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hadoop MapReduce的一些相
- 下一篇: 数据结构之线段树