使用双数组来查找模式?

时间:2017-02-22 16:26:56

标签: c++ arrays mode

我坚持如何编写一个函数来查找数组中包含的一组整数的模式,使用该数组及其长度作为参数。我在网上找到了多种关于如何找到阵列模式的解决方案,但我正在尝试通过以下方式解决这个问题:

假设原始数组包含(0,0,1,5,5,5,7,7,7)。我想用循环遍历数组,找到任何数量的最高频率而不存储模式,并将这些频率存储在另一个数组中,在这种情况下,新数组将具有值(1,2,1, 1,2,3,1,2,3)。通过在第二个数组中找到最大值,我会找到最高频率,在这种情况下为3。然后我想再次遍历原始数组,将最高频率与该数组中每个值的计数进行比较,并且在匹配的地方,我返回该值,在本例中我是5和7我是给予。鉴于此处的标准,您如何编写此函数来查找给定数组的模式? (您可以假设数组已按升序排序)。

编辑:这是我的初步代码。我找到了原始数组中每个整数的频率并将它们存储到另一个数组中的步骤。

    void findMode(int array, int size){ 
        int count = 1;
        int freq[size];
        freq[0] = count;
        for (int pass = 1; pass < size; pass++){
            if (array[pass] == array[pass-1]){
            count++;
            freq[pass] = count;
            } 
          else{
              count = 1;
              freq[pass] = count;
              }
      }   

1 个答案:

答案 0 :(得分:0)

如果您不介意一些额外的存储空间(可能是O(N)存储空间),您可以使用std::map获取计数,然后使用线性搜索最常用的数字。

#include <algorithm>
#include <cstddef>
#include <iostream>
#include <map>
#include <vector>

template<class InputIterator>
auto mode(InputIterator first, InputIterator last)
{
    using key_type = typename std::iterator_traits<InputIterator>::value_type;
    std::map<key_type, std::size_t> counts;
    for (auto it = first; it != last; ++it) {
        counts[*it]++;    
    }    
    return *std::max_element(counts.cbegin(), counts.cend(), [](auto const& lhs, auto const& rhs) {
        return lhs.second < rhs.second;
    }); // return mode + frequency
}

int main() {   
    auto v = std::vector<int> { 0, 0, 1, 5, 5, 5, 7, 7, 7 };   
    auto m = mode(v.cbegin(), v.cend());
    std::cout << m.first << ": " << m.second;
}

Live Example //打印5:3