使用c ++在数组中查找不同的元素

时间:2015-08-22 04:41:27

标签: c++ arrays sorting

我有一个整数数组。我想使用c ++找到数组中的所有不同元素。 solutin 1:BRUTE FORCE 使用嵌套循环,此解决方案的复杂性为O(n ^ 2)

解决方案2:分类 这将采用O(nLog n)

有没有其他技术可以提供比O(n Log n)更好的结果? 任何其他数据结构或任何不同的技术?

3 个答案:

答案 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背后的想法。