最大发生次数

时间:2013-05-28 12:56:29

标签: c++ count max find-occurrences

我想在数组中找到具有最大出现次数并知道出现次数的元素。请建议我使用最快的C ++代码。(如果可以提供任何帮助,您可以自由使用STL。)

2 个答案:

答案 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::mapstd::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)