对于以下数据结构:
我们可以使用一个平衡的BST,每个节点都有它的子树大小,但它需要实现红黑树,这对于代码来说速度不快。
任何更好的解决方案?
答案 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()中的常数相当小。