我想在数组中找到具有最大出现次数并知道出现次数的元素。请建议我使用最快的C ++代码。(如果可以提供任何帮助,您可以自由使用STL。)
答案 0 :(得分:3)
这是在C ++ 11中实现它的一种方法:
#include <vector>
#include <map>
int most_frequent_element(std::vector<int> const& v)
{ // Precondition: v is not empty
std::map<int, int> frequencyMap;
int maxFrequency = 0;
int mostFrequentElement = 0;
for (int x : v)
{
int f = ++frequencyMap[x];
if (f > maxFrequency)
{
maxFrequency = f;
mostFrequentElement = x;
}
}
return mostFrequentElement;
}
您可以这样使用上述功能:
#include <iostream>
int main()
{
std::vector<int> v { 1, 3, 5, 6, 6, 2, 3, 4, 3, 5 };
std::cout << most_frequent_element(v);
}
这是live example。
通过一个小修改,上面的函数可以推广到任何容器(不只是std::vector
):
template<typename T>
typename T::value_type most_frequent_element(T const& v)
{ // Precondition: v is not empty
std::map<typename T::value_type, int> frequencyMap;
int maxFrequency = 0;
typename T::value_type mostFrequentElement{};
for (auto&& x : v)
{
int f = ++frequencyMap[x];
if (f > maxFrequency)
{
maxFrequency = f;
mostFrequentElement = x;
}
}
return mostFrequentElement;
}
感谢模板类型推导,您可以像调用原始模板一样调用上面的函数模板。
这是live example。
此外,为了获得更好的性能,您可以考虑使用C ++ 11 std::unordered_map
而不是std::map
。 std::unordered_map
为您提供了插入和查找的O(1)复杂度。我会将上述例子中的用法留给你作为练习。
答案 1 :(得分:1)
您可以在C ++中使用O(n log n)
解决此问题。
首先使用O(n log n)
排序(堆排序,合并排序,快速排序等)对数字进行排序列表中的元素。如果您不关心算法的复杂性,请使用Bubble Sort
对列表进行排序。在这种情况下,算法的复杂性将变为 O(n 2 )。
然后使用以下代码,该代码花费O(n)
时间从排序列表中找到具有最高出现次数的元素。
maxfreq=0;
freq=1;
for(i=0;i<(MAX-1);i++)
{
if(list[i]==list[i+1])
{
freq++;
if(freq > maxfreq)
{
maxfreq=freq;
maxind=i;
}
}
else
{
freq=1;
}
}
cout<<"Element "<<list[maxind]<<" occurs "<<maxfreq<<" times in the list";
总时间为O(log n + n)
。因此,算法的复杂性为O(log n)
。