[英]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 将多重集实现为红黑树。 在二叉树中,没有非平凡的方法来获取节点的“排序索引”而不在节点中存储额外的信息,例如子节点的数量。
还要知道遍历find
、 upper_bound
等返回的迭代器会遍历树,因为迭代器不是随机访问的。 请参阅https://en.cppreference.com/w/cpp/container/multiset
如果您只想使用内置数据结构,您可以维护一个单独的向量,您可以对其执行二进制搜索。 这是更多的组织工作,但如果您只是插入或擦除,那么它非常简单。 任何更复杂的东西都可能需要它自己的数据结构。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.