set + nth element:快速实现

时间:2011-10-01 10:01:41

标签: c++ algorithm

对于以下数据结构:

  • 在O(lg(n))
  • 中添加元素
  • 删除O(lg(n))
  • 中的元素
  • 在O(lg(n))
  • 中找到第k个元素

我们可以使用一个平衡的BST,每个节点都有它的子树大小,但它需要实现红黑树,这对于代码来说速度不快。

任何更好的解决方案?

4 个答案:

答案 0 :(得分:7)

您正在寻找的一般类型的结构符合 Indexed Indexable ,这是一个增加了count的结构,可以通过索引访问元素。< / p>

你可以使用:

(也许还有其他几个:p)

我倾向于认为Skip-Lists比BST更容易实现,因为你可以使用随机高度而不是所有平衡的东西。

答案 1 :(得分:2)

通常的方法是实现自己的扩充O(log(n))数据结构,允许基于排名的插入/查找。平衡的BST,跳过列表或一些修改的分段树或二进制索引树应该可以工作。

在Java中,您也可以使用Apache Commons的TreeList

如果k被修复并且你正在使用C ++,你可以使用TopCoder处可以找到的聪明技巧(向下滚动到标题为“Floating Median”的部分)。基本上你使用2 std::multiset s,一个用于前k个元素,另一个用于最后的N-k个元素。每次添加/删除某些内容时,都会相应地更新多重页。获取第k个元素只是查找第一个multiset中的最后一个元素。

答案 2 :(得分:1)

似乎AA Trees比RBT更容易实现,但在其他方面与它们几乎相同。

答案 3 :(得分:0)

您可以使用随机节点高度向skip lists投射。它应该能够做你想做的事。

这是一个随机数据结构。因为一个想法很干净,而且相对容易实现。红黑尝试有许多特殊情况。跳过列表没有特殊情况,很容易正确。此外,它们在实践中表现得非常好--O()中的常数相当小。