Поиск нескольких режимов в векторе с использованием карт - PullRequest
1 голос
/ 21 февраля 2012

Так что я был в этом режиме некоторое время, и получил некоторую помощь, выясняя, как это сделать здесь, и подумал, что мог бы попросить немного больше помощи. Я так много разобрался.

map<int,unsigned> frequencyCount;
//This is my attempt to increment the values of the map everytime one of the same numebers 
for(size_t i = 0; i < v.size(); ++i)
    frequencyCount[v[i]]++;

unsigned currentMax = 0;
unsigned checked = 0;
unsigned mode = 0;
for(auto it = frequencyCount.cbegin();
    it != frequencyCount.cend(); ++it )

if (it ->second > currentMax)
    {
        mode = it->first;
        currentMax = it->second;
    }

if (currentMax == 1)
{
    cout << "There is no mode in the vector" << endl;
}

else {
cout << " The mode of the vector is: " << mode << endl;
}

}

Таким образом, он вернет наиболее часто встречающееся int внутри вектора и вернет, что нет режима, если ни одно из значений карты не превышает 1. Теперь я пытался выяснить, что делать в случае более чем один режим, напр. 1 2 3 3 4 4 5 в настоящее время возвращает 3. Я хотел бы повторить 3 и 4.

Логически я бы сказал, что оператор if, проверяющий переменную, которая встречается наиболее часто по второму наиболее частому, будет работать. Конечно, есть возможность 400 режимов, если данные теста достаточно велики. Поэтому мне нужно создать цикл проверки и выхода, когда текущая переменная больше не равна той, которая встречается на единицу реже, чем она. Я просто не знаю, как это сделать. Любой совет, с чего начать?

1 Ответ

1 голос
/ 21 февраля 2012

Как вы указали, режим не обязательно уникален.

Итак, вы должны предоставить ответ в виде набора чисел, как вы правильно сказали.

Я бы создалвектор для хранения набора уникальных режимов из вашего набора, а затем выведите содержимое вектора режима.

например,

std::vector<float> Modes;

// 3 is detected as mode as it occurs 3 times in your set
Modes.push_back(3);

// 4 is also detected as mode, since it also occurs 3 times in your set
Modes.push_back(4);

// output the modes for the set
std::cout << "the following mode(s) were detected in the set";
for( int n = 0; n < Modes.size(); n ++ )
{
  std::cout << "Mode: " << Modes[n] << "\n";
}

надеюсь, это имеет смысл

...