18template <
class Key,
class Value>
23template <
class Key,
class Value,
int capacity>
28 Element data[capacity + 2];
32 data[0].key = infimum;
33 data[capacity + 1].key = sup;
54template <
class Key,
class Value,
int capacity>
58 Key sup = getSupremum();
59 for (
int i = 1; i <= capacity; i++) {
67template <
class Key,
class Value,
int capacity>
78 Key key1 = data[succ].key;
79 Key key2 = data[succ + 1].key;
82 data[hole].key = key2;
83 data[hole].value = data[succ].value;
85 data[hole].key = key1;
86 data[hole].value = data[succ].value;
93 Key bubble = data[sz].key;
95 while (data[pred].key > bubble) {
96 data[hole] = data[pred];
102 data[hole].key = bubble;
103 data[hole].value = data[sz].value;
105 data[
size].key = getSupremum();
112template <
class Key,
class Value,
int capacity>
117 const Key sup = getSupremum();
118 Element *
const beyond = to + sz;
119 Element *
const root = data + 1;
120 while (to < beyond) {
129 Key key1 = data[succ ].key;
130 Key key2 = data[succ + 1].key;
133 data[hole].key = key2;
134 data[hole].value = data[succ].value;
136 data[hole].key = key1;
137 data[hole].value = data[succ].value;
144 data[hole].key = sup;
150template <
class Key,
class Value,
int capacity>
155 Debug4(cout <<
"insert(" << k <<
", " << v <<
")" << endl);
159 int pred = hole >> 1;
160 Key predKey = data[pred].key;
161 while (predKey > k) {
162 data[hole].key = predKey;
163 data[hole].value = data[pred].value;
166 predKey = data[pred].key;
171 data[hole].value = v;
176template <
class Key,
class Value>
208 int initWinner(
int root);
209 void updateOnInsert(
int node, Key newKey,
int newIndex,
210 Key *winnerKey,
int *winnerIndex,
int *mask);
211 void deallocateSegment(
int index);
214 void rebuildLooserTree();
215 int segmentIsEmpty(
int i);
241template <
class Key,
class Value>
265 void refillBuffer1();
266 void refillBuffer11(
int sz);
267 void refillBuffer12(
int sz);
268 void refillBuffer13(
int sz);
269 void refillBuffer14(
int sz);
270 int refillBuffer2(
int k);
271 int makeSpaceAvailable(
int level);
272 void emptyInsertHeap();
273 Key getSupremum()
const {
return buffer2[0][
KNN].key; }
274 int getSize1( )
const {
return ( buffer1 +
KNBufferSize1) - minBuffer1; }
275 int getSize2(
int i)
const {
return &(buffer2[i][
KNN]) - minBuffer2[i]; }
285template <
class Key,
class Value>
294template <
class Key,
class Value>
296 Key key1 = minBuffer1->key;
300 *value = minBuffer1->value;
307template <
class Key,
class Value>
309 Key key1 = minBuffer1->key;
313 *value = minBuffer1->value;
326template <
class Key,
class Value>
328 if (insertHeap.
getSize() ==
KNN) { emptyInsertHeap(); }
void deleteMinFancy(Key *key, Value *value)
BinaryHeap(Key sup, Key infimum)
void insert(Key k, Value v)
Value getMinValue() const
void insert(Key key, Value value)
void deleteMin(Key *key, Value *value)
KNHeap(Key sup, Key infimum)
void getMin(Key *key, Value *value)
void multiMergeUnrolled7(Element *to, int l)
void multiMergeUnrolled8(Element *to, int l)
void multiMergeUnrolled5(Element *to, int l)
void multiMerge(Element *to, int l)
void multiMergeUnrolled6(Element *to, int l)
void multiMergeUnrolled10(Element *to, int l)
void multiMergeK(Element *to, int l)
void insertSegment(Element *to, int sz)
void multiMergeUnrolled9(Element *to, int l)
void multiMergeUnrolled3(Element *to, int l)
void multiMergeUnrolled4(Element *to, int l)