B+树删除后索引中的key会不会被删除?
Will key in the index be removed after deletion in B Plus tree?
我对B+树中的删除有点困惑。我在Google中搜索了很多,发现当你要删除的key出现在索引中时有两种实现方式:
- 删除索引中的键
- 将键保存在索引中
来自https://www.javatpoint.com/b-plus-tree-deletion的算法使用第一种方式。
来自https://www.cs.princeton.edu/courses/archive/fall08/cos597A/Notes/BplusInsertDelete.pdf的算法使用第二种方式。
所以我很想知道哪一个是对的
但我更倾向于将其视为未定义的行为。在这一点上,有人可以帮我弄清楚它们之间的优缺点吗?又该如何取舍?
提前致谢。
两种方法都是正确的。
您强调的差异不是 deleting/not-deleting 内部键,而是 updating/not-updating 它们。
显然,当你删除一个值(即叶子节点中的一个键)时,b-plus-tree 属性 并没有被违反:所有子值仍然在父信息规定的范围内.你永远不能仅仅通过从叶子中删除一个值来打破这个范围规则。当您更新该叶子路径中的内部键(根据方法 1)时,此规则仍然有效,只有当删除的值是其叶子中最左边的值时才需要这样做。
请注意,在执行一长串相同的操作(插入、删除)后,这两种方法可能会生成完全不同的树。
但平均而言,第二种方法要做的工作会稍微少一些。不过这种差异并不显着。
我对B+树中的删除有点困惑。我在Google中搜索了很多,发现当你要删除的key出现在索引中时有两种实现方式:
- 删除索引中的键
- 将键保存在索引中
来自https://www.javatpoint.com/b-plus-tree-deletion的算法使用第一种方式。
来自https://www.cs.princeton.edu/courses/archive/fall08/cos597A/Notes/BplusInsertDelete.pdf的算法使用第二种方式。
所以我很想知道哪一个是对的
但我更倾向于将其视为未定义的行为。在这一点上,有人可以帮我弄清楚它们之间的优缺点吗?又该如何取舍?
提前致谢。
两种方法都是正确的。
您强调的差异不是 deleting/not-deleting 内部键,而是 updating/not-updating 它们。
显然,当你删除一个值(即叶子节点中的一个键)时,b-plus-tree 属性 并没有被违反:所有子值仍然在父信息规定的范围内.你永远不能仅仅通过从叶子中删除一个值来打破这个范围规则。当您更新该叶子路径中的内部键(根据方法 1)时,此规则仍然有效,只有当删除的值是其叶子中最左边的值时才需要这样做。
请注意,在执行一长串相同的操作(插入、删除)后,这两种方法可能会生成完全不同的树。
但平均而言,第二种方法要做的工作会稍微少一些。不过这种差异并不显着。