使用平衡的BST,如AVL或Red-Black-Tree,我们可以轻松维护一组值:
以上所有内容均可以O(log N)
复杂度存档。
我的问题是,是否有任何STL容器以相同的复杂性支持上述所有3个操作?
我知道STL set / multiset可以用于1和2.我检查了基于_Rb_tree的容器map / set / multiset,但是没有提供对3的支持。有没有办法对ext / rb_tree进行子类化来解决这个问题?
答案 0 :(得分:1)
您要查找的数据结构是order statistic tree,它是一个二叉搜索树,其中每个节点都存储以该节点为根的子树的大小。
这支持O(log n)中列出的所有操作。
GNU Policy-Based Data Structures(GNU C ++的一部分)中存在一个订单统计树。
代码看起来像这样:
#include <iostream>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef
tree<
int,
null_type,
less<int>,
rb_tree_tag,
tree_order_statistics_node_update>
set_t;
int main()
{
set_t s;
s.insert(12);
s.insert(50);
s.insert(30);
s.insert(20);
cout << "1st element: " << *s.find_by_order(1) << '\n'; // 20
cout << "Position of 30: " << s.order_of_key(30) << '\n'; // 2
return 0;
}
[源自this answer]