Subversion Repositories Code-Repo

Rev

Rev 95 | Blame | Compare with Previous | Last modification | View Log | RSS feed

import java.nio.ByteBuffer;

/** Max-heap implementation */
public class MaxHeap {
        private LRUBuffer Heap; // Pointer to the heap array
        private long size; // Number of things in heap
        
        private byte[] record1 = new byte[4];
        private byte[] record2 = new byte[4];
        private ByteBuffer buff1;
        private ByteBuffer buff2;
        
        /** Constructor supporting preloading of heap contents */
        public MaxHeap(LRUBuffer buf, long size) {
                this.Heap = buf;
                this.size = size;
        }

        /** @return True if pos a leaf position, false otherwise */
        public boolean isLeaf(long pos) {
                return (pos >= size / 2) && (pos < size);
        }

        /** @return Position for left child of pos */
        public long leftchild(long pos) {
                assert pos < size / 2 : "Position has no left child";
                return 2 * pos + 1;
        }

        /** @return Position for right child of pos */
        public long rightchild(long pos) {
                assert pos < (size - 1) / 2 : "Position has no right child";
                return 2 * pos + 2;
        }

        /** @return Position for parent */
        public long parent(long pos) {
                assert pos > 0 : "Position has no parent";
                return (pos - 1) / 2;
        }

        /** Heapify contents of Heap */
        public void buildheap() {
                for (long i = size / 2 - 1; i >= 0; i--)
                        siftdown(i);
        }

        /** Put element in its correct place */
        private void siftdown(long pos) {
                assert (pos >= 0) && (pos < size) : "Illegal heap position";
                
                while (!isLeaf(pos)) {
                        long j = leftchild(pos);
                        
//                      if ((j < (size - 1)) && (Heap[j].compareTo(Heap[j + 1]) < 0))
//                              j++; // j is now index of child with greater value
                        if (j < (size-1)) {
                                Heap.getBytes(record1, j);
                                buff1 = ByteBuffer.wrap(record1);
                                short val1 = buff1.getShort();
                                Heap.getBytes(record2, j+1);
                                buff2 = ByteBuffer.wrap(record2);
                                short val2 = buff2.getShort();
                                if (val1 < val2) {
                                        j++;    // j is now index of child with greater value
                                }
                                
                        }
                        
//                      if (Heap[pos].compareTo(Heap[j]) >= 0)
//                      return;
                        Heap.getBytes(record2, j);
                        Heap.getBytes(record1, pos);
                        buff1 = ByteBuffer.wrap(record1);
                        buff2 = ByteBuffer.wrap(record2);
                        short val1 = buff1.getShort();
                        short val2 = buff2.getShort();
                        if (val1 >= val2)
                                return;

//                      DSutil.swap(Heap, pos, j);
                        Heap.putBytes(record2, pos);
                        Heap.putBytes(record1, j);
                        
                        pos = j; // Move down
                }
        }

        /** Remove and return maximum value */
        public void removemax() {
                assert size > 0 : "Removing from empty heap";
                
                //DSutil.swap(Heap, 0, --size); // Swap maximum with last value
                Heap.getBytes(record1, 0);
                Heap.getBytes(record2, size-1);
                Heap.putBytes(record1, size-1);
                Heap.putBytes(record2, 0);
                
                size = size - 1;
                if (size != 0) // Not on last element
                        siftdown(0); // Put new heap root val in correct place
        }

        
//      /** @return Current size of the heap */
//      public long heapsize() {
//              return size;
//      }
        
//      /** Insert val into heap */
//      public void insert(E val) {
//              assert n < size : "Heap is full";
//              int curr = n++;
//              Heap[curr] = val; // Start at end of heap
//              // Now sift up until curr's parent's key > curr's key
//              while ((curr != 0) && (Heap[curr].compareTo(Heap[parent(curr)]) > 0)) {
//                      DSutil.swap(Heap, curr, parent(curr));
//                      curr = parent(curr);
//              }
//      }
        
//      /** Remove and return element at specified position */
//      public E remove(int pos) {
//              assert (pos >= 0) && (pos < n) : "Illegal heap position";
//              if (pos == (n - 1))
//                      n--; // Last element, no work to be done
//              else {
//                      DSutil.swap(Heap, pos, --n); // Swap with last value
//                      // If we just swapped in a big value, push it up
//                      while ((pos > 0) && (Heap[pos].compareTo(Heap[parent(pos)]) > 0)) {
//                              DSutil.swap(Heap, pos, parent(pos));
//                              pos = parent(pos);
//                      }
//                      if (n != 0)
//                              siftdown(pos); // If it is little, push down
//              }
//              return Heap[n];
//      }
}