最常见的值c ++使用map

时间:2016-11-27 20:57:10

标签: c++ dictionary

找到最常见的值(频率最高的值)。如果两个(或更多)值具有相同的频率,则随机选择其中一个

我需要随机位

的帮助
    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();

1 个答案:

答案 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