|
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.]