_k_heap.c
上传用户:gzelex
上传日期:2007-01-07
资源大小:707k
文件大小:4k
开发平台:

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  _k_heap.c
  6. +
  7. +  Copyright (c) 1995  by  Max-Planck-Institut fuer Informatik
  8. +  Im Stadtwald, 66123 Saarbruecken, Germany     
  9. +  All rights reserved.
  10. *******************************************************************************/
  11. #include <LEDA/impl/k_heap.h>
  12. #define KEY(i)   (HEAP[i]->key)
  13. #define INF(i)   (HEAP[i]->inf)
  14. k_heap::k_heap(int n, int k)  
  15. { if (n<=0) error_handler(1,string("k_heap constructor: illegal size = %d",n));
  16.   K = k;
  17.   HEAP = new k_heap_item[n+2];
  18.   for(int i = 0; i <= n; i++) HEAP[i] = nil;
  19.   count = 0; 
  20.   max_size = n;
  21. }
  22. k_heap::k_heap(const k_heap& H)
  23. { K = H.K;
  24.   max_size = H.max_size;
  25.   count = H.count; 
  26.   HEAP = new k_heap_item[max_size+2];
  27.   for(int i = 1; i <= count; i++) 
  28.   { HEAP[i] = new k_heap_elem(H.HEAP[i]->key, H.HEAP[i]->inf,i);
  29.     H.copy_key(HEAP[i]->key);
  30.     H.copy_inf(HEAP[i]->inf);
  31.   }
  32. }
  33. k_heap& k_heap::operator=(const k_heap& H)
  34. { clear();
  35.   delete HEAP;
  36.   K = H.K;
  37.   max_size = H.max_size;
  38.   count = H.count; 
  39.   HEAP = new k_heap_item[max_size+2];
  40.   for(int i = 1; i <= count; i++) 
  41.   { HEAP[i] = new k_heap_elem(H.HEAP[i]->key, H.HEAP[i]->inf,i);
  42.     copy_key(HEAP[i]->key);
  43.     copy_inf(HEAP[i]->inf);
  44.   }
  45.   return *this;
  46. }
  47. k_heap::~k_heap()  
  48. { clear();
  49.   delete HEAP; 
  50. }
  51. void k_heap::clear()
  52. { for(int i=1; i <= count; i++) 
  53.   { clear_key(KEY(i));
  54.     clear_inf(INF(i));
  55.     delete HEAP[i];
  56.    }
  57.   count = 0;
  58. }
  59. void k_heap::rise(int pos, k_heap_item it)
  60.   HEAP[0] = it;  // use "it" as stopper
  61.   register int         pi = pos/K;        // parent index
  62.   register k_heap_item p  = HEAP[pi];     // parent node
  63.   if (int_type())
  64.      while(p->key > it->key)
  65.      { HEAP[pos] = p;
  66.        p->index = pos;
  67.        pos = pi;
  68.        pi /= K;
  69.        p = HEAP[pi];
  70.       }
  71.   else
  72.      while (cmp(p->key,it->key) > 0)
  73.      { HEAP[pos] = p;
  74.        p->index = pos;
  75.        pos = pi;
  76.        pi /= K;
  77.        p = HEAP[pi];
  78.       }
  79.   HEAP[pos] = it;
  80.   it->index = pos;
  81. }
  82. void k_heap::sink(int pos, k_heap_item it)
  83.   register int ci = K*pos;    // child index
  84.   register k_heap_item p;     // child node
  85.   HEAP[count+1] = HEAP[count];   // stopper
  86.   if (int_type())
  87.      while (ci <= count)
  88.      { 
  89.        p = HEAP[ci];
  90.        int r = Min(count+1,ci+K);
  91.        for (int j=ci+1;j<r;j++)
  92.            if (cmp(KEY(j),p->key)<0 ) 
  93.             { ci = j;
  94.               p = HEAP[j];
  95.              }
  96.        if (it->key > p->key) 
  97.        { HEAP[pos] = p;
  98.          p->index = pos;
  99.          pos = ci;
  100.          ci *= K;
  101.         }
  102.        else  break;
  103.       }
  104.   else
  105.      while (ci <= count)
  106.      { 
  107.        p = HEAP[ci];
  108.        int r = Min(count+1,ci+K);
  109.        for (int j=ci+1;j<r;j++)
  110.            if (cmp(KEY(j),p->key)<0 ) 
  111.             { ci = j;
  112.               p = HEAP[j];
  113.              }
  114.        
  115.        if (cmp(it->key,p->key)>0) 
  116.        { HEAP[pos] = p;
  117.          p->index = pos;
  118.          pos = ci;
  119.          ci *= K;
  120.         }
  121.         else  break;
  122.       }
  123.   HEAP[pos] =it;
  124.   it->index = pos;
  125. }
  126. void k_heap::decrease_key(k_heap_item it, GenPtr k)
  127. {
  128. //if (cmp(it->key,k)<0) error_handler(1,"k-heap:key too large in decrease_key");
  129.   clear_key(it->key);
  130.   copy_key(k);
  131.   it->key = k;
  132.   rise(it->index, it);
  133. }
  134. k_heap_item k_heap::insert(GenPtr k, GenPtr i) 
  135. {
  136.   if (count == max_size) error_handler(1,"k_heap: overflow");
  137.   count++;
  138.   copy_key(k);
  139.   copy_inf(i);
  140.   k_heap_item it = new k_heap_elem(k,i,count);
  141.   rise(count,it);
  142.   return it;
  143. }
  144. void k_heap::del_item(k_heap_item it)
  145. { k_heap_item p = HEAP[count];
  146.   HEAP[count] = nil;
  147.   count--;
  148.   if (it != p)
  149.   { if (cmp(p->key,it->key) > 0)
  150.        sink(it->index, p);
  151.     else
  152.        rise(it->index, p);
  153.    }
  154.   clear_key(it->key);
  155.   clear_inf(it->inf);
  156.   delete it;
  157. }
  158. void k_heap::change_inf(k_heap_item it, GenPtr i) 
  159. { clear_inf(it->inf);
  160.   copy_inf(i);
  161.   it->inf = i; 
  162.  }
  163. void k_heap::print()
  164.   cout << "count = " << count << endl;
  165.   for(int i=1;i<=count;i++) 
  166.   { print_key(KEY(i));
  167.     //cout << "-";
  168.     //print_inf(INF(i));
  169.     cout << "  ";
  170.    }
  171.   newline;
  172. }