# 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 | |