所以我已经有一段时间处于这种模式状态,并得到了一些帮助,想知道如何在这里做到这一点,并认为我可能会要求更多的帮助。我已经弄清楚了这一点。
map<int,unsigned> frequencyCount;
//This is my attempt to increment the values of the map everytime one of the same numebers
for(size_t i = 0; i < v.size(); ++i)
frequencyCount[v[i]]++;
unsigned currentMax = 0;
unsigned checked = 0;
unsigned mode = 0;
for(auto it = frequencyCount.cbegin();
it != frequencyCount.cend(); ++it )
if (it ->second > currentMax)
{
mode = it->first;
currentMax = it->second;
}
if (currentMax == 1)
{
cout << "There is no mode in the vector" << endl;
}
else {
cout << " The mode of the vector is: " << mode << endl;
}
}
因此,它会在向量中重新生成最常出现的int,如果没有任何一个map值超过1,则返回没有模式。现在我一直试图找出超过1的情况下的内容。一种模式,例如1 2 3 3 4 4 5当前返回3.我想重新获得3和4。
逻辑上我会说if语句检查最频繁发生的变量对第二个最常见的变量是可行的。当然,如果测试数据足够大,则可能有400种模式。所以我需要创建一个循环,当当前变量不再等于比它更频繁出现的变量时,检查并退出。我真的不确定该怎么做。关于从哪里开始的任何建议?
答案 0 :(得分:1)
正如您所指出的,模式不一定是唯一的。
因此,您应该将答案作为一组数字提供,正如您所说的那样。
我会创建一个向量来存储集合中的唯一模式集,然后输出模式向量的内容。
e.g。
std::vector<float> Modes;
// 3 is detected as mode as it occurs 3 times in your set
Modes.push_back(3);
// 4 is also detected as mode, since it also occurs 3 times in your set
Modes.push_back(4);
// output the modes for the set
std::cout << "the following mode(s) were detected in the set";
for( int n = 0; n < Modes.size(); n ++ )
{
std::cout << "Mode: " << Modes[n] << "\n";
}
希望这是有道理的