c++ set:计算小于某个值的元素
C++ set: counting elements less than a value
假设我有一个STL set <int> s
和int x
,我如何计算s
中小于x
的元素的数量?
我正在寻找O(log n)
(或类似;任何比O(n)
)解决方案更好的方案;
我已经知道std::distance(s.begin(), s.lower_bound(x))
了,但我相信那是O(n)
,因为set
不是随机访问的。
你需要的是一个'订单统计树'。它本质上是一个增强的(二叉搜索)树,支持额外的操作rank(x)
,该操作为您提供与元素x
键值较小或相等的元素的数量。第14章《科曼,雷瑟森,莱维斯特,斯坦》;"算法导论"应该会给你算法的背景知识。
web上也有一些实现
作为我评论的后续:使用红黑二叉搜索树(而不是集合),如果每个节点存储在该节点上的节点数量(每次插入/删除节点时更新),那么您可以相当快地获得"大于/小于X的节点数量"统计信息。
我认为这是不可能的。你的STL集合是一个基于树的结构,所以即使只是检查一个元素的存在是O(log n)。你的树的节点不存储他们的分支的大小在任何字段(据我所知),所以需要的操作数计数节点有一些属性,不直接遵循规则用于构建树不能小于这些节点的数量。由于事先不知道有多少节点的值小于x,所以最坏情况的性能是当所有节点都小于x时,这意味着最坏情况复杂度为O(n)。即使值x在树中,你也需要O(log n)次操作来找到那个节点,但是你需要访问它所有的左后代来计算它们,所以复杂度取决于匹配节点的数量最坏情况下是O(n)次。也许在树的节点中添加额外的数据,可以做得更好。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 如何在随机数列表中查找大于或小于的元素
- std::p artition 的问题,用于分离小于枢轴的元素
- 每个元素小于某个特定数字的子数组的总和
- 为什么 unordered_map::equal_range upper_bound 如果键小于第一个映射元素,则返回
- 在 2D 向量中从每一行添加最大元素,以使行元素 $A_i$ 小于 $A_(i+1)$
- C++映射中,找到第一个小于键的元素
- 如何使用二进制索引树来计算小于索引值的元素数量
- C++-返回向量中最大元素的最有效方法小于给定的输入
- 编写一个函数,返回一个堆栈,该堆栈包含所有小于给定数字的元素,并且顺序相同
- 有没有一种方法可以为std::map中小于给定键的第一个元素找到反向迭代器
- 如何在小于O(n)的时间内选择std::集合中的一个随机元素
- 递归算法对数组中值小于x的每个元素求和
- 在未排序的整数数组中找到最小元素的速度小于0 (n)
- 创建一个函数,检查一个数组是否有两个相反的元素,复杂度小于n^2.(c++)
- 数组中所有元素的和小于0 (n)
- c++ set——键值小于x的元素个数
- c++ set:计算小于某个值的元素