在多字节

时间:2016-04-15 21:09:42

标签: c++ c++11

我有一个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?

3 个答案:

答案 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.在二叉树中,没有不平凡的方法就可以在不将额外信息(例如子节点数)存储在节点中的情况下获得节点的“排序索引”。

也知道通过findupper_bound等返回的迭代器进行迭代会遍历树,因为迭代器不是随机访问的。参见https://en.cppreference.com/w/cpp/container/multiset

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

答案 2 :(得分:0)

这可以使用gcc中可用的一些基于策略的数据结构来解决。您可以将红黑树与信息统计信息一起使用,这里是discussion