【问题标题】:finding multiple modes from a vector of doubles从双打向量中找到多种模式
【发布时间】:2019-11-21 16:19:58
【问题描述】:

所以我们被要求获取用户将要填写的向量的模式,它是一个双精度向量,到目前为止,我已经将它用于获取 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,它基本上采用它找到的第一个模式并打印它而不是打印我得到的两种模式。

【问题讨论】:

  • 把它变成我们可以编译的东西,我很确定你会在几分钟内得到答案。
  • Ted 试图告诉你的是学习和应用制作minimal reproducible example 的概念。 (@Ted,在以后的 cmets 中尝试输入 [mcve]。)
  • 另外请解释一下“我冻结”是什么意思。
  • 为了完善它,请使用tour
  • @Maad98 您如何使用铅笔和纸找到多种模式?您是否不需要将每个双打的计数存储在某处,完成后查看哪些双打并列最高计数?你的代码甚至接近这个概念吗?

标签: c++ mode


【解决方案1】:

您想要跟踪一个或多个元素。所以你需要一个元素的集合而不是单个元素。

替换

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"。您可能希望在 freq0 时发生这种情况,而不是在 1 时发生这种情况

【讨论】:

  • 当你说将 tempElement 添加到元素向量时,你的意思是 push_back 吗?
  • 是的,这是一种方法。
  • 由于某种原因它不起作用,所以我所做的是将我的元素更改为双精度向量,我在你展示给我的两个 if 语句中都做了 element.push_back[tempElement],然后我遍历元素向量并在迭代器上打印每个元素,它打印了一些奇怪的值 tbh so idk
  • 很难说没有看到你的代码 - 但如果你真的按照我上面的建议去做,它会起作用。
【解决方案2】:

这是另一个使用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

【讨论】:

  • 你声明了一个 double 和一个 int 但从未在 getMode 函数中使用它们,它们有什么用?
  • @Maad98 谢谢!实验的剩菜:)
猜你喜欢
  • 1970-01-01
  • 2021-05-17
  • 1970-01-01
  • 2019-03-06
  • 2012-03-11
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
相关资源
最近更新 更多