演算法導論-第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版 導讀演算法
- 學演算法要讀《演算法導論》嗎?演算法
- 演算法導論第二章練習演算法
- 演算法導論第二章思考題演算法
- 演算法導論第二章筆記演算法筆記
- 演算法導論 3.2-7 共軛數演算法
- 演算法導論第三章練習演算法
- 演算法導論 3.1-8 記號擴充套件演算法套件
- 程式碼隨想錄演算法訓練營第64天 | 圖論:Floyd 演算法+A * 演算法演算法圖論
- 大神之路-起始篇 | 第1章.電腦科學導論之【基礎緒論】學習筆記筆記
- 動態規劃-隔鋼條-演算法導論-2021/1/1動態規劃演算法
- 工程學導論
- 第1章 概論
- 計算理論導論筆記筆記
- 第 10 篇 評論介面
- Android 築基導論Android
- 計算機導論計算機
- 骨骼動畫導論動畫
- SpringIOC 理論推導Spring
- FP-Growth演算法全解析:理論基礎與實戰指導演算法
- 人工智慧導論——智慧計算(進化演算法+群智慧優化)人工智慧演算法優化
- 圖論演算法圖論演算法
- 程式碼隨想錄演算法訓練營第52天 | 圖論基礎1演算法圖論
- 數論基礎——求導求導
- 1-微服務導論微服務
- 【圖論】Floyd演算法圖論演算法
- 【JAVA演算法】圖論演算法 -- Dijkstra演算法Java演算法圖論
- 作業系統導論(1)作業系統
- 併發程式設計導論程式設計
- 【PDF下載】演算法導論 中文版 第三版 高清 PDF下載演算法
- 大神之路-起始篇 | 第3章.電腦科學導論之【資料儲存】學習筆記筆記
- 論文查重演算法演算法
- KMP演算法(Leetcode第28題)KMP演算法LeetCode
- 吉他和絃推導演算法演算法
- 計算機導論微機操作計算機
- 計算機導論與物理層計算機
- 論文相關參考導航