B+树索引伪代码

来源:互联网 发布:松下plc编程软件 编辑:程序博客网 时间:2024/05/14 01:57

B+树索引伪代码一——搜索
搜索: 

func find(搜索码值K) returns nodepointer 
//给定一个搜索码值,找出它的叶子节点
返回 tree-serach(root, K);   //从根开始搜索
endfunc 

func tree-search(nodepointer, 搜索码值K) returns nodepointer
//在树上搜索数据项
如果*nodepointer 是一个叶子,返回nodepointer
否则
       如果K<K1, 则返回 tree-search(P0, K); 
       否则
              如果K≥Km, 则返回,tree-search(Pm, K); // m = #节点包含的目录项数
       否则
              找到满足Ki≤K<Ki+1条件的i;
              返回tree-search(Pi, K)
endfunc

 

B+树索引操作伪代码二——插入
插入: 

proc insert(nodepointer, entry, newchildentry)
// 把entry插入到根为“*nodepointer”的子树中;秩为d; 
// “newchildentry”开始时是null,除非孩子被分裂,否则将已知返回null 

如果*nodepointer 是一个非叶子节点,设为N, 
       找到满足Ki≤entry的码值<Ki+1 条件的i; //选择子树 
       insert(Pi, entry, newchildentry);               //递归插入entry 
       如果nechildentry为null,返回;              //通常的情况;不分裂孩子 
       否则                                       //分裂孩子,必须在N中插入*nodepointer 
              如果N有空间,                  //通常情况 
                     在N中放入*nodepointer, 设newchildentry为null,返回; 
              否则   //注意叶子页分裂的差别 
                     分裂N; //2d+1个码值和2d+2个节点指针 
                     前d个码值和d+1个节点指针留下; 
                     后d个码值和d+1个节点指针移入到新节点N2中, 
                     //*nodepointer 用于指示N和N2之间的搜索 
                     newchildentry = &(<N2 上最小的码值,指向N2的指针>) 
                     如果N是根, //分裂根节点 
                            创建含有<指向N的指针,*nodepointer>的新节点; 
                            使树的根节点之指针指向新节点 
                     返回;   

如果*nodepointer 是一个叶子节点,设为L, 
       如果L有空间,//通常情况 
              在L中放入entry ,设newchildentry为null, 并返回; 
       否则,//偶尔,叶子是满的 
              分裂L:前d个目录项留下,其余的移到新节点L2中; 
              newchildentry = &(<L2上最小的码值,指向L2的指针>); 
              设置L和L2中的兄弟指针; 
              返回; 
endproc

 

B+树索引操作伪代码三——删除
删除: 

proc delete(parentpointer, nodepointer, entry, oldchildentry) 
//把entry 从根为“*nodepointer”的子树中删除,秩为d; 
//“oldchildentry”开始时是null,除非孩子被删除,否则将一直返回为null 

如果*nodepointer 是一个非叶子节点,设为N, 
       找到满足K i≤ entry 的关键值<K i+1条件的i    //选择子树 
       delete(nodepointer, Pi, entry, oldchildentry);         //递归删除 
       如果oldchildentry 为null,返回;           // 通常的情况,不删除孩子 
       否则                        //删除孩子节点 
              从N中移出*oldchildentry,  //接着,检查最小占用情况 
              如果N中有声誉的目录项,//通常情况 
                     设oldchildentry为null,返回;  //删除不再继续 
              否则,//注意叶子页合并的差别 
                     获得N的一个兄弟S;//利用parentpointer参数查找S 
                     如果S有多余的目录项, 
                            通过父节点在N和S之间重新平均分布目录项; 
                            设置oldchildentry为null,返回; 
                     否则,合并N和S      //称作合并的节点M 
                            oldchildentry = &(父节点中指向M的当前目录项); 
                            从父节点拉下分割码,并放在左侧节点上; 
                            把M中的所有目录项移到左侧节点; 
                            抛弃空节点M,返回; 

  如果*nodepointer是一个叶子节点,设为L 
       如果L有剩余的目录项,//通常情况 
              移出entry,设oldchildentry为null,并返回; 
       否则,           //偶尔,叶子的占有率过低 
       获得L的一个兄弟S;//利用parentpointer 参数查找S 
       如果S有多余的目录项 
              通过父节点在L和S之间重新平均分布目录项; 
              在父节点中找到指向右侧节点的目录项;//称为M 
              用M中新的最小码值代替父节点中的相应目录项中的码值; 
              设置oldchildentry为null,返回; 
       否则,合并L和S //称作被合并的节点M 
              oldchildentry = & (父节点中指向M的当前目录项); 
              把M中的所有目录项移到左侧节点; 
              抛弃空节点M,调整兄弟指针,返回; 
endproc

原创粉丝点击