从双打向量中找到多种模式
finding multiple modes from a vector of doubles
所以我们被要求获取用户将要填写的向量的模式,它是双精度向量,到目前为止我得到了 1 模式,但是当它出现时对于超过 1 种模式,我冻结了,有人有什么建议吗?(顺便说一句,我是编码初学者,所以不要烤)
void getMode(vector<double> v)
{
double element = 0;
int freq = 0;
for (int it = 0; it != v.size(); it++)
{
double tempElement = v[it];
int tempFreq = 0;
for (int i = 0; i < v.size(); i++)
if (v[i] == tempElement)
tempFreq++;
if (tempFreq > freq)
{
element = tempElement;
freq = tempFreq;
}
}
if(freq > 1 )
{
cout << "\nfreq: " << freq <<"\nElement: " << element;
}
else
{
cout << "\nno mode ";
}
}
假设用户输入 1,1,3,3,4,5
我的模式将只是数字 1 而不是 1 和 3,它基本上采用它找到的第一个模式并打印它而不是打印我得到的两种模式。
您想跟踪一个或多个元素。所以你需要一组元素而不是单个元素。
替换
double element = 0;
和
vector<double> element;
然后,而不是这个
if (tempFreq > freq)
{
element = tempElement;
freq = tempFreq;
}
尝试这样的事情:
if (tempFreq > freq)
{
// Empty element vector
// Add tempElement to element vector
freq = tempFreq;
}
else if (tempFreq == freq)
{
// Add tempElement to element vector
}
最后,循环遍历 element
向量以显示每个成员。
另请注意,如果 freq
最后是 1
,则所有元素都出现一次。在这种情况下,您当前显示 "no mode"
。您可能希望在 freq
为 0
时发生这种情况,而不是在 1
时发生
这是另一个使用 unordered_map
计算频率的例子:
#include <algorithm>
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
bool compareFreq(const pair<double,int> &p1, const pair<double,int> &p2)
{
return (p1.second > p2.second);
}
void getMode(const vector<double> &v)
{
unordered_map<double,int> freq_map;
for (auto elem : v) {
freq_map[elem]++;
}
vector<pair<double,int>> freq_vec(freq_map.begin(), freq_map.end());
sort(freq_vec.begin(), freq_vec.end(), compareFreq);
for (auto elem : freq_vec ) {
cout << elem.first << " : " << elem.second << endl;
}
}
int main()
{
vector<double> v {1.0, 2.0, 1.0, 3.0, 4.0, 3.0, 3.0};
getMode(v);
return 0;
}
输出:
3 : 3
1 : 2
4 : 1
2 : 1
所以我们被要求获取用户将要填写的向量的模式,它是双精度向量,到目前为止我得到了 1 模式,但是当它出现时对于超过 1 种模式,我冻结了,有人有什么建议吗?(顺便说一句,我是编码初学者,所以不要烤)
void getMode(vector<double> v)
{
double element = 0;
int freq = 0;
for (int it = 0; it != v.size(); it++)
{
double tempElement = v[it];
int tempFreq = 0;
for (int i = 0; i < v.size(); i++)
if (v[i] == tempElement)
tempFreq++;
if (tempFreq > freq)
{
element = tempElement;
freq = tempFreq;
}
}
if(freq > 1 )
{
cout << "\nfreq: " << freq <<"\nElement: " << element;
}
else
{
cout << "\nno mode ";
}
}
假设用户输入 1,1,3,3,4,5 我的模式将只是数字 1 而不是 1 和 3,它基本上采用它找到的第一个模式并打印它而不是打印我得到的两种模式。
您想跟踪一个或多个元素。所以你需要一组元素而不是单个元素。
替换
double element = 0;
和
vector<double> element;
然后,而不是这个
if (tempFreq > freq)
{
element = tempElement;
freq = tempFreq;
}
尝试这样的事情:
if (tempFreq > freq)
{
// Empty element vector
// Add tempElement to element vector
freq = tempFreq;
}
else if (tempFreq == freq)
{
// Add tempElement to element vector
}
最后,循环遍历 element
向量以显示每个成员。
另请注意,如果 freq
最后是 1
,则所有元素都出现一次。在这种情况下,您当前显示 "no mode"
。您可能希望在 freq
为 0
时发生这种情况,而不是在 1
这是另一个使用 unordered_map
计算频率的例子:
#include <algorithm>
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
bool compareFreq(const pair<double,int> &p1, const pair<double,int> &p2)
{
return (p1.second > p2.second);
}
void getMode(const vector<double> &v)
{
unordered_map<double,int> freq_map;
for (auto elem : v) {
freq_map[elem]++;
}
vector<pair<double,int>> freq_vec(freq_map.begin(), freq_map.end());
sort(freq_vec.begin(), freq_vec.end(), compareFreq);
for (auto elem : freq_vec ) {
cout << elem.first << " : " << elem.second << endl;
}
}
int main()
{
vector<double> v {1.0, 2.0, 1.0, 3.0, 4.0, 3.0, 3.0};
getMode(v);
return 0;
}
输出:
3 : 3
1 : 2
4 : 1
2 : 1