[Lemon-commits] Peter Kovacs: Smarter bubbleDown() in K-ary heap...

Lemon HG hg at lemon.cs.elte.hu
Mon Aug 31 12:21:04 CEST 2009


details:   http://lemon.cs.elte.hu/hg/lemon/rev/9314d9339475
changeset: 759:9314d9339475
user:      Peter Kovacs <kpeter [at] inf.elte.hu>
date:      Mon Jul 20 19:06:39 2009 +0200
description:
	Smarter bubbleDown() in K-ary heaps (#301)

diffstat:

 lemon/fourary_heap.h |  45 +++++++++++++++++----------------------------
 lemon/kary_heap.h    |  35 ++++++++++++++++++++---------------
 2 files changed, 37 insertions(+), 43 deletions(-)

diffs (120 lines):

diff --git a/lemon/fourary_heap.h b/lemon/fourary_heap.h
--- a/lemon/fourary_heap.h
+++ b/lemon/fourary_heap.h
@@ -131,29 +131,6 @@
       return _comp(p1.second, p2.second);
     }
 
-    int findMin(const int child, const int length) {
-      int min=child;
-      if( child+3<length ) {
-        if( less(_data[child+3], _data[min]) )
-          min=child+3;
-        if( less(_data[child+2], _data[min]) )
-          min=child+2;
-        if( less(_data[child+1], _data[min]) )
-          min=child+1;
-      }
-      else if( child+2<length ) {
-        if( less(_data[child+2], _data[min]) )
-          min=child+2;
-        if( less(_data[child+1], _data[min]) )
-          min=child+1;
-      }
-      else if( child+1<length ) {
-        if( less(_data[child+1], _data[min]) )
-          min=child+1;
-      }
-      return min;
-    }
-
     void bubbleUp(int hole, Pair p) {
       int par = parent(hole);
       while( hole>0 && less(p,_data[par]) ) {
@@ -167,14 +144,26 @@
     void bubbleDown(int hole, Pair p, int length) {
       if( length>1 ) {
         int child = firstChild(hole);
-        while( child<length ) {
-          child = findMin(child, length);
-          if( !less(_data[child], p) )
+        while( child+3<length ) {
+          int min=child;
+          if( less(_data[++child], _data[min]) ) min=child;
+          if( less(_data[++child], _data[min]) ) min=child;
+          if( less(_data[++child], _data[min]) ) min=child;
+          if( !less(_data[min], p) )
             goto ok;
-          move(_data[child], hole);
-          hole = child;
+          move(_data[min], hole);
+          hole = min;
           child = firstChild(hole);
         }
+        if ( child<length ) {
+          int min = child;
+          if( ++child<length && less(_data[child], _data[min]) ) min=child;
+          if( ++child<length && less(_data[child], _data[min]) ) min=child;
+          if( less(_data[min], p) ) {
+            move(_data[min], hole);
+            hole = min;
+          }
+        }
       }
     ok:
       move(p, hole);
diff --git a/lemon/kary_heap.h b/lemon/kary_heap.h
--- a/lemon/kary_heap.h
+++ b/lemon/kary_heap.h
@@ -138,16 +138,6 @@
       return _comp(p1.second, p2.second);
     }
 
-    int findMin(const int child, const int length) {
-      int min=child, i=1;
-      while( i<K && child+i<length ) {
-        if( less(_data[child+i], _data[min]) )
-          min=child+i;
-        ++i;
-      }
-      return min;
-    }
-
     void bubbleUp(int hole, Pair p) {
       int par = parent(hole);
       while( hole>0 && less(p,_data[par]) ) {
@@ -161,14 +151,29 @@
     void bubbleDown(int hole, Pair p, int length) {
       if( length>1 ) {
         int child = firstChild(hole);
-        while( child<length ) {
-          child = findMin(child, length);
-          if( !less(_data[child], p) )
+        while( child+K<=length ) {
+          int min=child;
+          for (int i=1; i<K; ++i) {
+            if( less(_data[child+i], _data[min]) )
+              min=child+i;
+          }
+          if( !less(_data[min], p) )
             goto ok;
-          move(_data[child], hole);
-          hole = child;
+          move(_data[min], hole);
+          hole = min;
           child = firstChild(hole);
         }
+        if ( child<length ) {
+          int min = child;
+          while (++child < length) {
+            if( less(_data[child], _data[min]) )
+              min=child;
+          }
+          if( less(_data[min], p) ) {
+            move(_data[min], hole);
+            hole = min;
+          }
+        }
       }
     ok:
       move(p, hole);



More information about the Lemon-commits mailing list