簡體   English   中英

C ++ STL容器適合在動態有序列表中查找第n個元素?

[英]C++ STL container suited for finding the nth element in dynamic ordered list?

使用平衡的BST,如AVL或Red-Black-Tree,我們可以輕松維護一組值:

  1. 插入/刪除/查詢給定值。
  2. 計算小於/大於給定值的元素。
  3. 排序后找到排名為k的元素。

以上所有內容都可以以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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM