C ++ Поиск элемента с наибольшим вхождением в массив

Я ищу элегантный способ определения, какой элемент имеет наибольшее вхождение (режим) в массиве C ++ ptr.

Например, в

{"pear", "apple", "orange", "apple"}

"apple" элемент является наиболее частым.

Мои предыдущие попытки потерпели неудачу
РЕДАКТИРОВАТЬ: массив уже отсортирован.

int getMode(int *students,int size)
{
int mode;
int count=0,
maxCount=0,
preVal;

preVal=students[0]; //preVall holds current mode number being compared
count=1;
for(int i =0; i<size; i++) //Check each number in the array
{
if(students[i]==preVal) //checks if current mode is seen again
{
count++; //The amount of times current mode number has been seen.
if(maxCount<count)  //if the amount of times mode has been seen is more than maxcount
{
maxCount=count; //the larger it mode that has been seen is now the maxCount
mode=students[i]; //The current array item will become the mode
}else{
preVal = students[i];
count = 1;
}

}

}

return mode;
}

0

Решение

Есть несколько возможных решений этой проблемы, но сначала несколько советов:
Не используйте массивы в стиле C использование std::array для массивов фиксированного размера (во время компиляции) или std::vector для массивов в куче (или C ++ 14 std::dynarray если размер массива определяется во время выполнения, но не изменяется после создания). Эти контейнеры обеспечивают управление памятью, и вам не нужно передавать размер массива отдельно. В дополнение к использованию контейнеров, предпочитают использовать алгоритмы в <algorithm> где уместно. Если вы не знаете контейнеры и алгоритмы, потратьте некоторое время, чтобы ознакомиться с ними, это время очень скоро окупится.

Итак, вот несколько эскизов решения:

  1. Сортируйте массив, затем посчитайте вхождения последовательных значений. Это гораздо проще, чем отслеживать, какие значения вы уже посчитали, а какие нет. В основном вам нужны только две пары подсчета значений: одна для значения, которое вы сейчас подсчитываете, одна для максимального значения до настоящего времени. Вам понадобится только пятая переменная: итератор для контейнера.

  2. Если вы не можете отсортировать массив или вам нужно отслеживать все рассчитывает, используйте карту для сопоставления значений с их количеством вхождений в массиве. Если вы знакомы с std::mapэто очень просто сделать. В конце найдите максимальное количество, то есть максимальное значение карты:

    for (auto i: students) countMap[i]++;
    auto pos = std::max_element(begin(countMap), end(countMap),
    [](auto lhs, auto rhs){ return lhs.second < rhs.second }); //! see below
    auto maxCount = pos->second;
    

Примечание: здесь используется диапазон, основанный на C ++ 11, и полиморфная лямбда C ++ 14. Должно быть очевидно, что здесь делается, поэтому его можно настроить для поддержки C ++ 11 / C ++ 14, которую обеспечивает ваш компилятор.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]