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

亨斯·亨

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

  1. 插入/删除/查询给定值。
  2. 计算小于/大于给定值的元素。
  3. 排序后找到等级为k的元素。

以上所有内容都可以很O(log N)复杂地存档

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

我知道STL集/多集可用于1和2。我检查了基于_Rb_tree的容器映射/集/多集,但没有一个提供对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;
}

现场演示

[从这个答案派生]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在C#中查找内置的有序列表

C ++ STL中是否有任何数据结构可用于执行log(n)中第k个元素的插入,搜索和检索?

在STL列表中查找名称C ++

在C ++中达到std :: list的第n个元素

在C ++容器中查找唯一的元素

在2个有序列表中查找最大的元素,这不在一个列表中

在C ++ 11中为STL容器分配一个括号初始列表

如何在C#中的有序列表中显示文本框中输入的字符串?

查找并行C / C ++的第n个置换

计数有序列表中的元素

C ++ STL容器中的多态

C#中的有序Json属性列表

从单个列表C#查找所有可能的序列列表

在C ++中使用STL在数组中查找最小元素

使用C ++在O(log n)中查找具有查找和插入/删除操作的索引容器

如何在C ++中旋转向量中的第N个元素

是否有一个函数f(n)在组合的有序列表中返回第n个组合而不重复?

Racket,编写查找列表中第 n 个元素的函数

在C#列表容器中查找和/或访问值

使用linq从C#列表中的每一行获取第n个单词

使用C在双向链接列表中的第N个位置插入一个节点

空的C ++ 11初始化程序列表导致容器中包含一个默认的构造对象

在有序列表中查找最接近的值

编写一个程序,该程序查找数组中连续相等元素的最大序列。C#

漂亮的C ++ STL容器

如果列表中只有一个元素,则隐藏有序列表中的数字

C ++ STL是C ++ API吗?

如何在C ++中存储对stl容器元素的指针/迭代器引用?

Visual Studio 2013 C ++:STL容器的元素显示在调试器中