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
B+树索引伪代码
最新推荐文章于 2024-05-27 15:59:32 发布