8template <
class Key,
class Value>
13inline char *
knAlign(
void *p,
unsigned long sz)
15 return (
char*)(((
unsigned long)p + (sz - 1)) & ~(sz - 1));
18template <
class Key,
class Value>
30 Heap4(Key sup, Key infimum,
int cap) :
35 data[0].key = infimum;
36 data[capacity + 1].key = sup;
37 data[capacity + 2].key = sup;
38 data[capacity + 3].key = sup;
58template <
class Key,
class Value>
64 Key sup = getSupremum();
65 for (
int i = 1; i <= capacity; i++) {
70template <
class Key,
class Value>
75 *value = getMinValue();
79template <
class Key,
class Value>
95 if (finalLayerDist == finalLayerSize) {
100 minKey = data[succ].key;
106 otherKey = data[succ + 1].key;
107 if (otherKey < minKey) { minKey = otherKey; delta = 1; }
108 otherKey = data[succ + 2].key;
109 if (otherKey < minKey) { minKey = otherKey; delta = 2; }
110 otherKey = data[succ + 3].key;
111 if (otherKey < minKey) { minKey = otherKey; delta = 3; }
116 data[hole].key = minKey;
117 data[hole].value = data[succ].value;
121 succ = succ - layerPos + layerSize;
128 Key bubble = data[sz].key;
132 int layerDist = layerSize - layerPos - 1;
133 int pred = hole + layerDist - layerSize;
136 pred = pred - layerDist;
137 while (data[pred].key > bubble) {
138 data[hole] = data[pred];
140 pred = hole + layerDist - layerSize;
143 pred = pred - layerDist;
147 data[hole].key = bubble;
148 data[hole].value = data[sz].value;
150 data[sz].key = getSupremum();
154template <
class Key,
class Value>
159 Debug4(cout <<
"insert(" << k <<
", " << v <<
")" << endl);
161 int layerSize = finalLayerSize;
162 int layerDist = finalLayerDist;
164 if (finalLayerDist == -1) {
166 finalLayerSize <<= 2;
167 finalLayerDist = finalLayerSize - 1;
171 int pred = hole + layerDist - layerSize;
174 pred = pred - layerDist;
175 Key predKey = data[pred].key;
176 while (predKey > k) {
177 data[hole].key = predKey;
178 data[hole].value = data[pred].value;
180 pred = hole + layerDist - layerSize;
183 pred = pred - layerDist;
184 predKey = data[pred].key;
189 data[hole].value = v;
192template <
class Key,
class Value>
197 for (
int layerSize = 1; pos <
size; layerSize <<= 2) {
198 for (
int i = 0; i < layerSize && pos + i <=
size; i++) {
199 cout << data[pos + i].key <<
" ";
Value getMinValue() const
Heap4(Key sup, Key infimum, int cap)
void deleteMin(Key *key, Value *value)
void insert(Key k, Value v)
char * knAlign(void *p, unsigned long sz)
const unsigned long LineSize
char * knAlign(void *p, unsigned long sz)
const unsigned long LineSize