# HG changeset patch # User Peter Kovacs <kpeter@inf.elte.hu> # Date 2009-07-10 09:17:13 # Node ID 39a5b48bcace4e67c679ae38cd9493203999171b # Parent 7124b2581f7244a6eac484b49856815b30b5a625 Small improvements in heap implementations (#301) diff --git a/lemon/fourary_heap.h b/lemon/fourary_heap.h --- a/lemon/fourary_heap.h +++ b/lemon/fourary_heap.h @@ -165,14 +165,16 @@ } void bubbleDown(int hole, Pair p, int length) { - int child = firstChild(hole); - while( child<length && length>1 ) { - child = findMin(child,length); - if( !less(_data[child], p) ) - goto ok; - move(_data[child], hole); - hole = child; - child = firstChild(hole); + if( length>1 ) { + int child = firstChild(hole); + while( child<length ) { + child = findMin(child, length); + if( !less(_data[child], p) ) + goto ok; + move(_data[child], hole); + hole = child; + child = firstChild(hole); + } } ok: move(p, hole); diff --git a/lemon/pairing_heap.h b/lemon/pairing_heap.h --- a/lemon/pairing_heap.h +++ b/lemon/pairing_heap.h @@ -208,23 +208,21 @@ /// This function removes the item having minimum priority. /// \pre The heap must be non-empty. void pop() { - int TreeArray[_num_items]; - int i=0, num_child=0, child_right = 0; + std::vector<int> trees; + int i=0, child_right = 0; _data[_min].in=false; if( -1!=_data[_min].child ) { i=_data[_min].child; - TreeArray[num_child] = i; + trees.push_back(i); _data[i].parent = -1; _data[_min].child = -1; - ++num_child; int ch=-1; while( _data[i].child!=-1 ) { ch=_data[i].child; if( _data[ch].left_child && i==_data[ch].parent ) { - i=ch; - //break; + break; } else { if( _data[ch].left_child ) { child_right=_data[ch].parent; @@ -237,43 +235,39 @@ _data[i].degree=0; } _data[child_right].parent = -1; - TreeArray[num_child] = child_right; + trees.push_back(child_right); i = child_right; - ++num_child; } } + int num_child = trees.size(); int other; for( i=0; i<num_child-1; i+=2 ) { - if ( !_comp(_data[TreeArray[i]].prio, - _data[TreeArray[i+1]].prio) ) { - other=TreeArray[i]; - TreeArray[i]=TreeArray[i+1]; - TreeArray[i+1]=other; + if ( !_comp(_data[trees[i]].prio, _data[trees[i+1]].prio) ) { + other=trees[i]; + trees[i]=trees[i+1]; + trees[i+1]=other; } - fuse( TreeArray[i], TreeArray[i+1] ); + fuse( trees[i], trees[i+1] ); } i = (0==(num_child % 2)) ? num_child-2 : num_child-1; while(i>=2) { - if ( _comp(_data[TreeArray[i]].prio, - _data[TreeArray[i-2]].prio) ) { - other=TreeArray[i]; - TreeArray[i]=TreeArray[i-2]; - TreeArray[i-2]=other; + if ( _comp(_data[trees[i]].prio, _data[trees[i-2]].prio) ) { + other=trees[i]; + trees[i]=trees[i-2]; + trees[i-2]=other; } - fuse( TreeArray[i-2], TreeArray[i] ); + fuse( trees[i-2], trees[i] ); i-=2; } - _min = TreeArray[0]; + _min = trees[0]; } - - if ( 0==num_child ) { + else { _min = _data[_min].child; } if (_min >= 0) _data[_min].left_child = false; - --_num_items; }