繁体   English   中英

查找多集中小于或等于 k ​​的元素数

[英]Finding the number of elements less than or equal to k in a multiset

我有一个多重集,实现如下:

#include <bits/stdc++.h>
using namespace std;

multiset <int> M;

int numunder(int k){
    /*this function must return the number of elements smaller than or equal to k
    in M (taking multiplicity into account).
    */
}

起初我以为我可以只返回 M.upper_bound(k)-M.begin()+1。 不幸的是,我们似乎不能像这样减去指针。 我们最终不得不实现一个 AVLNodes 结构。 有没有办法利用 c++ std 让它工作?

严格遵守您提出的M.upper_bound(k)-M.begin()+1解决方案(显然无法编译,因为 multimap 迭代器是没有实现operator-的双向迭代器),您可以使用std::distance获得两个多映射迭代器之间的距离以获得正确的解决方案。

请注意,此解决方案将具有O(n)复杂度,因为如果迭代器不是随机访问迭代器,则std::distance只会递增作为第一个参数传入的迭代器,直到找到作为第二个参数传入的迭代器。

我也不认为这个问题可以用std::multiset以比O(n)复杂度更好的方式解决。

这可以使用 gcc 中可用的一些基于策略的数据结构来解决。 可以用红黑树做信息统计,这里有讨论

Gcc 将多重集实现为红黑树。 在二叉树中,没有非平凡的方法来获取节点的“排序索引”而不在节点中存储额外的信息,例如子节点的数量。

还要知道遍历findupper_bound等返回的迭代器会遍历树,因为迭代器不是随机访问的。 请参阅https://en.cppreference.com/w/cpp/container/multiset

如果您只想使用内置数据结构,您可以维护一个单独的向量,您可以对其执行二进制搜索。 这是更多的组织工作,但如果您只是插入或擦除,那么它非常简单。 任何更复杂的东西都可能需要它自己的数据结构。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM