演算法導論-第6章
總覽
- 與第2章演算法對比
複雜度 | 插入 | 歸併 | 堆排序 |
---|---|---|---|
時間 | O( N 2 N^2 N2) | O( n l g n n lg n nlgn) | O( n l g n n lg n nlgn) |
空間 | O( n n n) | O( 2 n 2^n 2n) | O( n n n) |
總結:堆排序結合了兩者優點
- 本章演算法對比
演算法名 | MAX-HEAPIFY | BUILD-MAX-HEAP | HEAPSORT | 優先佇列的四種功能1 |
---|---|---|---|---|
時間複雜度 | O( l g n lgn lgn) | 線性時間複雜度 | O( n l g n nlgn nlgn) | O( l g n lgn lgn) |
作用 | 維護最大堆性質 | 無序的輸入資料陣列構造最大堆 | 對一個陣列進行原址排序 | 利用堆實現優先佇列 |
堆
概念理解:
完全二叉樹、最小堆2、最大堆
- 引數概念
A.length:陣列元素的個數
A.heap-size:儲存在陣列中的堆元素個數
//區別:A[1 ....A.length]都有資料 A[1 .... A.heap-size]堆的有效元素 0<=A.heap-size<=A.length
- 結點相關(下標 i )
父結點:PARENT(i) = (i/2) 取小
左孩子:LEFT(i) = 2*i
右孩子:RIGHT(i) = 2*i + 1
維護堆的性質
MAX-HEAPIFY:一種自寫演算法,維護最大堆。
場景:一個有問題的最大堆,A[i]節點小於其孩子
解決方案:通過此演算法,把A[i]在最大堆“逐級下降”,使得下標為 i 的根節點遵循最大堆性質
- MAX-HEAPIFY(A,i)
l = LEFT(i)
r = RIGHT(i)
if l <= A.heap-size and A[l] > A[i]
largest = l
else
largest = i
if r <= A.heap-size and A[r] > A[largest]
largest = r
if largest != i
exchange A[i] with A[largest]
MAX-HEAPIFY(A,largest)
建堆
呼叫MAX-HEAPIFY(A,i)
子陣列A( [n/2] + 1 … n )元素都是樹的葉節點
結果:建出了一個最大堆
- BUILD-MAX-HEAP(A)
A.heap-size = A.length
for i = A.length/2 downto 1
MAX-HEAPIFY(A,i)
堆排序演算法
- HEAPSORT(A)
BUILD-MAX-HEAP(A)
for i = A.length downto 2
exchange A[1] with A[i]
A.heap-size = A.heap-size - 1
MAX-HEAPIFY(A,1)
優先佇列
- 背景
堆的常見應用:優先佇列(最大優先佇列、最小優先佇列)
這裡:最大堆實現最大優先佇列
- 介紹
優先佇列(priority queue):一種用來維護由一組元素構成的集合 S 的資料結構,每一個元素都有一個相關的值,稱為關鍵字(key)
- 最大優先佇列要支援的功能
INSERT(S,x):把元素 x 插入集合 S 中
MAXIMUM(S):返回 S 中具有最大關鍵字的元素
EXTRACT-MAX(S):去掉並返回 S 中具有最大關鍵字的元素
INCREASE-KEY(S , x , k):將元素 x 的關鍵字值增加到 k ,這裡假設 k 的值不小於 x 的原關鍵字
- 用途
最大優先佇列:共享計算機系統的作業排程
最小優先佇列:基於事件驅動的模擬器
四種功能的實現
- HEAP-MAXIMUM(A):返回最大關鍵字元素
return A[1]
時間複雜度 O( 1 1 1)
- HEAP-EXTRACT-MAX(A):去掉並返回 A 中具有最大關鍵字的元素
if A.heap-size < 1
error"heap underflow"
max = A[1]
A[1] = A[A.heap-size]
A.heap-size = A.heap-size-1
MAX-HEAPIFY(A,1)
return max
時間複雜度為 O( l g n lgn lgn) 。因為除了時間複雜度為 O( l g n lgn lgn) 的 MAX-HEAPIFY 以外,其他的操作都是常數階的
- HEAP-INCREASE-KEY(A , i , key):將元素 i 的關鍵字值增加到 key ,這裡假設 key 的值不小於 i 的原關鍵字
if key < A[i]
error"new key is smaller than current key"
A[i] = key
while i > 1 and A[PARENT(i)] < A[i]
exchange A[i] with A[PARENT(i)]
i = PARENT(i)
時間複雜度O( l g n lgn lgn)
- MAX-HEAP-INSERT(A , key):插入到最大堆 A 中的新元素的關鍵字
A.heap-size = A.heap-size + 1
A[A.heap-size] = 負無窮
HEAP-INCREASE-KEY(A , A.heap-size , key)
相關文章
- 《演算法導論》演算法
- 計算機導論(第4版)計算機
- 演算法導論-堆排序演算法排序
- 演算法導論-快速排序演算法排序
- 《演算法》第4版 導讀演算法
- 演算法導論FFT程式碼演算法FFT
- 演算法導論第三十一(31)章數論演算法演算法
- 學演算法要讀《演算法導論》嗎?演算法
- 《演算法導論》學習筆記演算法筆記
- 【演算法導論】24.1 Bellman-Ford 演算法演算法
- 史蒂芬斯與演算法導論之思演算法
- 演算法導論第二章思考題演算法
- 演算法導論第二章筆記演算法筆記
- 演算法導論第二章練習演算法
- 演算法導論 3.2-7 共軛數演算法
- 演算法導論_第七章_快速排序演算法排序
- 演算法導論學習之五:快速排序演算法排序
- 演算法導論C語言實現: 演算法基礎演算法C語言
- 演算法導論第三章練習演算法
- 演算法導論_第四章_分治策略演算法
- 演算法導論_第六章_堆排序演算法排序
- 演算法導論學習之六:歸併排序演算法排序
- 演算法導論16.1 活動選擇問題演算法
- 演算法導論-動態規劃-鋼條切割演算法動態規劃
- 演算法導論學習之二:插入排序演算法排序
- 演算法導論學習之一:氣泡排序演算法排序
- 演算法導論 3.1-8 記號擴充套件演算法套件
- 演算法導論第三版詳細答案演算法
- 論文第1章:緒論
- 從零開書學演算法(導論)之歸併排序演算法排序
- 演算法導論-中位數和順序統計量演算法
- 演算法導論-動態規劃-裝配線排程演算法動態規劃
- 程式碼隨想錄演算法訓練營第64天 | 圖論:Floyd 演算法+A * 演算法演算法圖論
- 大神之路-起始篇 | 第1章.電腦科學導論之【基礎緒論】學習筆記筆記
- 演算法導論_第八章_線性時間排序演算法排序
- 演算法導論學習之補漏:高精度冪運算演算法
- 演算法導論_第十章_基本資料結構演算法資料結構
- 演算法導論-16.1-4 活動教室選擇問題演算法