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

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  _eb_tree.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/eb_tree.h>
  12. // Stefan  Naeher ( 1989 )
  13. // Michael Wenzel ( 1990 ) 
  14. // ----------------------------------------------------------
  15. //
  16. // Konstruktor & Destruktor
  17. //
  18. l_stratified::l_stratified(stratified_ptr b, int x)
  19. {
  20.   int t = b->min2();
  21.   if ( x == b->min() )
  22.   {
  23.     ma = t;
  24.     mi = b->max();
  25.   }
  26.   if ( x == t )
  27.   {
  28.     ma = b->min();
  29.     mi = b->max();
  30.   }
  31.   if ( x == b->max() )
  32.   {
  33.     ma = b->min();
  34.     mi = t;
  35.   }
  36. }
  37. stratified::stratified(int i)  
  38.   mi = ma = -1;
  39.   sz = 0; 
  40.   k = i;
  41.   top = 0;
  42.   bot = 0;
  43. }
  44. stratified::stratified(l_stratified_ptr l, int i)
  45.   mi = l->min();
  46.   ma = l->max();
  47.   sz = 2;
  48.   k = i;
  49.   top = 0;
  50.   bot = 0;
  51. }
  52. stratified::~stratified()  
  53.                                          // deallocate memory of sub-structures
  54.   if ((k>1) && (sz>2))
  55.   {                                      // delete stratified trees of bot
  56.     bot->clear(k);
  57.     if ( k <= 8 )
  58.       delete bot->l;
  59.     else
  60.       delete bot->d;
  61.     delete bot;
  62.     if ( top->size() <= 2 )
  63.       delete top;
  64.     else
  65.       delete (stratified_ptr)top;
  66.     top = 0;
  67.     bot = 0;
  68.   }
  69. }
  70. // ----------------------------------------------------------
  71. //
  72. // min2                  
  73. //
  74. // liefert 2. kleinstes Element, falls sz > 2
  75. //
  76. // -1 , sonst
  77. //
  78. // ----------------------------------------------------------
  79. int stratified::min2()
  80. {
  81.   if ( sz < 3 )
  82.     return -1;
  83.   int z = top->min();
  84.   l_stratified_ptr l_bot_ptr = l_stratified_ptr(bot->lookup(z,k));
  85.   return (mal_pot_2(z,down(k))) | (l_bot_ptr->min());
  86. }
  87. // ----------------------------------------------------------
  88. //
  89. // max2                  
  90. //
  91. // liefert 2. groesstes Element, falls sz > 2
  92. //
  93. // -1 , sonst
  94. //
  95. // ----------------------------------------------------------
  96. int stratified::max2()
  97. {
  98.   if ( sz < 3 )
  99.     return -1;
  100.   int z = top->max();
  101.   l_stratified_ptr l_bot_ptr = l_stratified_ptr(bot->lookup(z,k));
  102.   return (mal_pot_2(z,down(k))) | (l_bot_ptr->max());
  103. }
  104. // ----------------------------------------------------------
  105. //
  106. // succ                  
  107. //
  108. // liefert Nachfolger von x im Baum auf dieser Rekursionsstufe
  109. //                    falls existiert
  110. // -1 , sonst
  111. //
  112. // ----------------------------------------------------------
  113. int stratified::succ(int x) 
  114. {
  115.   if ( x >= ma ) return -1;
  116.   if ( x <  mi ) return mi;
  117.   if ( sz == 2 ) return ma;               // mi < x < ma
  118.                                           // sz >= 2 &&  k>1
  119.   int x1 = high_bits(x); 
  120.   int x2 = low_bits(x); 
  121.   GenPtr p = bot->lookup(x1,k);
  122.   l_stratified_ptr l_bot_ptr = l_stratified_ptr(p);
  123.   if ( (l_bot_ptr) && (l_bot_ptr->max()>x2) )
  124.   { 
  125.     if ( l_bot_ptr->size() <= 2 )             // l_stratified Struktur
  126.         return ( mal_pot_2(x1,down(k))) | ( l_bot_ptr->succ(x2) ) ;
  127.     else
  128.     {
  129.       stratified_ptr bot_ptr = stratified_ptr(p) ;
  130.       return (mal_pot_2(x1,down(k))) | (bot_ptr->succ(x2)) ;
  131.     }
  132.   }
  133.   else                                   // succ nicht in bot-Unterstruktur
  134.   {
  135.     int z;
  136.     
  137.     if ( top->size() <= 2 )
  138.       z = top->succ(x1); 
  139.     else
  140.       z = ((stratified_ptr)top)->succ(x1); 
  141.     if ( z == -1 ) 
  142.       return ma;                         // x unmittelbar vor Maximum
  143.     l_stratified_ptr l_bot_ptr = l_stratified_ptr(bot->lookup(z,k));
  144.     return (mal_pot_2(z,down(k))) | (l_bot_ptr->min()) ;
  145.   }
  146. }
  147. // ----------------------------------------------------------
  148. //
  149. // pred                  
  150. //
  151. // liefert Vorgaenger von x im Baum auf dieser Rekursionsstufe
  152. //                    falls existiert
  153. // -1 , sonst
  154. //
  155. // ----------------------------------------------------------
  156. int stratified::pred(int x) 
  157. {
  158.   if ( x >  ma ) return ma;
  159.   if ( x <= mi ) return -1;
  160.   if ( sz == 2 ) return mi;               // mi < x < ma
  161.   // sz > 2 && k > 1
  162.   int x1 = high_bits(x); 
  163.   int x2 = low_bits(x); 
  164.   GenPtr p = bot->lookup(x1,k);
  165.   l_stratified_ptr l_bot_ptr = l_stratified_ptr(p);
  166.   if ( (l_bot_ptr) && (l_bot_ptr->min()<x2) ) 
  167.   {
  168.     if ( l_bot_ptr->size() <= 2 )             // l_stratified Struktur
  169.         return ( mal_pot_2(x1,down(k))) | ( l_bot_ptr->pred(x2) ) ;
  170.     else
  171.     {
  172.       stratified_ptr bot_ptr = stratified_ptr(p) ;
  173.       return (mal_pot_2(x1,down(k))) | (bot_ptr->pred(x2)) ;
  174.     }
  175.   }
  176.   else                                        // pred nicht in top-Unterstruktur
  177.     
  178.   {
  179.     int z;
  180.     if ( top->size() <= 2 )
  181.       z = top->pred(x1); 
  182.     else
  183.       z = ((stratified_ptr)top)->pred(x1); 
  184.     if ( z == -1 ) 
  185.       return mi;                              // x unmittelbar vor Maximum
  186.     l_stratified_ptr l_bot_ptr = l_stratified_ptr(bot->lookup(z,k));
  187.     return (mal_pot_2(z,down(k))) | (l_bot_ptr->max() ) ;
  188.   }
  189. // --------------------------------------------------------------- 
  190. //
  191. // member   
  192. //
  193. // liefert 1, falls Element in der Struktur
  194. //
  195. //         0, sonst
  196. //
  197. // ----------------------------------------------------------
  198. int stratified::member(int x)
  199.   if (( x == ma )||( x == mi ))
  200.     return 1;
  201.   if (( x < mi )||( x > ma ))
  202.     return 0;
  203.   if ( sz == 2 )
  204.     return 0;
  205.      // sz > 2 && k > 1
  206.   int x1 = high_bits(x); 
  207.   int x2 = low_bits(x); 
  208.   GenPtr p = bot->lookup(x1,k);
  209.   l_stratified_ptr l_bot_ptr = l_stratified_ptr(p);
  210.   if (l_bot_ptr)
  211.     if ( l_bot_ptr->size() <= 2 )    // l_stratified Struktur
  212.       return l_bot_ptr->member(x2);
  213.     else
  214.     {
  215.       stratified_ptr bot_ptr = stratified_ptr(p);
  216.       return bot_ptr->member(x2);                  
  217.     }
  218.   else
  219.     return 0;                
  220. }
  221. // ----------------------------------------------------------
  222. //
  223. // insert           
  224. //
  225. // fuegt ein Element x rekursiv in den Baum ein
  226. //
  227. // liefert 1, falls es eingefuegt wurde
  228. //
  229. //         0, falls es schon Element dewr Struktur war
  230. //
  231. // ----------------------------------------------------------
  232. int stratified::insert(int x)
  233.   int inserted = 0;
  234.   if ( ( x == mi ) || ( x == ma ) )      // Element in Structure
  235.     return 0;
  236.   switch (sz)
  237.   {
  238.     case 0: 
  239.      {
  240.        mi = ma = x;
  241.        inserted = 1;
  242.                break;
  243.              }
  244.     case 1:
  245.      {                           // incremental construction iff sz > 2
  246.                if ( x > mi ) 
  247.          ma = x;
  248.        else
  249.          mi = x;
  250.        inserted = 1;
  251.                break;
  252.              }
  253.     default: {                           // => k>1
  254.        if ( x > ma )
  255.        { 
  256.  int t = ma;
  257.  ma = x;
  258.  x = t;
  259.                }
  260.  
  261.                if ( x < mi )
  262.        { 
  263.  int t = mi;
  264.  mi = x;
  265.  x = t;
  266.                }
  267.                int x1 = high_bits(x);
  268.                int x2 = low_bits(x);
  269.                                          // for incremental construction
  270.                if ( top == 0 )           // allocate new structures
  271.                { 
  272.          top = new l_stratified(); 
  273.                  bot = new b_dict(k);
  274.                }          
  275.                GenPtr& p = bot->lookup(x1,k);
  276.                l_stratified_ptr l_bot_ptr = l_stratified_ptr(p);
  277.        if ( l_bot_ptr )
  278.                {
  279.                  if ( l_bot_ptr->size() == 1 )
  280.    inserted = l_bot_ptr->insert(x2);
  281.  else
  282.                  {
  283.    stratified_ptr bot_ptr;
  284.    if ( l_bot_ptr->size() == 2 ) 
  285.                    {
  286.      if ( !l_bot_ptr->member(x2) ) 
  287.                      {
  288.        bot_ptr = new stratified(l_bot_ptr,down(k));
  289.                        inserted = bot_ptr->insert(x2);
  290.        p = (GenPtr)bot_ptr;
  291.        delete l_bot_ptr;
  292.                      }
  293.                    }
  294.    else       // l_bot_ptr was a bot_ptr
  295.                    {
  296.                      bot_ptr = stratified_ptr(p) ;
  297.                      inserted = bot_ptr->insert(x2);
  298.                    }
  299.                  }
  300.                }
  301.                else                // no top entry 
  302.        {
  303.                  l_bot_ptr = new l_stratified(x2);
  304.  if ( top->size() <= 1 )
  305.    top->insert(x1);
  306.                  else
  307.                  { 
  308.    stratified_ptr ntop;
  309.    if ( top->size() == 2 )
  310.    { 
  311.      ntop = new stratified(top,up(k));
  312.      delete top;
  313.      top = (l_stratified_ptr)ntop;
  314.                    }
  315.    else
  316.      ntop = (stratified_ptr)top;
  317.            ntop->insert(x1);
  318.                  }
  319.          GenPtr help = GenPtr(l_bot_ptr);
  320.          bot->insert(x1,help,k);
  321.  inserted = 1;
  322.                }
  323.                break;
  324.              }                           // default case
  325.   }                                      // switch
  326.   if ( inserted )
  327.     sz++;
  328.   return inserted;
  329. }
  330. // ----------------------------------------------------------
  331. //
  332. // del              
  333. //
  334. // streicht ein Element x rekursiv aus dem Baum 
  335. //
  336. // liefert 1, falls es gestrichen wurde
  337. //
  338. //         0, falls es nicht Element der Struktur war
  339. //
  340. // ----------------------------------------------------------
  341. int stratified::del(int x)
  342.   int deleted = 0;
  343.   switch (sz)
  344.   {
  345.     case 0 : break;
  346.     case 1 :
  347.      { 
  348.                if ( x == mi )
  349.        { 
  350.          mi = ma = -1;
  351.  deleted = 1;
  352.                }
  353.        break;
  354.              }
  355.     case 2 :
  356.              {
  357.                if ( x == mi ) 
  358.                {
  359.          mi = ma;
  360.          deleted = 1;
  361.        }
  362.                if ( x == ma )
  363.                {
  364.          ma = mi;
  365.          deleted = 1;
  366.        }
  367.        break;
  368.              }
  369.     case 3 :       
  370.                                    /* delete incremental construction */
  371.              {           
  372.                int t = min2();     /* third element */
  373.                if ( x == mi )      /* new minimum   */
  374.                {
  375.           mi = t;
  376.   deleted = 1;
  377.                }
  378.                if ( x == ma )      /* new maximum   */
  379.                {
  380.           ma = t;
  381.   deleted = 1;
  382.                }
  383.        if ( x == t )
  384.  deleted = 1;
  385.                if ( deleted )
  386.                 /* delete stratified trees of bot  */
  387.                {
  388.                  bot->clear(k);
  389.  if ( k <= 8 )
  390.                    delete bot->l;
  391.                  else
  392.                    delete bot->d;
  393.                  delete bot;
  394.                  bot = 0;
  395.                  delete top;
  396.                  top = 0;
  397.                }                   /* incremental construction deleted */
  398.        break;
  399.              }         
  400.     default :
  401.              {
  402.        l_stratified_ptr l_bot_ptr;
  403.        stratified_ptr bot_ptr;
  404.                if ( x == ma )                 /* delete maximum */
  405.                {
  406.  int z = max2();
  407.  ma = z;
  408.          x = z;
  409.                }
  410.                if ( x == mi )                /* delete minimum */
  411.                {
  412.  int z = min2();
  413.  mi = z;
  414.          x = z;
  415.                }
  416.                int x1 = high_bits(x);
  417.                int x2 = low_bits(x);
  418.                GenPtr& p = bot->lookup(x1,k);
  419.        if (!p)
  420.  return 0;                  /* element not in structure */
  421.                l_bot_ptr = l_stratified_ptr(p) ;
  422.                if ( l_bot_ptr->size() <= 2 )
  423.        {
  424.                  deleted = l_bot_ptr->del(x2);
  425.                  if ( l_bot_ptr->size() == 0 )  /* delete structure */
  426.          {
  427.                    delete l_bot_ptr;
  428.   
  429.    if ( top->size() <= 2 )
  430.      top->del(x1);
  431.                    else
  432.    {
  433.      stratified_ptr ntop = (stratified_ptr)top;
  434.      if ( ntop->sz == 3 )
  435.      { 
  436.        top = new l_stratified(ntop,x1);
  437.        delete ntop;
  438.                      }
  439.      else
  440.                        ntop->del(x1);
  441.                    } 
  442.                    bot->del(x1,k);
  443.                  }
  444.                }
  445.                else                                  /* stratified structure */
  446.                {
  447.                  bot_ptr = stratified_ptr(p) ;
  448.                  if ( bot_ptr->sz == 3 )              /* change into l_stratified */
  449.                  {
  450.    if ( bot_ptr->member(x2) )
  451.    {
  452.      l_bot_ptr = new l_stratified(bot_ptr,x2);
  453.      deleted = 1;
  454.                      p = (GenPtr)l_bot_ptr;
  455.                      delete bot_ptr;
  456.                    }
  457.                  }
  458.                  else                               /* size >= 4 */
  459.                    deleted = bot_ptr->del(x2);
  460.                }
  461.        break;
  462.              }
  463.   }
  464.   if ( deleted ) 
  465.     sz--;
  466.   return deleted;
  467. }
  468. // ----------------------------------------------------------
  469. //
  470. // print            
  471. //
  472. // druckt alle Elemente des Baumes aus            
  473. //
  474. // ----------------------------------------------------------
  475. void stratified::print()
  476.   int i = -1;
  477.   while ((i=succ(i))>=0)
  478.     cout << i << " ";
  479. }
  480. // -------------------------------------------------------
  481. // clear
  482. //
  483. // loescht alle Elemente, zerstoert Unterbaeume und 
  484. // setzt Dictionary auf Leerzustand
  485. //
  486. // ----------------------------------------------------------
  487. b_dict::b_dict(int k) 
  488. { if ( k <= 8 ) 
  489.    { l = new GenPtr[pot_2(up(k))];
  490.      for (int i = 0; i < pot_2(up(k)); i++) l[i] = 0;
  491.     }
  492.   else 
  493.    d = new dp_hash;
  494. }
  495. void b_dict::clear(int k)
  496.   if ( k <= 8 )
  497.   {
  498.     for (int i = 0; i < pot_2(up(k)); i++)
  499.     { 
  500.       l_stratified_ptr l_bot_ptr=l_stratified_ptr(l[i]);
  501.       if  (l_bot_ptr)
  502.         if (l_bot_ptr->size()<=2) 
  503.           delete l_bot_ptr;
  504.         else
  505.         { 
  506.           stratified_ptr bot_ptr=stratified_ptr(l[i]);
  507.           delete bot_ptr;
  508.         }
  509.     }
  510.     return;
  511.   }
  512.       
  513.                          // b_dict was a hashing structure
  514.   stp s = new subtable[d->n];
  515.   stp pos = s;
  516.   int i=0;
  517.   while (i<d->sM)                        // Headertables loeschen
  518.   {
  519.     if (d->htablep[i])
  520.     {
  521.       d->htablep[i]->give_elements(pos,d->anf,d->ende);
  522.       delete d->htablep[i];                         
  523.     }
  524.     i++;
  525.   }
  526.   for (i=0 ; i<d->n ; i++)
  527.   { 
  528.     l_stratified_ptr l_bot_ptr=l_stratified_ptr(s[i].info());
  529.     if  (l_bot_ptr)
  530.       if (l_bot_ptr->size()<=2) 
  531.         delete l_bot_ptr;
  532.       else
  533.       { 
  534.         stratified_ptr bot_ptr=stratified_ptr(s[i].info());
  535.         delete bot_ptr;
  536.       }
  537.   }
  538.   // free ((char*)d->htablep) ;             // Speicher freigeben
  539.   delete[] d->htablep;
  540.   if (d->anf)
  541.     delete d->anf;
  542.   delete s;
  543.   d->n = 0;                              // Leerinitialisierung
  544.   d->M=4;
  545.   d->sM=13;
  546.   d->k= 1 + (rand_int() & maxprim);
  547.   d->bed=-17;
  548.   d->htablep= new htp[d->sM];   //calloc(d->sM,sizeof(htp));
  549.   d->anf = d->wo = d->ende = 0;
  550. }