首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 其他相关 >

关于 B+ tree 结点瓦解的模型算法

2012-09-05 
关于 B+ tree 结点分裂的模型算法--------------------------------------------标题: 关于 B tree 结点分

关于 B+ tree 结点分裂的模型算法

--------------------------------------------
标题: 关于 B+ tree 结点分裂的模型算法
作者: 叶飞虎
建立: 2011.04.13
--------------------------------------------

1. 假设
   a. 结点键项类型
      typedef struct
      {
         <Type>      Key;              // 指定类型<Type>的键值
         void*       Link;             // 子链接或叶值链接
      } TItem, *PItem;

   b. 结点类型
      typedef struct
      {
         short       Count;            // 项数, Count <= dimension
         bool        IsLeaf;           // 是否为叶结点
         TItem       Items[dimension]; // 键项列表, dimension 为结点维度
      } TNode, *PNode;

   c. 已知
      TNode*         parent;           // 父结点:
      TNode*         current;          // 当前结点
      TNode*         prior;            // 前一兄弟
      TNode*         next;             // 下一兄弟
      <Type>         key;              // 键值
      void*          link;             // 子链接或叶值链接
      其中:
         1). index  为 current 在 parent 中的索引
         2). ins_no 为插入 current 中的位置
         3). current = parent->Items[index].Link;
         4). prior   = parent->Items[index - 1].Link;
         5). next    = parent->Items[index + 1].Link;
         6). (index >= 0) && (index < dimension)
         7). (ins_no >= 0) && (ins_no <= dimension)
         8). (current->Count == dimension)

2. 按条件分裂
   a. 结点分裂操作
      enum TPartOp  {poNew,            // 新建结点, 当前键值插入新结点
                     poPrior,          // 结点向前分裂, 当前键值与前一个结点合并
                     poNext};          // 结点向后分裂, 当前键值与下一个结点合并

   b. 计算条件 [...|...]  [...|ins_no|...]  [...|...]
   {
      // 初始化
      result = poNew;

      // 判断前一结点是否有空闲位置
      if ((prior != NULL) && (prior->Count < dimension))
      {
         // 判断后一结点是否能容纳前一结点的后半部键值
         if ((next != NULL) && (next->Count < dimension)
                            && (ins_no >= next->Count + (dimension - ins_no)))
            result = poNext;
         else
            result = poPrior;
      }
      else if ((next != NULL) && (next->Count < dimension))
         result = poNext;
   }

--------------------------------------------

 

热点排行