C ++ STL容器适合在动态有序列表中查找第n个元素?

时间:2015-08-25 06:28:25

标签: c++ optimization data-structures stl

使用平衡的BST,如AVL或Red-Black-Tree,我们可以轻松维护一组值:

  1. 插入/删除/查询给定值。
  2. 计算小于/大于给定值的元素。
  3. 在排序后找到排名为k的元素。
  4. 以上所有内容均可以O(log N)复杂度存档。

    我的问题是,是否有任何STL容器以相同的复杂性支持上述所有3个操作?

    我知道STL set / multiset可以用于1和2.我检查了基于_Rb_tree的容器map / set / multiset,但是没有提供对3的支持。有没有办法对ext / rb_tree进行子类化来解决这个问题?

1 个答案:

答案 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;
}

Live demo

[源自this answer]