我有一个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?
答案 0 :(得分:5)
密切关注您提出的M.upper_bound(k)-M.begin()+1
解决方案(显然无法编译,因为多图迭代器是一个未实现operator-
的双向迭代器),您可以使用std::distance来获取两个多图迭代器之间的距离,以获得正确的解决方案。
请注意,此解决方案将具有O(n)
复杂性,因为如果迭代器不是随机访问迭代器,std::distance
将只增加作为第一个参数传入的迭代器,直到它找到传入的迭代器作为第二个论点。
我也不认为这个问题可以用O(n)
的{{1}}复杂度来解决。
答案 1 :(得分:1)
Gcc implements multisets as red-black trees.在二叉树中,没有不平凡的方法就可以在不将额外信息(例如子节点数)存储在节点中的情况下获得节点的“排序索引”。
也知道通过find
,upper_bound
等返回的迭代器进行迭代会遍历树,因为迭代器不是随机访问的。参见https://en.cppreference.com/w/cpp/container/multiset
如果只想使用内置数据结构,则可以维护一个单独的向量,以对其执行二进制搜索。这是更多的组织工作,但是如果您仅插入或擦除,则非常简单。任何更复杂的事情都可能需要保证其自己的数据结构。
答案 2 :(得分:0)
这可以使用gcc中可用的一些基于策略的数据结构来解决。您可以将红黑树与信息统计信息一起使用,这里是discussion