[英]C++ STL container suited for finding the nth element in dynamic ordered list?
使用平衡的BST,如AVL或Red-Black-Tree,我們可以輕松維護一組值:
以上所有內容都可以以O(log N)
復雜度存檔。
我的問題是,是否有任何STL容器以相同的復雜性支持上述所有3個操作?
我知道STL set / multiset可以用於1和2.我檢查了基於_Rb_tree的容器map / set / multiset,但沒有提供對3的支持。有沒有辦法子類化ext / rb_tree來解決這個問題?
您正在尋找的數據結構是一個訂單統計樹 ,它是一個二叉搜索樹,其中每個節點存儲以該節點為根的子樹的大小。
這支持O(log n)中列出的所有操作。
GNU基於策略的數據結構中存在一個訂單統計樹(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;
}
現場演示 。
[源於這個答案 ]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.