演算法導論-第6章

神棍行者發表於2020-12-11

總覽

  • 與第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-HEAPIFYBUILD-MAX-HEAPHEAPSORT優先佇列的四種功能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)

  1. MAX-HEAP-INSERT、HEAP-EXTRACT-MAX、HEAP-INCREASE-KEY、HEAP-MAXIMUM ↩︎

  2. 最大堆:除了根結點,所有結點 i 要滿足:A[ PARENT(i) ] >= A[ i ] ↩︎

相關文章