Heap1.java
Heap1.java — Python Source, 3 kB (3456 bytes)
File contents
import java.io.*; import java.util.HashMap; public class Heap1 { private /*@ spec_public @*/ /*@ rep rep @*/ HeapElem[] elems; private /*@ spec_public @*/ int numElems; public Heap1() { elems = new /*@ rep rep @*/ HeapElem[5]; numElems = 0; } /*@ invariant (\forall int i; i >= 0 && i < numElems; elems[i].heapPos == i && (readonly Object) elems[i].owner == (readonly Object) this); @*/ /*@ ensures elems.length > \old(elems.length) @ && numElems == \old(numElems); @*/ private void grow() { /*@ rep rep @*/ HeapElem[] newElems = new /*@ rep rep @*/ HeapElem[elems.length*2]; for (int i = 0; i < numElems; ++i) newElems[i] = elems[i]; elems = newElems; } /*@ requires e.heapPos == -1; @ ensures e.heapPos >= 0 && e.heapPos < numElems && @ (readonly Object) elems[e.heapPos] == (readonly Object) e && @ (\forall int i; i >= 0 && i < numElems; i == e.heapPos || @ (readonly Object) elems[i] != (readonly Object) e); @*/ public void enqueue(/*@ rep @*/ HeapElem e) { if (numElems >= elems.length) grow(); int pos = numElems++; int parent = pos / 2; while (pos > 0 && elems[parent].compareTo(e) > 0) { elems[parent].heapPos = pos; elems[pos] = elems[parent]; pos = parent; parent = pos / 2; } elems[pos] = e; e.heapPos = pos; } public /*@ rep @*/ HeapElem getFirst() { return elems[0]; } /*@ @ requires e.heapPos >= 0 && e.heapPos < numElems && @ (readonly Object) elems[e.heapPos] == (readonly Object) e; @ ensures (\forall int i; i >= 0 && i < numElems; @ (readonly Object) elems[i] != (readonly Object) e); @*/ public void remove(/*@ rep @*/ HeapElem e) { /*@ rep @*/ HeapElem last = elems[--numElems]; int pos = e.heapPos; e.heapPos = -1; if ((/*@ readonly @*/ Object) last == (/*@ readonly @*/ Object) e) return; int child = 2*pos+1; elems[pos] = last; last.heapPos = pos; while (child < numElems) { if (child + 1 < numElems && elems[child].compareTo(elems[child+1]) > 0) { child++; } if (elems[child].compareTo(last) > 0) break; elems[pos] = elems[child]; elems[pos].heapPos = pos; pos = child; child = 2*pos+1; } elems[pos] = last; last.heapPos = pos; } public boolean isEmpty() { return numElems == 0; } } class User { public void test() { Heap1 h1 = new Heap1(); IntHeapElem elem1 = new IntHeapElem(1); h1.enqueue(elem1); IntHeapElem elem2 = new IntHeapElem(2); h1.enqueue(elem2); HeapElem h1First = h1.getFirst(); h1.remove(h1First); Heap1 h2 = new Heap1(); h2.enqueue(h1First); } } abstract class HeapElem implements Comparable { // The position in the heap. /*@ spec_public @*/ int heapPos = -1; } class IntHeapElem extends HeapElem { int key; public IntHeapElem(int k) { key = k; } public int compareTo(Object other) { return key - ((IntHeapElem) other).key; } public /*@ pure @*/ boolean equals(/*@ nullable @*/ Object o) { if (o == null || !(o instanceof IntHeapElem)) return false; return key == ((IntHeapElem) o).key; } public /*@ pure @*/ String toString() { return "" + key; } }