c++ set:计算小于某个值的元素

C++ set: counting elements less than a value

本文关键字:元素 小于 set 计算 c++      更新时间:2023-10-16

假设我有一个STL set <int> sint 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)次。也许在树的节点中添加额外的数据,可以做得更好。