C++ 删除<;数量>;O(n)时间内容器中元素的数量

C++ 删除<;数量>;O(n)时间内容器中元素的数量,c++,algorithm,complexity-theory,time-complexity,C++,Algorithm,Complexity Theory,Time Complexity,假设您想要实现一个模板化函数,该函数将两个迭代器带到一个容器,一个整数描述“如果容器中的元素在容器中的次数少于次,则将其从容器中弹出”。这样的声明可以是: template <class theIter> theIter pop_um(theIter start, theIter end, int fewerThan); 模板 利润率(利润率起点、利润率终点、整数比); 有可能在O(n)时间内编写这样一个函数吗?执行这样的任务通常使用哪些过程?桶/基对数据(从开始到结束迭代器)进

假设您想要实现一个模板化函数,该函数将两个迭代器带到一个容器,一个整数描述“如果容器中的元素在容器中的次数少于次,则将其从容器中弹出”。这样的声明可以是:

template <class theIter>
theIter pop_um(theIter start, theIter end, int fewerThan);
模板
利润率(利润率起点、利润率终点、整数比);

有可能在O(n)时间内编写这样一个函数吗?执行这样的任务通常使用哪些过程?

桶/基对数据(从开始到结束迭代器)进行排序,以线性时间开始。然后以线性时间扫描新的排序列表,跟踪元素的变化,使其易于弹出。线性时间。O(2n)=O(n)。根据您的排序方式,存储桶需要大量RAM。

有没有编写代码尝试这样做?无意冒犯,但这看起来像是一个家庭作业问题。我是从课本上找到这个问题的(根据推荐),所以它不是特别的家庭作业。我不知道如何在O(n)中进行移除;也就是说,我们如何快速确定哪些元素出现的次数少于3次?如果我有一个向量(2,3,2,4,4,5,5,5,5,6,7,4),我想删除所有出现次数少于3次的元素(即删除2,3,6和7),会怎么样。例如,如果我从开始到结束,我怎么知道2在我遇到它的第一个实例时只出现两次(没有遍历整个容器)?更好的解决方案-扫描数组并保持结构中每个元素的运行计数。完成后,运行计数数组并删除出现次数超过“少于”次的元素。这将运行O(2n*(num matches))时间,这将根据num_匹配在线性和二次之间变化。这里的问题是,当访问计数数组时,可以在固定时间内完成,但不会重新扫描计数。此外,堆栈/列表样式的解决方案也没有帮助,因为您必须在每次迭代中重新扫描以前的匹配项。Bucket/radix对数据进行排序,以线性时间开始。然后以线性时间扫描新的排序列表,跟踪元素的变化,使其易于弹出。线性时间。bucket排序的时间复杂度不是O(n^2)吗?还要注意,它不必包含整数。例如,它可以包含单词。基数排序也可以用于线性时间中的单词,只是速度不如线性时间快。桶排序最坏的情况是os O(n^2),而基数排序是线性的。在我看来,他们都很相似,这就是为什么我把他们提到一起。我仍然非常确定我的解决方案会在线性时间内工作,并坚持下去,直到其他人想出更好的解决方案。