为什么不把父指针保存在"B+ Tree"中,方便树向上遍历?
Why we are not saving the parent pointer in "B+ Tree" for easy upward traversal in tree?
在拆分和插入过程中,如果我添加一个指向父节点的指针以简化操作,会不会影响很大?
一般节点看起来像这样:
class BPTreeNode{
bool leaf;
BPTreeNode *next;
BPTreeNode *parent; //add-on
std::vector < int* >pointers;
std::vector < int >keys;
};
从现在开始,我在现实生活中的数据库系统中可能会遇到哪些挑战。
我只是将其作为业余爱好项目实施。
我能想到的原因有两个:
B+树删除值的算法可能会导致内部块A的子块太少。如果 A 左侧或右侧的块都不能将条目传递给 A 以解决此违规,则块 A 需要合并到同级块 B。这意味着块 A 的所有子块都需要拥有它们的父指针更新到块 B。这是额外的工作,它增加了(很多)在删除操作中需要更新的块的数量。
它表示执行标准 B+Tree 操作实际上不需要的额外 space。通过 B+Tree 搜索值时,您可以轻松跟踪到该叶级别的路径,并将其用于在树中向上回溯。
在拆分和插入过程中,如果我添加一个指向父节点的指针以简化操作,会不会影响很大?
一般节点看起来像这样:
class BPTreeNode{
bool leaf;
BPTreeNode *next;
BPTreeNode *parent; //add-on
std::vector < int* >pointers;
std::vector < int >keys;
};
从现在开始,我在现实生活中的数据库系统中可能会遇到哪些挑战。
我只是将其作为业余爱好项目实施。
我能想到的原因有两个:
B+树删除值的算法可能会导致内部块A的子块太少。如果 A 左侧或右侧的块都不能将条目传递给 A 以解决此违规,则块 A 需要合并到同级块 B。这意味着块 A 的所有子块都需要拥有它们的父指针更新到块 B。这是额外的工作,它增加了(很多)在删除操作中需要更新的块的数量。
它表示执行标准 B+Tree 操作实际上不需要的额外 space。通过 B+Tree 搜索值时,您可以轻松跟踪到该叶级别的路径,并将其用于在树中向上回溯。