如何在O(logn)中找到stl集合中元素的秩
How to find rank of an element in stl set in O(logn)
我想在stl集中找到元素的秩。我能够从一开始遍历到那个元素,并找出它的秩,但这需要O(n)。有什么方法可以找到O(logn)中的秩吗。
否;平衡树不需要存储每个节点的子节点数,这是为std::set s
和迭代器iter
更快地计算distance( s.begin(), iter )
所必需的(我想这就是你的意思)。因此,信息根本不存在,除非逐一计数。
如果您需要执行许多这样的计算,请将set
复制到排序的随机访问序列中,如vector
或deque
,但随后修改序列会变得昂贵。
一个可以满足你要求的树数据结构可能存在于某个免费库中,但我不知道有哪个。
您要查找的是订单统计树。如果您使用的是GNUC++库,那么您应该有一个可用于构建顺序统计树的扩展。下面给出了一个简短的例子:
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <cstdio>
using namespace std;
using namespace pb_ds;
typedef tree<
int, /* key type */
null_mapped_type, /* value type */
less<int>, /* comparison */
rb_tree_tag, /* for having an rb tree */
tree_order_statistics_node_update> order_set;
int main()
{
order_set s;
s.insert(10);
s.insert(20);
s.insert(50);
s.insert(25);
printf("rank of 25 = %dn", s.order_of_key(25));
}
输出应为rank of 25 = 2
。有关更多示例,您可以查看此文件。
@Potatoswatter建议的排序向量的功能由Boost.Container的flat_set
提供。文档列出了以下权衡
- 比标准关联容器更快的查找
- 迭代速度比标准关联容器快得多
- 较小对象的内存消耗较少(如果使用了shrink_to_fit,则较大对象的内存占用较少)
- 提高了缓存性能(数据存储在连续内存中)
- 非稳定迭代器(插入和擦除元素时迭代器无效)
- 无法存储不可复制和不可移动的值类型
- 与标准关联容器相比,异常安全性较弱(在擦除和插入中移位值时,复制/移动构造函数可能抛出)
- 插入和擦除速度比标准关联容器慢(特别适用于不可移动类型)
如果您使用GCC,实际上有一个内置的解决方案,但Subhasis Das的答案有些过时,由于更新,无法与较新版本的GCC一起使用。标题现在是
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
并且设置的结构是
typedef tree<
int,
null_type,
std::less<int>,
rb_tree_tag,
tree_order_statistics_node_update> ordered_set;
或者,如果需要多集,则可以用std::less_equal<int>
重新填充std::less<int>
。
以下是按等级查找的演示:
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
#include <iostream>
typedef tree<int, null_type, std::less_equal<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;
int main()
{
ordered_set s;
s.insert(10);
s.insert(20);
s.insert(50);
s.insert(25);
for(int i=24; i<=26; i++) std::cout << "Rank of " << i << ": " << s.order_of_key(i) << std::endl;
}
我认为C++中的STL集合中有一个下界函数,它可以用来查找集合中元素的秩。看看https://www.geeksforgeeks.org/set-lower_bound-function-in-c-stl/.
相关文章:
- 成员函数不能为集合迭代器和const_iterator的输入重载(但可以为其他 STL 迭代器重载)
- STL:在没有输出的情况下处理两个集合
- 是否可以在C STL中获得集合的单个元素
- 方法插入到任何stl集合中
- 追加到 STL 集合
- 从C++ STL 集合中获取泛型key_type
- 我怎样才能完美地将参数转发到 STL 集合
- STL 集合的插入方法是否复制传递对象的值?
- 在stl集合中设置lower_bound
- 如何在O(logn)中找到stl集合中元素的秩
- stl集合迭代器
- STL集合的去引用迭代器
- c++ STL集合的比较函数:比较函数可以是类的成员函数吗?
- 如何在c++中计算两个STL集合的交集的大小
- c++ STL集合:比较对象与外部状态
- 自定义对象的STL集合,每个对象包含一个STL集合
- 在stl集合中移除迭代器时出现分割错误
- 创建从STL集合继承的新类带来的bug
- 在没有默认构造函数时初始化 STL 集合元素(不是指针)
- STL集合使用什么样的哈希函数?