6/9/10 ¡ Heaps • Heap: ¡array ¡representa:on ¡of ¡a ¡ complete ¡binary ¡tree ¡ 16 ¡ – every ¡level ¡is ¡completely ¡filled ¡ CS420 ¡lecture ¡five ¡ 10 ¡ 14 ¡ ¡ ¡ ¡ ¡ ¡except ¡the ¡boHom ¡level: ¡filled ¡from ¡leI ¡ to ¡right ¡ 7 ¡ Priority ¡Queues, ¡Sor:ng ¡ 8 ¡ 9 ¡ 3 ¡ • Can ¡compute ¡the ¡index ¡of ¡parent ¡ 2 ¡ 4 ¡ 1 ¡ and ¡children ¡ wim ¡ ¡bohm ¡cs ¡ ¡csu ¡ – parent(i) ¡= ¡floor(i/2) ¡ ¡ ¡ ¡ ¡ ¡leI(i)= ¡2i ¡ 16 ¡14 ¡10 ¡8 ¡ ¡7 ¡9 ¡3 ¡2 ¡4 ¡1 ¡ ¡ ¡ ¡ ¡ ¡index(i)=2i+1 ¡ ¡ ¡ ¡ ¡ ¡ ¡(for ¡1 ¡based ¡arrays) ¡ • Heap ¡property: ¡ A[parent(i)] ¡>= ¡A[i] ¡ Heapify ¡ Building ¡a ¡heap ¡ To ¡create ¡a ¡heap ¡at ¡i, ¡assuming ¡leI(i) ¡and ¡right(i) ¡are ¡heaps, ¡ ¡ • heapify ¡performs ¡at ¡most ¡lg ¡n ¡swaps ¡ bubble ¡A[i] ¡down: ¡swap ¡with ¡max ¡ ¡child ¡un:l ¡heap ¡property ¡holds ¡ • building ¡a ¡heap ¡out ¡of ¡an ¡array: ¡ ¡ ¡ ¡ ¡ ¡ ¡heapify(A,i){ ¡ – The ¡leaves ¡are ¡all ¡heaps ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡L=leI(i); ¡R=right(i); ¡ – heapify ¡backwards ¡star:ng ¡at ¡last ¡internal ¡node ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡if ¡L<=N ¡and ¡A[L] ¡> ¡A[i] ¡ ¡max=L ¡else ¡max ¡= ¡i; ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡if ¡R<=N ¡and ¡A[R]>A[max] ¡ ¡max ¡=R; ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡if ¡max ¡!= ¡i ¡{ ¡ buildheap(A){ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡swap(A,i,max); ¡ ¡ ¡ ¡ ¡ ¡for ¡i ¡= ¡floor(n/2) ¡downto ¡1 ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡heapify(A.max) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡heapify(A,i) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡} ¡ ¡ ¡ ¡ } ¡ ¡ ¡ ¡ ¡ ¡ ¡} ¡ 1 ¡
6/9/10 ¡ Complexity ¡buildheap ¡ Complexity ¡buildheap ¡ • Sugges:ons? ¡... ¡ • ini:al ¡thought ¡ ¡O(nlgn), ¡but ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡half ¡of ¡the ¡heaps ¡are ¡height ¡1 ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡quarter ¡are ¡height ¡2 ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡only ¡one ¡is ¡height ¡log ¡n ¡ It ¡turns ¡out ¡that ¡O(nlgn) ¡is ¡not ¡:ght! ¡ complexity ¡buildheap ¡ complexity ¡buildheap ¡ Conjecture: ¡ ¡ height ¡ max ¡#swaps ¡ height ¡ max ¡#swaps ¡ ¡ ¡ ¡height ¡= ¡h ¡ 0 ¡ 0 ¡ 0 ¡ ¡= ¡2 1 -‑2 ¡ 0 ¡ ¡= ¡2 1 -‑2 ¡ ¡ ¡ ¡max ¡#swaps ¡= ¡2 h+1 -‑(h+2) ¡ 1 ¡ 1 ¡ 1 ¡ ¡= ¡2 2 -‑3 ¡ 1 ¡ ¡= ¡2 2 -‑3 ¡ Proof: ¡induc:on ¡ ¡ ¡ ¡ ¡height ¡= ¡(h+1) ¡ 2 ¡ 2 ¡ 2*1+2 ¡= ¡4 ¡= ¡2 3 -‑4 ¡ 2*1+2 ¡= ¡4 ¡= ¡2 3 -‑4 ¡ ¡ ¡ ¡ ¡max ¡#swaps: ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡2*(2 h+1 -‑(h+2))+(h+1) ¡ ¡ ¡ ¡ ¡ ¡= ¡2 h+2 -‑2h-‑4+h+1 ¡ 3 ¡ 3 ¡ 2*4+3 ¡= ¡11 ¡= ¡2 4 -‑5 ¡ 2*4+3 ¡= ¡11 ¡= ¡2 4 -‑5 ¡ ¡ ¡ ¡ ¡ ¡= ¡2 h+2 -‑(h+3) ¡ ¡ ¡ ¡ ¡ ¡= ¡2 (h+1)+1 -‑((h+1)+2) ¡ ¡ ¡ ¡n ¡nodes ¡ O(n) ¡swaps ¡ ¡ ¡ ¡ ¡ ¡ ¡ 2 ¡
6/9/10 ¡ Differen:a:on ¡trick ¡ ¡ Cormen ¡et.al. ¡complexity ¡buildheap ¡ (Cormen ¡et.al. ¡Appendix ¡A) ¡ ∞ lg N lg N 1 N h ∑ x h = 1 − x Infinite geometrics series | x | < 1 ∑ ∑ h = N 2 h 2 h h = 0 h = 0 h = 0 differentiate both sides and multiply by x : ∞ h 1/2 ∑ = (1 − 1/2) 2 = 2 ∞ x ∑ hx h 2 h = (1 − x ) 2 h = 0 h = 0 lg N h take x = 1/2 ∑ N = O ( n ) 2 h h = 0 Heapsort ¡ Complexity ¡heapsort ¡ ¡heapsort(A){ ¡ • buildheap: ¡ ¡O(n) ¡ ¡ ¡ ¡ ¡buildheap(A); ¡ • swap/heapify ¡loop: ¡O(nlgn) ¡ ¡ ¡ ¡ ¡for ¡i ¡= ¡n ¡downto ¡2{ ¡ ¡ ¡ ¡ ¡ ¡ ¡swap(A,1,i); ¡ • space: ¡in ¡place: ¡n ¡ ¡ ¡ ¡ ¡ ¡ ¡n=n-‑1; ¡ – less ¡space ¡than ¡merge ¡sort ¡ ¡ ¡ ¡ ¡ ¡ ¡heapify(A,1); ¡ ¡ ¡ ¡} ¡ } ¡ 3 ¡
6/9/10 ¡ Priority ¡Queues ¡ 14 ¡ 8 ¡ 7 ¡ • heaps ¡are ¡used ¡in ¡priority ¡queues ¡ 8 ¡ 7 ¡ 4 ¡ 7 ¡ 1 ¡ 4 ¡ – each ¡value ¡associated ¡with ¡a ¡key ¡ 2 ¡ 4 ¡ 1 ¡ 2 ¡ 14 ¡ 1 ¡ 2 ¡ 8 ¡ 14 ¡ – max ¡priority ¡queue ¡S ¡(as ¡in ¡heapsort) ¡has ¡ opera:ons ¡that ¡maintain ¡the ¡heap ¡property ¡of ¡S ¡ • insert(S,x) ¡ 4 ¡ 2 ¡ 1 ¡ • max(S) ¡ ¡returning ¡max ¡element ¡ 2 ¡ 1 ¡ 1 ¡ 4 ¡ 2 ¡ 4 ¡ • Extract-‑max(S) ¡extrac:ng ¡and ¡returning ¡max ¡element ¡ 7 ¡ 8 ¡ 14 ¡ 7 ¡ 8 ¡ 14 ¡ 7 ¡ 8 ¡ 14 ¡ • increase ¡key(S,x,k) ¡ ¡increasing ¡the ¡key ¡value ¡of ¡x ¡ ¡Extract ¡max: ¡O(log ¡n) ¡ Increase ¡key: ¡O(log ¡n) ¡ ¡ ¡ ¡ Extract-‑max(S){ ¡ Increase-‑key(S,i,k){ ¡ ¡ ¡ ¡//pre: ¡k>S[i] ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡// ¡pre:N>0 ¡ ¡ ¡ ¡A[i]=k; ¡ ¡ ¡ ¡ ¡ ¡ ¡max=S[1]; ¡ ¡ ¡ ¡// ¡bubble ¡up ¡ ¡ ¡ ¡ ¡ ¡ ¡S[1]=S[N]; ¡ ¡ ¡ ¡while(i>1 ¡and ¡S[parent(i)]<S[i]){ ¡ ¡ ¡ ¡ ¡ ¡ ¡N=N-‑1; ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡swap(S,i,parent(i)); ¡ ¡ ¡ ¡ ¡ ¡ ¡heapify(S) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡i ¡= ¡parent(i) ¡ ¡ ¡ ¡} ¡ ¡ ¡ ¡} ¡ O(log ¡N) ¡ ¡ ¡ ¡ } ¡ ¡ 4 ¡
6/9/10 ¡ Insert ¡ ¡O(log ¡n) ¡ Decrease-‑key ¡ • Insert(S,x) ¡ • How ¡would ¡decrease ¡key ¡work? ¡ – put ¡x ¡at ¡end ¡of ¡S ¡ – bubble ¡x ¡up ¡like ¡in ¡Increase-‑key ¡ ¡ • What ¡would ¡be ¡its ¡complexity? ¡ Quicksort ¡ Quicksort ¡ • Quicksort ¡has ¡worst ¡case ¡complexity? ¡ • Quicksort ¡has ¡worst ¡case ¡complexity ¡O(n 2 ) ¡ • So ¡why ¡do ¡we ¡care ¡about ¡Quicksort? ¡ 5 ¡
6/9/10 ¡ Quicksort ¡ Par::on: ¡O(n) ¡ Par::on(A,p,r){ ¡ • Quicksort ¡has ¡worst ¡case ¡complexity ¡O(n 2 ) ¡ ¡// ¡par::on ¡A[p..r] ¡in-‑place ¡in ¡two ¡sub ¡arrays: ¡low ¡and ¡hi ¡ ¡// ¡all ¡elements ¡in ¡low ¡< ¡all ¡elements ¡in ¡hi ¡ • So ¡why ¡do ¡we ¡care ¡about ¡Quicksort? ¡ ¡// ¡return ¡index ¡of ¡last ¡element ¡of ¡low ¡ – Because ¡it ¡is ¡ ¡very ¡fast ¡in ¡prac:ce ¡ ¡ ¡ ¡x=A[p]; ¡i=p-‑1; ¡j=r+1; ¡ • Average ¡complexity: ¡O(nlgn) ¡ ¡ ¡ ¡while ¡true ¡ • Low ¡mul:plica:ve ¡constants ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡repeat ¡j=j-‑1 ¡un:l ¡A[j]<=x ¡ • Sequen:al ¡array ¡access ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡repeat ¡i=i+1 ¡un:l ¡A[i]>x ¡ • In ¡place ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡if ¡i<j ¡swap(A,i,j) ¡else ¡return ¡j ¡ • OIen ¡faster ¡than ¡MergeSort ¡and ¡HeapSort ¡ ¡ } ¡ ¡ ¡ QuickSort ¡ Quicksort ¡average ¡case ¡complexity ¡ ¡ ¡ ¡Quicksort(A,p,r){ ¡ • Assume ¡a ¡uniform ¡distribu:on: ¡each ¡par::on ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡if ¡p<r ¡{ ¡ index ¡has ¡equal ¡probability ¡1/n. ¡Thus ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡q=Par::on(A,p,r) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡Quicksort(A,p,q) ¡ n − 1 T ( n ) = ( n + 1) + 1 ∑ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡Quicksort(A,q+1,r) ¡ T ( q ) + T ( n − q ) n ¡ ¡ ¡ ¡ ¡ ¡ ¡} ¡ q = 1 ¡ ¡ ¡ ¡} ¡ T (0) = T (1) = 0 Worst ¡case ¡complexity : ¡ when ¡one ¡par::on ¡is ¡size ¡1: ¡ ¡ ¡ ¡ ¡T(n)=T(n-‑1)+n=T(n-‑2)+(n-‑1)+n=T(n-‑3)+(n-‑2)+(n-‑1)+n= ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡= ¡O(n 2 ) ¡ ¡ 6 ¡
Recommend
More recommend