【发布时间】:2011-07-08 08:10:00
【问题描述】:
我正在尝试了解 b-tree,而我能找到的每个来源似乎都忽略了有关如何在保留 b-tree 属性的同时从树中删除元素的讨论。
谁能解释一下这个算法或给我指点可以解释它是如何完成的资源?
【问题讨论】:
-
哈哈,没错:我也注意到大多数书籍似乎都在 B-tree 中删除了“作为读者的练习”……那些混蛋。 ;-)
标签: algorithm data-structures b-tree
我正在尝试了解 b-tree,而我能找到的每个来源似乎都忽略了有关如何在保留 b-tree 属性的同时从树中删除元素的讨论。
谁能解释一下这个算法或给我指点可以解释它是如何完成的资源?
【问题讨论】:
标签: algorithm data-structures b-tree
如果你还没有,我强烈推荐 Carmen & alIntroduction to Algorithms 3rd Edition。
没有描述,因为操作自然源于 B-Tree 属性。
由于您对节点中的元素数量有一个下限,如果删除您的元素违反了这个不变量,那么您需要恢复它,这通常涉及与邻居合并(或窃取它的一些元素)。
如果与邻居合并,则需要删除父节点中的一个元素,这会触发相同的算法。并且你递归地应用直到你到达顶部。
B-Tree 没有重新平衡(至少不是我看到的那些),因此维护红黑树或 AVL 树要简单得多,这可能是人们不觉得有必要写下有关移除的原因.
【讨论】:
在维基百科页面上有一个解释。 B-tree - Deletion
【讨论】:
您在谈论哪些 b 树?是否有连叶?此外,还有不同的移除项目的方法(自上而下、自下而上等)。这篇论文可能会有所帮助:B-trees, Shadowing, and Clones(尽管有很多文件系统相关的东西)。
【讨论】:
CLRS(第 2 版)的删除示例可在此处获得:http://ysangkok.github.io/js-clrs-btree/btree.html
按“初始化书”,然后按顺序按删除按钮。这将涵盖所有情况。在按下每个按钮之前尝试预测新的树状态,并尝试识别这些案例是如何独一无二的。
【讨论】: