# HG changeset patch
# User Peter Kovacs <kpeter@inf.elte.hu>
# Date 1247210233 -7200
# Node ID 39a5b48bcace4e67c679ae38cd9493203999171b
# Parent 7124b2581f7244a6eac484b49856815b30b5a625
Small improvements in heap implementations (#301)
diff --git a/lemon/fourary_heap.h b/lemon/fourary_heap.h
a
|
b
|
|
165 | 165 | } |
166 | 166 | |
167 | 167 | void bubbleDown(int hole, Pair p, int length) { |
168 | | int child = firstChild(hole); |
169 | | while( child<length && length>1 ) { |
170 | | child = findMin(child,length); |
171 | | if( !less(_data[child], p) ) |
172 | | goto ok; |
173 | | move(_data[child], hole); |
174 | | hole = child; |
175 | | child = firstChild(hole); |
| 168 | if( length>1 ) { |
| 169 | int child = firstChild(hole); |
| 170 | while( child<length ) { |
| 171 | child = findMin(child, length); |
| 172 | if( !less(_data[child], p) ) |
| 173 | goto ok; |
| 174 | move(_data[child], hole); |
| 175 | hole = child; |
| 176 | child = firstChild(hole); |
| 177 | } |
176 | 178 | } |
177 | 179 | ok: |
178 | 180 | move(p, hole); |
diff --git a/lemon/pairing_heap.h b/lemon/pairing_heap.h
a
|
b
|
|
208 | 208 | /// This function removes the item having minimum priority. |
209 | 209 | /// \pre The heap must be non-empty. |
210 | 210 | void pop() { |
211 | | int TreeArray[_num_items]; |
212 | | int i=0, num_child=0, child_right = 0; |
| 211 | std::vector<int> trees; |
| 212 | int i=0, child_right = 0; |
213 | 213 | _data[_min].in=false; |
214 | 214 | |
215 | 215 | if( -1!=_data[_min].child ) { |
216 | 216 | i=_data[_min].child; |
217 | | TreeArray[num_child] = i; |
| 217 | trees.push_back(i); |
218 | 218 | _data[i].parent = -1; |
219 | 219 | _data[_min].child = -1; |
220 | 220 | |
221 | | ++num_child; |
222 | 221 | int ch=-1; |
223 | 222 | while( _data[i].child!=-1 ) { |
224 | 223 | ch=_data[i].child; |
225 | 224 | if( _data[ch].left_child && i==_data[ch].parent ) { |
226 | | i=ch; |
227 | | //break; |
| 225 | break; |
228 | 226 | } else { |
229 | 227 | if( _data[ch].left_child ) { |
230 | 228 | child_right=_data[ch].parent; |
… |
… |
|
237 | 235 | _data[i].degree=0; |
238 | 236 | } |
239 | 237 | _data[child_right].parent = -1; |
240 | | TreeArray[num_child] = child_right; |
| 238 | trees.push_back(child_right); |
241 | 239 | i = child_right; |
242 | | ++num_child; |
243 | 240 | } |
244 | 241 | } |
245 | 242 | |
| 243 | int num_child = trees.size(); |
246 | 244 | int other; |
247 | 245 | for( i=0; i<num_child-1; i+=2 ) { |
248 | | if ( !_comp(_data[TreeArray[i]].prio, |
249 | | _data[TreeArray[i+1]].prio) ) { |
250 | | other=TreeArray[i]; |
251 | | TreeArray[i]=TreeArray[i+1]; |
252 | | TreeArray[i+1]=other; |
| 246 | if ( !_comp(_data[trees[i]].prio, _data[trees[i+1]].prio) ) { |
| 247 | other=trees[i]; |
| 248 | trees[i]=trees[i+1]; |
| 249 | trees[i+1]=other; |
253 | 250 | } |
254 | | fuse( TreeArray[i], TreeArray[i+1] ); |
| 251 | fuse( trees[i], trees[i+1] ); |
255 | 252 | } |
256 | 253 | |
257 | 254 | i = (0==(num_child % 2)) ? num_child-2 : num_child-1; |
258 | 255 | while(i>=2) { |
259 | | if ( _comp(_data[TreeArray[i]].prio, |
260 | | _data[TreeArray[i-2]].prio) ) { |
261 | | other=TreeArray[i]; |
262 | | TreeArray[i]=TreeArray[i-2]; |
263 | | TreeArray[i-2]=other; |
| 256 | if ( _comp(_data[trees[i]].prio, _data[trees[i-2]].prio) ) { |
| 257 | other=trees[i]; |
| 258 | trees[i]=trees[i-2]; |
| 259 | trees[i-2]=other; |
264 | 260 | } |
265 | | fuse( TreeArray[i-2], TreeArray[i] ); |
| 261 | fuse( trees[i-2], trees[i] ); |
266 | 262 | i-=2; |
267 | 263 | } |
268 | | _min = TreeArray[0]; |
| 264 | _min = trees[0]; |
269 | 265 | } |
270 | | |
271 | | if ( 0==num_child ) { |
| 266 | else { |
272 | 267 | _min = _data[_min].child; |
273 | 268 | } |
274 | 269 | |
275 | 270 | if (_min >= 0) _data[_min].left_child = false; |
276 | | |
277 | 271 | --_num_items; |
278 | 272 | } |
279 | 273 | |