O(logn)中O(logn)删除和索引访问的数据结构

时间:2013-02-04 15:30:22

标签: c++ data-structures

请推荐一个O(logn)删除的数据结构,我想要O(1)或O(logn)中数据结构中元素的索引??

1 个答案:

答案 0 :(得分:2)

可以修改大多数自平衡有序二进制树以保持每个节点中的子节点数,并且每次操作保持lg(n)时间非常容易。

他们清楚地修改每个操作少于lg(n)个节点,根据我的经验,他们修改的节点通常是“垂直相关的”。它不是免费的,但它往往不贵。 1

在树的节点中获得该数据后,找到n元素很容易(如果n大于左子树中的#,则从{{1中减去左子树中的#然后递归到右子树,否则递归到左子树,不变n)。

这也适用于非二元自平衡树,例如B树。

据我所知,没有n容器支持随机对数删除,插入和索引操作。我找了一回。我也快速检查了提升,甚至查看了多索引容器,也找不到让它工作的方法。

脚注:

1 修改树时,您希望在节点上获取节点子节点数的成本为O(1),您必须修改所有节点中的节点通往根的方式。每个修改的节点最多有lg(n)个。但是,如果节点彼此“垂直相关”,则每个节点更改时,您需要修复的节点几乎都是相同的。

另一方面,假设您的树重新平衡算法以某种方式设法修改lg(n)完全不相关的节点,成本将高达lg(n)* lg(n)以维持计数。