Main Page   Class Hierarchy   Compound List   File List   Compound Members   File Members  

Heap.cc

Go to the documentation of this file.
00001 /*
00002     File:       Heap.cc
00003 
00004     Function:   
00005 
00006     Author:     Andrew Willmott
00007 
00008     Notes:      
00009 */
00010 
00011 #include "cl/Heap.h"
00012 
00013 
00014 HeapEntry *Heap::RemoveMax()
00015 {
00016     HeapEntry   *result;
00017 
00018     if (heap.NumItems() == 0)
00019         return(0);
00020         
00021     result = heap[0];
00022     result->heapIdx = -1;
00023 
00024     heap[0] = heap.Last();
00025     heap[0]->heapIdx = 0;
00026     heap.Shrink(1);
00027 
00028     HeapifyDown(0);
00029 
00030     return(result);
00031 }
00032 
00033 Void Heap::Insert(HeapEntry *he)
00034 {   
00035     heap.Append(he);
00036     he->heapIdx = heap.NumItems() - 1;
00037 
00038     HeapifyUp(heap.NumItems() - 1);
00039 }
00040     
00041 Void Heap::Delete(HeapEntry *he)
00042 {   
00043     Assert(he->heapIdx >= 0, "Heap entry already deleted");
00044 
00045     if (he->heapIdx < 0)
00046         return;
00047         
00048     heap[he->heapIdx] = heap.Last();
00049     heap[he->heapIdx]->heapIdx = he->heapIdx;
00050     heap.Shrink(1);
00051     
00052     HeapifyDown(he->heapIdx);
00053 
00054     he->heapIdx = -1;
00055 }
00056     
00057 Void Heap::Update(HeapEntry *he)
00058 {   
00059     Int     i = he->heapIdx;
00060     
00061     Assert(i >= 0, "Can't update deleted entry");
00062 
00063     if (i > 0 && heap[Parent(i)]->cost < he->cost)
00064         HeapifyUp(i);
00065     else
00066         HeapifyDown(i);
00067 }
00068     
00069 Void Heap::HeapifyDown(Int i)
00070 {
00071     Int     child, parent;
00072 
00073     parent = i;
00074     child = Left(i);
00075 
00076     while (child < heap.NumItems())
00077     {
00078         if (child + 1 < heap.NumItems() && heap[child]->cost < heap[child + 1]->cost)
00079             child++;
00080 
00081         if (heap[child]->cost > heap[parent]->cost)
00082         {
00083             Swap(heap[child]->heapIdx, heap[parent]->heapIdx);
00084             Swap(heap[child], heap[parent]);
00085 
00086             parent = child;
00087             child = Left(parent);
00088         }
00089         else
00090             break;
00091     }
00092 }
00093 
00094 Void Heap::HeapifyUp(Int i)
00095 {
00096     Int     child, parent;
00097     
00098     child = i;
00099     parent = Parent(child);
00100 
00101     while (parent >= 0)
00102     {
00103         if (heap[parent]->cost < heap[child]->cost)
00104         {
00105             Swap(heap[child]->heapIdx, heap[parent]->heapIdx);
00106             Swap(heap[child], heap[parent]);
00107             child = parent;
00108             parent = Parent(child);
00109         }
00110         else
00111             break;
00112     }
00113 }

Generated at Sat Aug 5 00:16:32 2000 for Class Library by doxygen 1.1.0 written by Dimitri van Heesch, © 1997-2000