поиск нескольких мод из вектора двойников - PullRequest
2 голосов
/ 12 июля 2019

Итак, нас попросили получить режим (ы) для вектора, который будет заполнять пользователь, это вектор двойных чисел, так что пока он работает для получения 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, он в основном берет первый найденный режим и печатает его вместо печати обоих режимов, которые я получил.

Ответы [ 2 ]

0 голосов
/ 12 июля 2019

Вот еще один пример использования 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
0 голосов
/ 12 июля 2019

Вы хотите отслеживать один или несколько элементов. Таким образом, вам нужен набор элементов, а не один элемент.

Заменить

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". Вы, вероятно, хотите, чтобы это произошло, когда freq равно 0, а не когда 1

...