我有一個整數數組。我想用C++在數組中找到所有不同的元素。 solutin 1:蠻力 使用嵌套循環,該解決方案的複雜度是O(n^2)使用C++在數組中找到不同的元素
溶液2:排序 這將需要O(n日誌N)
是否有任何其他技術,該技術能比O(n Log n)給出更好的結果? 任何其他數據結構或任何不同的技術?
我有一個整數數組。我想用C++在數組中找到所有不同的元素。 solutin 1:蠻力 使用嵌套循環,該解決方案的複雜度是O(n^2)使用C++在數組中找到不同的元素
溶液2:排序 這將需要O(n日誌N)
是否有任何其他技術,該技術能比O(n Log n)給出更好的結果? 任何其他數據結構或任何不同的技術?
如果你知道最大整數,並且它相當小,你不能分配一個大的向量並用它來計算每個整數的頻率。然後,迭代向量,並找到所有與頻率之一:
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背後的想法。
您也可以嘗試使用std::nth_element:它部分地排序範圍[第一,第n,最後),使得區間[第一,第n個]中的所有條目都是< =第n個,並且所有元素間隔(第n個,最後一個)> =第n個。它具有線性複雜度(O(n)),並會在序列中找到第n個元素。不過,它不適合找到具體的號碼,所以也許它不是你所需要的。但值得記住:-)
由不同的你的意思,那有頻率1? –