• van Emda Boas


    van Emda Boas维护了一个整数集合[0,Max)(无重复),其中Max必须等于2的正整数次幂。它支持以下操作:
    (1)插入一个数字;
    (2)删除一个数字;
    (3)询问某一个数字在不在这个集合中;
    (4)询问集合的最大最小值;
    (5)询问一个数字的前驱或者后继。
    每个操作的复杂度最大为O(loglog(n))

      1 #include <cmath>
      2 #include <algorithm>
      3 
      4 /***
      5   维护的集合范围为[0,MAXU-1]
      6   MAXU必须为2的正整数次幂
      7   MAXU<=2^30
      8 ***/
      9 
     10 
     11 template<int MAXU>
     12 class VanEmdeBoasTree
     13 {
     14 private:
     15 
     16     int m_inValidValue;
     17 
     18     struct TreeNode
     19     {
     20         int Min,Max;
     21 
     22         /**
     23           u为2的某次幂
     24           设u=2^k
     25           若k为偶数 UpBit=k/2
     26           若k为奇数 UpBit=(k+1)/2
     27           DownBit=k-UpBit
     28         **/
     29         int u;
     30         int UpBit;
     31         int DownBit;
     32 
     33         TreeNode* summary;
     34         TreeNode** cluster;
     35 
     36         /**
     37           x的高UpBit位
     38         **/
     39         int high(int x)
     40         {
     41             return x>>DownBit;
     42         }
     43 
     44         /**
     45           x的低DownBit位
     46         **/
     47         int low(int x)
     48         {
     49             return x&((1<<DownBit)-1);
     50         }
     51 
     52         int index(int hx,int lx)
     53         {
     54             return (hx<<DownBit)|lx;
     55         }
     56     };
     57     TreeNode* m_root;
     58     int m_MAXRANGE;
     59 
     60 
     61     /**
     62        已知u=2^k  返回k
     63     **/
     64     int GetSumBit(const int u)
     65     {
     66         return int(log2(u)+0.5);
     67     }
     68 
     69     void build(TreeNode* &root,const int u)
     70     {
     71         root->Min=m_inValidValue;
     72         root->Max=m_inValidValue;
     73         root->u=u;
     74 
     75         if(2==u) return;
     76 
     77         const int k=GetSumBit(u);
     78         root->UpBit=(k+1)>>1;
     79         root->DownBit=k>>1;
     80 
     81         root->summary=new TreeNode;
     82         build(root->summary,1<<root->UpBit);
     83 
     84         root->cluster=new TreeNode*[1<<root->UpBit];
     85         for(int i=0;i<(1<<root->UpBit);i++)
     86         {
     87             root->cluster[i]=new TreeNode;
     88             build(root->cluster[i],1<<root->DownBit);
     89         }
     90     }
     91 
     92     int GetMinValue(TreeNode *rt) { return rt->Min; }
     93     int GetMaxValue(TreeNode *rt) { return rt->Max; }
     94 
     95     int getSuccessor(TreeNode* curNode,int x)
     96     {
     97         if(2==curNode->u)
     98         {
     99             if(x==0&&curNode->Max==1) return 1;
    100             else return m_inValidValue;
    101         }
    102         else if(curNode->Min!=m_inValidValue&&x<curNode->Min)
    103         {
    104             return curNode->Min;
    105         }
    106         else
    107         {
    108             const int highX=curNode->high(x);
    109             const int lowX=curNode->low(x);
    110 
    111             int MaxLow=GetMaxValue(curNode->cluster[highX]);
    112             if(MaxLow!=m_inValidValue&&lowX<MaxLow)
    113             {
    114                 return curNode->index(highX,
    115                                       getSuccessor(curNode->cluster[highX],lowX));
    116             }
    117             else
    118             {
    119                 int successCluster=getSuccessor(curNode->summary,highX);
    120                 if(successCluster==m_inValidValue) return m_inValidValue;
    121                 else
    122                 {
    123                     return curNode->index(successCluster,
    124                                           GetMinValue(curNode->cluster[successCluster]));
    125                 }
    126             }
    127         }
    128     }
    129 
    130     int getPredecessor(TreeNode* curNode,int x)
    131     {
    132         if(2==curNode->u)
    133         {
    134             if(1==x&&0==curNode->Min) return 0;
    135             else return m_inValidValue;
    136         }
    137         else if(curNode->Max!=m_inValidValue&&x>curNode->Max)
    138         {
    139             return curNode->Max;
    140         }
    141         else
    142         {
    143             const int highX=curNode->high(x);
    144             const int lowX=curNode->low(x);
    145 
    146             int MinLow=GetMinValue(curNode->cluster[highX]);
    147             if(MinLow!=m_inValidValue&&lowX>MinLow)
    148             {
    149                 return curNode->index(highX,
    150                                       getPredecessor(curNode->cluster[highX],lowX));
    151             }
    152             else
    153             {
    154                 int predCluster=getPredecessor(curNode->summary,highX);
    155                 if(predCluster==m_inValidValue)
    156                 {
    157                     if(curNode->Min!=m_inValidValue&&x>curNode->Min)
    158                     {
    159                         return curNode->Min;
    160                     }
    161                     else return m_inValidValue;
    162                 }
    163                 else
    164                 {
    165                     return curNode->index(predCluster,
    166                                           GetMaxValue(curNode->cluster[predCluster]));
    167                 }
    168             }
    169         }
    170     }
    171 
    172     void insertEmptyNode(TreeNode* curNode,int x)
    173     {
    174         curNode->Min=curNode->Max=x;
    175     }
    176 
    177     void insert(TreeNode* curNode,int x)
    178     {
    179         if(curNode->Min==m_inValidValue)
    180         {
    181             insertEmptyNode(curNode,x);
    182             return;
    183         }
    184         if(x==curNode->Min||x==curNode->Max) return;
    185         if(x<curNode->Min)
    186         {
    187             std::swap(x,curNode->Min);
    188         }
    189         if(curNode->u>2)
    190         {
    191             const int highX=curNode->high(x);
    192             const int lowX=curNode->low(x);
    193             if(GetMinValue(curNode->cluster[highX])==m_inValidValue)
    194             {
    195                 insert(curNode->summary,highX);
    196                 insertEmptyNode(curNode->cluster[highX],lowX);
    197             }
    198             else
    199             {
    200                 insert(curNode->cluster[highX],lowX);
    201             }
    202         }
    203         if(x>curNode->Max) curNode->Max=x;
    204     }
    205 
    206     void remove(TreeNode* curNode,int x)
    207     {
    208         if(curNode->Min==curNode->Max)
    209         {
    210             curNode->Min=curNode->Max=m_inValidValue;
    211             return;
    212         }
    213         if(curNode->u==2)
    214         {
    215             if(x==0) curNode->Min=1;
    216             else curNode->Min=0;
    217             curNode->Max=curNode->Min;
    218             return;
    219         }
    220         if(x==curNode->Min)
    221         {
    222             int firstCluster=GetMinValue(curNode->summary);
    223             x=curNode->index(firstCluster,
    224                              GetMinValue(curNode->cluster[firstCluster]));
    225             curNode->Min=x;
    226         }
    227 
    228         const int highX=curNode->high(x);
    229         const int lowX=curNode->low(x);
    230         remove(curNode->cluster[highX],lowX);
    231         if(GetMinValue(curNode->cluster[highX])==m_inValidValue)
    232         {
    233             remove(curNode->summary,highX);
    234             if(x==curNode->Max)
    235             {
    236                 int summaryMax=GetMaxValue(curNode->summary);
    237                 if(summaryMax==m_inValidValue) curNode->Max=curNode->Min;
    238                 else
    239                 {
    240                     curNode->Max=curNode->index(summaryMax,
    241                                                 GetMaxValue(curNode->cluster[summaryMax]));
    242                 }
    243             }
    244         }
    245         else
    246         {
    247             if(x==curNode->Max)
    248             {
    249                 curNode->Max=curNode->index(highX,
    250                                             GetMaxValue(curNode->cluster[highX]));
    251             }
    252         }
    253     }
    254 
    255 public:
    256 
    257     /**
    258       构造函数需要提供类型的无效值
    259     **/
    260     VanEmdeBoasTree(const int inValidValue=-1)
    261     {
    262         m_MAXRANGE=MAXU;
    263         m_inValidValue=inValidValue;
    264         m_root=new TreeNode;
    265         build(m_root,MAXU);
    266     }
    267 
    268     /**
    269       key存在 返回1 否则返回0
    270     **/
    271     int isExist(int key)
    272     {
    273         if(key<0||key>=MAXU) return 0;
    274 
    275         TreeNode* curNode=m_root;
    276         while(1)
    277         {
    278             if(key==curNode->Min||key==curNode->Max) return 1;
    279             else if(2==curNode->u) return 0;
    280             else
    281             {
    282                 TreeNode *nextNode=curNode->cluster[curNode->high(key)];
    283                 key=curNode->low(key);
    284                 curNode=nextNode;
    285             }
    286         }
    287     }
    288 
    289     /**
    290       查找key的后继 即大于key最小的值
    291       若没有 返回m_inValidValue
    292     **/
    293     int getSuccessor(int key)
    294     {
    295         if(key<0) return GetMinValue(m_root);
    296         if(key>=m_MAXRANGE) return m_inValidValue;
    297         return getSuccessor(m_root,key);
    298     }
    299 
    300     /**
    301       查找key的前驱 即小于key最大的值
    302       若没有 返回m_inValidValue
    303     **/
    304     int getPredecessor(int key)
    305     {
    306         if(key<0) return m_inValidValue;
    307         if(key>=m_MAXRANGE) return GetMaxValue(m_root);
    308         return getPredecessor(m_root,key);
    309     }
    310 
    311     void insert(int key)
    312     {
    313         if(key<0||key>=m_MAXRANGE) return;
    314         insert(m_root,key);
    315     }
    316 
    317     void remove(int key)
    318     {
    319         if(key<0||key>=m_MAXRANGE) return;
    320         remove(m_root,key);
    321     }
    322 
    323     int GetMaxValue()
    324     {
    325         return GetMaxValue(m_root);
    326     }
    327 
    328     int GetMinValue()
    329     {
    330         return GetMinValue(m_root);
    331     }
    332 };
  • 相关阅读:
    Java 三大主流 工作流 学习
    有限状态机(FSM)的Java 学习FSM
    OSWorkFlow 学习
    三种分布式对象主流技术——COM、Java和COBRA
    Java对象池技术的原理及其实现
    tomcat,很多时候,可以在服务server.xml中可以实现一些效果
    理解Scala
    CAP原理和BASE思想
    Java 在PDF文档中绘制图形
    Java 处理PDF图章(印章)——图片图章、动态图章
  • 原文地址:https://www.cnblogs.com/jianglangcaijin/p/6004241.html
Copyright © 2020-2023  润新知