source:
GTP/trunk/Lib/Geom/shared/GTGeometry/src/libs/gfx/tools/heap.cxx
@
1600
Revision 1600, 1.9 KB checked in by gumbau, 18 years ago (diff) |
---|
Rev | Line | |
---|---|---|
[774] | 1 | //#include <iostream.h> |
2 | #include <gfx/std.h> | |
3 | #include <gfx/tools/Heap.h> | |
4 | ||
[1025] | 5 | using namespace simplif; |
[774] | 6 | |
7 | void Heap::swap(int i,int j) | |
8 | { | |
[1526] | 9 | heap_node tmp = ref(i); |
[774] | 10 | |
[1526] | 11 | ref(i) = ref(j); |
12 | ref(j) = tmp; | |
[774] | 13 | |
[1526] | 14 | ref(i).obj->setHeapPos(i); |
15 | ref(j).obj->setHeapPos(j); | |
[774] | 16 | } |
17 | ||
18 | void Heap::upheap(int i) | |
19 | { | |
[1526] | 20 | if( i==0 ) return; |
[774] | 21 | |
[1526] | 22 | if( ref(i).import > ref(parent(i)).import ) |
23 | { | |
24 | swap(i,parent(i)); | |
25 | upheap(parent(i)); | |
26 | } | |
[774] | 27 | } |
28 | ||
29 | void Heap::downheap(int i) | |
30 | { | |
[1526] | 31 | if (i>=size) return; // perhaps just extracted the last |
[774] | 32 | |
[1526] | 33 | int largest = i, |
34 | l = left(i), | |
35 | r = right(i); | |
[774] | 36 | |
[1526] | 37 | if( l<size && ref(l).import > ref(largest).import ) largest = l; |
38 | if( r<size && ref(r).import > ref(largest).import ) largest = r; | |
[774] | 39 | |
[1526] | 40 | if( largest != i ) { |
41 | swap(i,largest); | |
42 | downheap(largest); | |
43 | } | |
[774] | 44 | } |
45 | ||
46 | void Heap::insert(Heapable *t,float v) | |
47 | { | |
[1526] | 48 | if( size == maxLength() ) |
49 | { | |
50 | std::cerr << "NOTE: Growing heap from " << size << " to " << 2*size << std::endl; | |
51 | resize(2*size); | |
52 | } | |
[774] | 53 | |
[1526] | 54 | int i = size++; |
[774] | 55 | |
[1526] | 56 | ref(i).obj = t; |
57 | ref(i).import = v; | |
[774] | 58 | |
[1526] | 59 | ref(i).obj->setHeapPos(i); |
[774] | 60 | |
[1526] | 61 | upheap(i); |
[774] | 62 | } |
63 | ||
64 | void Heap::update(Heapable *t,float v) | |
65 | { | |
[1526] | 66 | int i = t->getHeapPos(); |
[774] | 67 | |
[1526] | 68 | if( i >= size ) |
69 | { | |
[774] | 70 | std::cerr << "WARNING: Attempting to update past end of heap!" << std::endl; |
71 | return; | |
[1526] | 72 | } |
73 | else if( i == NOT_IN_HEAP ) | |
74 | { | |
[774] | 75 | std::cerr << "WARNING: Attempting to update object not in heap!" << std::endl; |
76 | return; | |
[1526] | 77 | } |
[774] | 78 | |
[1526] | 79 | float old=ref(i).import; |
80 | ref(i).import = v; | |
[774] | 81 | |
[1526] | 82 | if( v<old ) |
83 | downheap(i); | |
84 | else | |
85 | upheap(i); | |
[774] | 86 | } |
87 | ||
[1526] | 88 | heap_node *Heap::extract() |
89 | { | |
90 | if( size<1 ) return 0; | |
[774] | 91 | |
[1526] | 92 | swap(0,size-1); |
93 | size--; | |
[774] | 94 | |
[1526] | 95 | downheap(0); |
96 | ||
97 | ref(size).obj->notInHeap(); | |
98 | ||
99 | return &ref(size); | |
100 | } | |
101 | ||
[774] | 102 | heap_node *Heap::kill(int i) |
103 | { | |
[1526] | 104 | if( i>=size ) |
[774] | 105 | std::cerr << "WARNING: Attempt to delete invalid heap node." << std::endl; |
106 | ||
[1526] | 107 | swap(i, size-1); |
108 | size--; | |
109 | ref(size).obj->notInHeap(); | |
[774] | 110 | |
[1526] | 111 | if( ref(i).import < ref(size).import ) |
[774] | 112 | downheap(i); |
[1526] | 113 | else |
[774] | 114 | upheap(i); |
115 | ||
[1526] | 116 | return &ref(size); |
117 | } | |
[774] | 118 |
Note: See TracBrowser
for help on using the repository browser.