更好的BST删除算法?这个叫什么?

时间:2014-07-18 02:18:41

标签: binary-search-tree

我正处于basic algorithms course的中间。

讲座讨论如何长期随机插入和删除标准" Hibbard"删除将偏向树形状,降低深度&从log(N)到sqrt(N)的操作性能(即使你随机选择要从中推广的左或右子树,as described in the answer to this question)。

讲座还提到人们一直在寻找一种更好的删除方法50年。

下面有一个算法大纲,似乎应该是"无偏见"。

所以我有几个问题:

  • 我错了,这是坏了吗?
  • 这个算法叫什么? (我怀疑我在这里发明了什么新东西)
  • 这有什么问题,它不是标准的BST删除?

我的算法很简单,我也喜欢你不需要先实现delete-min / delete-max来实现删除。

随机地将节点插入到BST中会产生一个无偏见的"树。 删除节点时,尝试构建如果已删除的节点从未存在过的树。

如果节点的时间戳很简单,那么应该提升旧节点。但是对节点加时间戳可能不值得。

但是节点通常包含子树的大小,这可以用来猜测哪个节点首先出现。


具体地:

如果已删除的节点没有孩子,则表示您已完成此操作。 如果有1个孩子宣传孩子,那么你已经完成了。

否则,已删除的节点的子节点都被添加到其后。 如果从未插入已删除的节点,则其中一个已删除节点的子节点将占据该位置。

两个孩子的大小可以看作来自二项分布的样本。这些可用于轻松估计节点从已删除节点向左或向右移动的可能性。

用二项式概率随机选择将左或右子树提升到已删除节点的位置(或者只选择最大的?)

(自动提升较大的子树是否有可能使树略短于无偏树的预期?)。

未晋升的" Free"子树将在提升的子树中向左或向右流动,因为它的所有节点都比提升的树中的任何节点更大或者更少。

对于每个节点," Free"子树遭遇,断开"遇到"来自主树的节点的子树。

假装一个节点刚刚被删除"遇到"节点的位置,以及" Free"子树,"遇到"子树是它的子节点,并递归/循环

2 个答案:

答案 0 :(得分:1)

As far as I understood your concept, the problem with it is that it's of linear time complexity. And that is not efficient in the world of BST. The Hibbard deletion is proportional to the height of the tree (which unfortunately tends to get sqrt(N) after a while even if it started as lgN), but yours is linear as you are reinserting "considerable" part of the tree (the number of nodes you have to reinsert is not limited with a constant multiple of the height of the tree).

Your method can maintain balance, but it's not an open problem to keep the BST balanced after deletions, but to keep them balanced efficiently.

答案 1 :(得分:0)

事实证明这是Randomized BST的删除方法。

随机BST也会为您提供无偏的树形状,即使这些项目是以非随机顺序插入的。