Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.
3/7/13                                                                      Heapify  Chapter 6 - Heapify                  ...
3/7/13                                                                 Heapify         Question 6.4.1             Is the t...
3/7/13                                                                      Heapify       1     2   3    4    5 6 7 8 9 10...
3/7/13                                                                    Heapify  Max-Heapify (A, i)  1      l ← Left (i)...
3/7/13                                                                  Heapify                         f(n) = Θ(1), all t...
Nächste SlideShare
Wird geladen in …5
×

Heapify

9.536 Aufrufe

Veröffentlicht am

Veröffentlicht in: Bildung
  • Als Erste(r) kommentieren

Heapify

  1. 1. 3/7/13 Heapify Chapter 6 - Heapify Search C455 Document last modified: 02/05/2013 02:50:45 Max-heap property The max-heap property: for every node i other than the root A[ Parent( i ) ] ≥ A[ i ] Note that the root is excluded as it has no parents. The max-heap property means that the parent value ≥ child value Max-Heapify Max-Heapify function, given a tree that is a heap except for node i, arranges node i and its subtrees to satisfy the heap property. Max-Heapify maintains max-heap property on an array as data is updated. Helper function definitions used by Max-Heapify Parent( i ) return ⌊i/2⌋ Left( i ) return 2i Right( i ) return 2i + 1 For simplicity, assume an array size large enough for a full binary tree with empty leaves filled with -∞. Pre and post conditions of Max-Heapify in ESCJava Max-Heapify (A, i) //@ pre A != null && i >= 1 && i < A.length && (forall int j; j > i && j <= A.length/2; A[ j ] >= A[ left( j ) ] && A[ j ] >= A[ right( j ) ]); //@ post (forall int j; j >= old( i ) && j <= A.length/2; A[ j ] >= A[ left( j ) ] && A[ j ] >= A[ right( j ) ]); Precondition says all subtrees of i are max heaps, tree rooted at i not included Postcondition says that the i subtree is a max heap. Note that leaves are in array indices greater than A.length/2homepages.ius.edu/RWISMAN/C455/html/notes/Chapter6/heapify.htm 1/5
  2. 2. 3/7/13 Heapify Question 6.4.1 Is the tree at right a max-heap? Is Max-Heapify( A, 2) precondition met? Explain. Max-Heapify (A, i) -- alters A, preserves i -- pre: is Left and Right subtrees in A satisfy heap property -- post: the tree rooted at location i in A satisfy heap property 1 l ← Left (i) 2 r ← Right (i) 3 if l ≤ A.heap-size and A[l] > A[i] 4 then largest ← l 5 else largest ← i 6 if r ≤ A.heap-size and A[r] > A[largest] 7 then largest ← r 8 if largest ≠ i then 9 exchange A[i] ↔ A[largest] 10 Max-Heapify (A, largest) Running Heapify MAX-HEAPIFY operation: Find location of largest value of: A[ i ], A[ Left( i )] and A[ Right( i ) ] If not A[ i ], max-heap property does not hold. Exchange A[ i ] with the larger of the two children to preserve max-heap property. Continue this process of compare/exchange down the heap until subtree rooted at i is a max-heap. At a leaf, the subtree rooted at the leaf is trivially a max-heap. Max-Heapify (A, 2)homepages.ius.edu/RWISMAN/C455/html/notes/Chapter6/heapify.htm 2/5
  3. 3. 3/7/13 Heapify 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 16 4 10 14 7 9 3 2 8 1 16 14 10 4 7 9 3 2 8 1 i l r i l r Exchange i with largest child Exchange i with largest child Max-Heapify (A, i) 1 l ← Left (i) 2 r ← Right (i) 3 if l ≤ A.heap-size and A[l] > A[i] 4 then largest ← l 5 else largest ← i 6 if r ≤ A.heap-size and A[r] > A[largest] 7 then largest ← r 8 if largest ≠ i then 9 exchange A[i] ↔ A[largest] 10 Max-Heapify (A, largest) 1 2 3 4 5 6 7 8 9 10 16 14 10 8 7 9 3 2 4 1 i Terminate when index i = largest Question 6.4.2 Is the tree at (c) a max-heap? Is Max-Heapify(A, 2) postcondition met? Explain. //@ post (forall int j; j >= old( i ) && j <= A.length/2; A[ j ] >= A[ left( j ) ] && A[ j ] >= A[ right( j ) ]); On the tree at right, execute Max-Heapify( A, 2 ). Example: Max-Heapify( A, 2 ) (a) Node 2 violates the max-heap property. for every node k other than the root A[ Parent( k ) ] ≥ A[ k ] (b) Compare node 2 with its children, and then exchange with the larger of the two children. (c) Continue down the tree, exchanging until the value is properly placed at the root of a subtree that is a max-heap; in this case, athomepages.ius.edu/RWISMAN/C455/html/notes/Chapter6/heapify.htm 3/5
  4. 4. 3/7/13 Heapify Max-Heapify (A, i) 1 l ← Left (i) 2 r ← Right (i) 3 if l ≤ A.heap-size and A[l] > A[i] 4 then largest ← l 5 else largest ← i 6 if r ≤ A.heap-size and A[r] > A[largest] 7 then largest ← r 8 if largest ≠ i then 9 exchange A[i] ↔ A[largest] 10 Max-Heapify (A, largest) Analysis of Heapify Running Time | O(1) if n = 1 T(n) = | | 2T(n/2) + D(n) + C(n) if n > 1 The standard Divide-and-Conquer algorithm usually works as follows: 1. spend some time handling the base case 2. if not at the base case, divide the problem up into smaller subproblems: D(n) 3. make recursive calls to handle all the subproblems created on step 2: T(n/b) 4. combine results created by recursive calls on step 3: C(n) Max-Heapify is a degenerate (meaning not standard) version of a Divide-and-Conquer algorithm Multiple base cases, appearing in line 3, 6 and 8, constant time for any base case is Θ(1): 3 if l > A.heap-size and 6 if r > A.heap-size then Max-Heapify has reached the base case, i.e., Max-Heapify has reached a node in the tree with empty left and right subtrees. 8 if largest = i then Max-Heapify has reached the base case, i.e., Max-Heapify has reached a node in the tree with empty left and right subtrees or the parent is larger than either child. There is no combining part to this algorithm, i.e., no work is done after the recursive call returns since solution occurs in place. Applying recurrence analysis: T(n) = a * T(n/b) + f(n) a = number of subproblems n/b = size of the subproblems f(n) = D(n) + C(n) For Max-Heapify a = 1, i.e., there is only one recursive call made n/b = (2/3) * n, is the worst case size of the one subproblem The worst case is when the last level of the tree is half full. Thats when the left subtree has one entire full level as compared to the right subtree. In this worst case, Max-Heapify has to "float down" through this left subtree. The size of the left subtree is (2/3) * n, see table for numeric analysis.homepages.ius.edu/RWISMAN/C455/html/notes/Chapter6/heapify.htm 4/5
  5. 5. 3/7/13 Heapify f(n) = Θ(1), all the work done in lines 1 - 9 takes a constant time T(n) = T(2n/3) + Θ(1) Applying Master Method a=1 b = 3/2 f(n) = 1 nlogba = nlog3/21 = n0 = 1 Case 2 applies since f(n) = Θ(nlogba) = Θ(1) T(n) = Θ(lg n) Since the height h = ⌊lg n⌋, we can also say that Max-Heapify is Θ(h) Max-Heapify (A, i) 1 l ← Left (i) 2 r ← Right (i) 3 if l ≤ A.heap-size and A[l] > A[i] 4 then largest ← l 5 else largest ← i 6 if r ≤ A.heap-size and A[r] > A[largest] 7 then largest ← r 8 if largest ≠ i then 9 exchange A[i] ↔ A[largest] 10 Max-Heapify (A, largest) Question 6.4.3 - Give an algorithm to determine if an array is a heap. What is the recurrence equation? Determine the run time? Does this make sense?homepages.ius.edu/RWISMAN/C455/html/notes/Chapter6/heapify.htm 5/5

×