|
CS 3343/3341 Analysis of Algorithms Fall 2012 Recitation 6 Heaps, etc. Partial Answers |
0-based heaps:
|
MaxHeapify2(A, i) { while(true) { l = Left(i); r = Right(i); if (l <= A.heapsize && A[l] > A[i]) largest = l; else largest = i; if (r <= A.heapsize && A[r] > A[largest]) largest = r; if (largest == i) return; exchange(A, i, largest); i = largest; } } |
after buildMaxHeap: heapsize:8, heap: 25, 17, 20, 7, 2, 13, 8, 4, heapsort,after step 8:heapsize:7, heap: 20, 17, 13, 7, 2, 4, 8, 25, heapsort,after step 7:heapsize:6, heap: 17, 8, 13, 7, 2, 4, 20, 25, heapsort,after step 6:heapsize:5, heap: 13, 8, 4, 7, 2, 17, 20, 25, heapsort,after step 5:heapsize:4, heap: 8, 7, 4, 2, 13, 17, 20, 25, heapsort,after step 4:heapsize:3, heap: 7, 2, 4, 8, 13, 17, 20, 25, heapsort,after step 3:heapsize:2, heap: 4, 2, 7, 8, 13, 17, 20, 25, heapsort,after step 2:heapsize:1, heap: 2, 4, 7, 8, 13, 17, 20, 25, heapsize:1, heap: 2, 4, 7, 8, 13, 17, 20, 25, |
main: heapsize:12, heap: 15 13 9 5 12 8 7 4 0 6 2 1 maxHeapify: heapsize:11, heap: 1 13 9 5 12 8 7 4 0 6 2 maxHeapify: heapsize:11, heap: 13 1 9 5 12 8 7 4 0 6 2 maxHeapify: heapsize:11, heap: 13 12 9 5 1 8 7 4 0 6 2 maxHeapify: heapsize:11, heap: 13 12 9 5 6 8 7 4 0 1 2 Max of heap: 15 main: heapsize:11, heap: 13 12 9 5 6 8 7 4 0 1 2 |
main: heapsize:12, heap: 15 13 9 5 12 8 7 4 0 6 2 1 maxHeapInsert: heapsize:12, heap: 15 13 9 5 12 8 7 4 0 6 2 1 heapIncreaseKey: heapsize:13, heap: 15 13 9 5 12 8 7 4 0 6 2 1 -2000000000 heapIncreaseKey: heapsize:13, heap: 15 13 9 5 12 8 7 4 0 6 2 1 10 heapIncreaseKey: heapsize:13, heap: 15 13 9 5 12 10 7 4 0 6 2 1 8 heapIncreaseKey: heapsize:13, heap: 15 13 10 5 12 9 7 4 0 6 2 1 8 main: heapsize:13, heap: 15 13 10 5 12 9 7 4 0 6 2 1 8 |
// PQueueInt.java: priority queue of integers public class PQueueInt { private int[] A; private int heapsize; public PQueueInt(int[] Ap, int hs) { A = Ap; heapsize = hs; } public int qSize() { return heapsize; } public int heapMaximum() { if (heapsize < 1) { System.out.println("Empty Queue"); System.exit(0); } return A[1]; } public int heapExtractMax() { if (heapsize < 1) { System.out.println("Heap Underflow"); System.exit(0); } int max = A[1]; A[1] = A[heapsize]; heapsize--; maxHeapify(1); return max; } private int parent(int i) {return i/2;} private int left (int i) {return 2*i;} private int right (int i) {return 2*i + 1;} private void exchange(int i, int largest) { int temp = A[i]; A[i] = A[largest]; A[largest] = temp; } private void maxHeapify(int i) { printheap("maxHeapify"); int l = left(i); int r = right(i); int largest; if (l <= heapsize && A[l] > A[i]) largest = l; else largest = i; if (r <= heapsize && A[r] > A[largest]) largest = r; if (largest != i) { exchange(i, largest); maxHeapify(largest); } } | public void maxHeapInsert(int key) { if (heapsize >= A.length - 1) { System.out.println("Heap Overflow"); System.exit(1); } printheap("maxHeapInsert"); heapsize++; A[heapsize] = -2000000000; heapIncreaseKey(heapsize, key); } void heapIncreaseKey(int i, int key) { if (key < A[i]) { System.out.println("New key < Current"); System.exit(2); } printheap("heapIncreaseKey"); A[i] = key; printheap("heapIncreaseKey"); while (i > 1 && A[parent(i)] < A[i]) { exchange(i, parent(i)); i = parent(i); printheap("heapIncreaseKey"); } } public void printheap(String id) { System.out.print(id + ": heapsize:" + heapsize + ", heap: "); for (int i = 1; i <= heapsize; i++) { System.out.print(A[i] + " "); } System.out.println(); } public static void main(String[] args) { int[] A = {0,15,13,9,5,12,8,7,4,0,6,2,1,-1,-1,-1}; int heapsize = 12; PQueueInt pq = new PQueueInt(A, heapsize); pq.printheap("main"); // do one of the other of the two below: System.out.println("Max of heap: " + pq.heapExtractMax()); // Problem 2 // pq.maxHeapInsert(10); // Problem 3 pq.printheap("main"); } } |
n! C(n,k) = ------------- k! * (n-k)!Thus C(7,3) = 7!/(3!*4!) = 7*6*5/(3*2*1) = 35.) [C(n,k) is called the combinations of n things taken k at a time. It is also called the binomial coefficient, since it is the kth coefficient of (x + y)n. C(n,k) is also commonly denoted by putting n over k (no line between) and enclosing in parentheses.]