如何使用C++中的频率表计算模式

how to calculate mode using frequency table in C++

本文关键字:计算 模式 频率 何使用 C++      更新时间:2023-10-16

我的任务是打印数据的模式(最常见的值(,我已经编写了代码来告诉哪个值出现了多少次,但它在我的输出后也显示一些随机数我似乎无法弄清楚为什么

//Calculating and displaying mode
for(i=0; i<6; i++)
{
count = 1;
for(j=i+1; j<6; j++)
{
if(arr[i] == arr[j])
{
count++;
arr_freq[j] = 0;
}
}
if(arr_freq[i] != 0)
arr_freq[i] = count;
}
for(i=0; i<6; i++)
{
if(arr_freq[i] != 0)
cout<<arr[i]<<"      "<<arr_freq[i]<<endl;
}

我希望程序打印最常见的值(模式(,但这就是我得到的

3      1
6      1
7      1
8.9      3
5.88413e-39      5.88232e-39
0      5.88232e-39
5.88232e-39      4.96894e-09
0      3.88412e-41
0      9.19956e-38
0      4.34276e-41
0      1.4013e-45
4.96894e-09      5.88131e-39
9.19956e-38      9.26428e-26
4.34276e-41      9.18712e-18
0      5.88232e-39
5.88131e-39      9.19956e-38
0      4.34276e-41
5.88232e-39      -234877
0      -4.92527e+10
9.19956e-38      4.5936e+19
4.34276e-41      -1.71458e+36
4.5936e+19      5.88402e-39
0      9.19956e-38
0      4.34276e-41
0      1.4013e-45

我希望它打印"模式是:(最常见的值(">

这是一个问题,在 SO 上被问得更频繁。

计算数组中元素的频率。标准方法是使用std::map,将数组的值存储在其中,并为每个相关值递增相应的插槽。

最大频率可以通过STL-std算法std::max_element找到。

所以基本上我们需要 2 个陈述来回答这个问题。

请参阅以下众多解决方案建议之一:

#include <iostream>
#include <vector>
#include <map>
#include <iterator>
#include <algorithm>
std::vector<int> arr{1,2,2,3,3,3,4,4,4,4,5,5,5,5,5,8,8,8,8,8,8,8,8,6,6,6,6,6,6,7,7,7,7,7,7,7};
int main()
{
// Here we will store the frequency for each element 
std::map<int, size_t> frequency;
// Make reading easier
using pair_t = decltype(frequency)::value_type;
// Count frequency
std::for_each(arr.begin(), arr.end(), [&frequency](int& i){ frequency[i]++; });
// Output highes frequency of array value
std::cout << "nMax:  " << std::max_element(frequency.begin(), frequency.end(), []
(const pair_t& p1, const pair_t& p2){ return p1.second < p2.second;})->first << "n";
return 0;
}