找到最常见的值(频率最高的值)。如果两个(或更多)值具有相同的频率,则随机选择其中一个
我需要随机位
的帮助 map<int, int > myp;
int con = 0;
for (int h = 0; h < distan.size(); h++) {
con = (int) count(distan.begin(), distan.end(), distan[h]);
myp.insert(pair<int, int> (con, distan[h]));
}
//getting the highest frequency value
int max = 0;
int temp_max = max;
max = max_element(myp.begin(), myp.end())->first;
cout<<con<<endl;
data_labels.push_back(myp[max]);
myp.clear();
答案 0 :(得分:1)
我认为这里随机意味着您可以选择其中任何一种,不一定是随机的。无论如何,使用当前算法,您需要使用multimap
来存储与map
相同数字的计数,以替换旧值(输入中的元素)。
另外,上述解决方案不是很有效。它基本上遍历输入n
次(其中n
是输入元素的数量),并且对于每个步骤,它再次处理所有值,即复杂性是二次的 - O(n*n)
。
有效的方法是使用map
存储每个密钥(O(n*log2(n))
)的当前计数,最后选择具有最大值(O(n)
)的密钥:
map<int, int> counts;
for (int h = 0; h < distan.size(); h++) {
++counts[distan[h]];
}
int max = -1;
int maxKey;
// or vector<int> maxKeys;
for (map<int, int>::const_iterator it = m.begin(); it != m.end(); ++it) {
if (it->second > max) {
maxKey = it->first;
max = it->second;
// or maxKeys.reset(); maxKeys.push(it->first);
}
else if (it->second == max) {
// you can maintain list of the inputs with max occurences here
maxKeys.push(it->first);
}
}
// in maxKey we have the key with max number of occurences
// in max we have the max number of occurences
// if max stays -1, maxKey will be invalid, i.e. input was empty
// or in maxKeys you can have list and choose random one