我有一个整数数组。我想使用c ++找到数组中的所有不同元素。 solutin 1:BRUTE FORCE 使用嵌套循环,此解决方案的复杂性为O(n ^ 2)
解决方案2:分类 这将采用O(nLog n)
有没有其他技术可以提供比O(n Log n)更好的结果? 任何其他数据结构或任何不同的技术?
答案 0 :(得分:4)
使用std::unordered_set
将是O(n)。
答案 1 :(得分:0)
您也可以尝试使用std::nth_element:它会对[first,n-last]范围进行部分排序,使得区间[first,n-th]中的所有条目都是< = n-th,并且区间(第n个,最后一个)中的所有元素都是> =而不是第n个。它具有线性复杂度(O(n)),并且将在序列中找到第n个元素。但是,它不适合找到一个特定的数字,所以也许它不是你需要的。但值得记住: - )
答案 2 :(得分:-1)
如果您知道最大整数,并且它相当小,则可以分配一个大向量并使用它来计算每个整数的频率。然后,迭代向量并找到频率为1的全部:
template<typename I>
auto findWithFrequency(int f, int max, I first, I last)
{
std::vector<int> counts(max, 0);
for(; first != last; ++first)
{
counts[*first] += 1;
}
std::vector<typename I::value_type> v;
v.reserve( std::distance(first, last) );
std::copy_if(counts.begin(), counts.end(),
std::back_inserter(v),
[f](auto x) {return x == f;});
return v;
}
在最坏的情况下,这需要对输入数组大小的数组进行两次迭代,因此复杂度为O(n)。
这基本上是Bucketsort或Radix背后的想法。