使用O(logn)访问和O(logn)插入实现数据结构?

时间:2013-02-05 23:47:08

标签: data-structures indexing insertion random-access

有没有人知道我可以访问和删除最坏情况下的第k项O(logn)的数据结构,并且还支持在最坏情况下在第k项之后插入项目的操作O(logn) ?

2 个答案:

答案 0 :(得分:3)

是。您所描述的内容可以通过扩充树来实现。每个节点都有一个计数器,指示其子树中的节点数(包括其自身)。对于叶节点,计数器为1.对于根节点,计数器是节点的总数。这样,您可以从根目录开始找到带有二进制搜索的第k个项目。无论何时插入/删除元素,都必须更新从该位置到根位置的路径中的计数器。

这种树被称为order statistic trees,排名树木,反树木......

您可以找到实施here和另一个here

参见第14章,"扩充数据结构"在Cormen,Leiserson,Rivest和Stein的伟大着作" Intorduction to Algorithms"中。

答案 1 :(得分:0)

如果您需要整数索引(而不是键),请查看ropedeque,这些操作基本上是O(c)。

对于关联数据结构,典型的哈希表也将分摊为O(c),而平衡树将为O(log(n))。