2012-02-21 1 views
1

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

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; 
} 

}

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

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

+0

Из вашего примера ("1 2 3 3 4 4 5"), похоже, вектор сортируется. Это так? – jogojapan

+0

Да, это отсортировано, это первое, что я сделал, чтобы найти значения max и min для вектора. – Sh0gun

ответ

1

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

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

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

например.

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"; 
} 

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

+1

То, что я получаю от этого, это то, что я должен делать. 1. Найдите максимальное значение на карте, которое = режим 2. Найдите все остальные значения на карте = до максимума 3. Вставьте все это в новый вектор режимов 4. Распечатайте содержимое нового vector Это то, что я буду пытаться, я вернусь к вам, как только я преуспею или потерплю неудачу. Спасибо за совет! – Sh0gun

+0

Звучит правильно, удачи;) –

Смежные вопросы