1.heap
表示方法
滿足以下性質的二叉樹binary tree
可以成為binary heap
:
complete tree
:所有的層都是完全的,除了最後一層,且最後一層的葉子靠左。
min heap or max heap
:根節點是最大值或者最小值,而且這個性質對於任何遞迴得到的子樹都成立。
binary heap
通常使用array
表示:
根節點在array[0]
;
array[(i-1)//2]
返回父節點,array[2*i+1]
返回左孩子樹,array[2*i+2]
返回右孩子樹。
binary heap
通常使用array
表示,對於任意索引i
:
def
parent
(i):
return
(i-1)//
2def
left
(i):
return
2*i+
1def
right
(i):
return
2*i+
2
2.max-heapify
max heapify
是保持max-heap
性質的操作,輸入為array a and index i
,假設輸入時,以left(i) and right(i)
為根節點的子數都滿足最大堆性質,但是以i
為根節點的子數不滿足最大堆性質。max heapify
函式讓a[i]
向下層轉移,進行調整。
def
maxheapify
(array,i)
: l = left(i)
r = right(i)
largest = i
if l<=
len(array)
and array[l]
>array[i]
: largest = l
if r<=
len(array)
and array[r]
>array[i]
: largest = r
if largest != i:
array[largest]
,array[i]
= array[i]
,array[largest]
maxheapify(array,largest)
時間複雜度分析:在乙個以i
作為根節點、包含n
個節點的子數上執行maxheapify
的時間包含:調整largest
常數時間,孩子子樹執行maxheapify
的時間。由於孩子子數最多有2n/3
個節點(這種情況只會發生在最底層節點剛好是 half full 的情況),因此可以描述為以下形式:
t (n
)≤t(
2n/3
)+θ(
1)t(n)\leq t(2n/3)+\theta(1)
t(n)≤t
(2n/
3)+θ
(1)按照公式法可以得到時間複雜為o(lgn)
。
3.build-max-heap
maxheapify
前提條件是以left(i) and right(i)
根節點的子數都是滿足最大堆性質的,那麼顯然如果我們從最底層的子數開始,逐漸往上,對每個節點執行maxheapify(array,i)
操作,那麼這個堆所有的節點都滿足最大堆性質,變為最大堆。但是,如果我們從最上層開始執行maxheapify
,那麼顯然不滿足前提條件。
另外具體從哪個節點開始呢,heap
有個性質,對於array[0,1,...,n-1]
的陣列,array[(n-1)//2+1:n-1]
的節點全是葉節點,而葉節點是不需要maxheapify
操作的,所以我們只對array[:(n-1)//2]
的元素進行操作:
def
buildmaxheap
(array)
:for i in
reversed
(range((
len(array)-1
)//2+
1)):
maxheapify(array,i)
計算得到buildmaxheap
的時間複雜度為o(n)
,也就是說堆的建立是線性時間,而不是o(nlgn)
,這是堆相對於普通排序最大的優點之一。
4.heapsort
heapsort
的時間複雜度為o(nlgn)
,而且是就地排序演算法,除輸入陣列只外只占用恆定的記憶體空間,這兼具了insertion sort
(就地排序)和merge sort
(時間複雜度)的優點。
def
maxheapify
(array,n,i)
: l =
2*i+
1 r =
2*i+
2 largest = i
if l<=n and array[l]
>array[largest]
: largest = l
if r<=n and array[r]
>array[largest]
: largest = r
if largest != i:
array[largest]
,array[i]
= array[i]
,array[largest]
maxheapify(array,n,largest)
defheapsort
(array)
: n =
len(array)
for i in
reversed
(range
(n//2)
):maxheapify(array,n-
1,i)
while n>1:
array[n-1]
,array[0]
= array[0]
,array[n-1]
n -=
1 maxheapify(array,n-1,
0)return array
堆排序 Heap Sort 演算法的實現
堆排序演算法思想非常簡單,先把乙個陣列看成乙個heap,在下面的實現中,我使用的是max heap,也就是說根總是比葉子大。所以我們第一步就是建立max heap。建立完畢以後,很明顯這個heap的root就是最大的,把最大的根放在陣列的最後乙個位置,把陣列長度縮小乙個位置,這樣最大的那個數就不會再...
itemcf的hadoop實現優化 Python
原始資料如下 u1 a,d,b,c u2 a,a,c u3 b,d u4 a,d,c u5 a,b,c 計算公式使用 sim u i u j u i u j 其中 u i u j u i u j u i u j 原始的hadoop實現需要5輪mr,優化後只需要兩輪就可以完成。之前的輪數過多,主要在於...
使用virtualenv建立獨立的Python環境
virtualenv是 python的沙盒環境,主要解決以下問題 yum groupinstall development tools yum y install zlib devel bzip2 devel openssl devel ncurses devel sqlite devel read...