Я должен написать код C ++, который находит медиану и режим массива. Мне сказали, что гораздо проще найти режим массива ПОСЛЕ того, как числа отсортированы. Я отсортировал функцию, но все еще не могу найти режим.
int counter = 0;
for (int pass = 0; pass < size - 1; pass++)
for (int count = pass + 1; count < size; count++) {
if (array [count] == array [pass])
counter++;
cout << "The mode is: " << counter << endl;
Если массив уже отсортирован, вы можете посчитать количество появлений сразу. Затем просто сохраните номер, который встречается чаще всего. И вы можете узнать режим только в одном цикле.
В противном случае вам придется сделать более одного цикла for.
Смотрите подробный пример по ссылке ниже
Найти-на-Mode-в-а-множество-номеров
Вот код,
int number = array[0];
int mode = number;
int count = 1;
int countMode = 1;
for (int i=1; i<size; i++)
{
if (array[i] == number)
{ // count occurrences of the current number
++count;
}
else
{ // now this is a different number
if (count > countMode)
{
countMode = count; // mode is the biggest ocurrences
mode = number;
}
count = 1; // reset count for the new number
number = array[i];
}
}
cout << "mode : " << mode << endl;
Одним из способов является то, что вы можете использовать кодировку длины выполнения. В кодировке длины выполнения представление будет выглядеть так: (Пункт, его частота).
При этом отслеживайте максимальную частоту и пункт. Это даст вам режим, как только вы завершите пробег.
например:
1 1 2 2 2 3 3 4 5
Это запустить длину кодирования будет
{1, 2}, {2, 3}, {3, 2}, {4, 1}, {5, 1}
Это нуждается в O (n) месте.
Вот как я это сделал, мое решение будет использовать отсортированный вектор в качестве входных данных. Он имеет O (n) временную сложность и может работать со случаем, когда в векторе имеется более 1 «модового» числа.
void findMode(vector<double> data) {
double biggestMode = 1;
vector<double> mode, numbers;
numbers.push_back(data.at(0));
mode.push_back(1);
int count = 0;
for (int i = 1; i < data.size(); i++) {
if (data.at(i) == numbers.at(count)) {
mode.at(count)++;
}
else {
if (biggestMode < mode.at(count)) {
biggestMode = mode.at(count);
}
count++;
mode.push_back(1);
numbers.push_back(data.at(i));
}
}
for (int i = 0; i < mode.size(); i++) {
if (mode.at(i) == biggestMode)
cout << numbers.at(i) << " ";
}
cout << endl;
}
Вот фрагмент кода:
int number = array[0];
int mode = number;
int count = 1;
int countMode = 1;
for (int i=1; i<size; i++)
{
if (array[i] == number)
{
count++;
}
else
{
if (count > countMode)
{
countMode = count;
mode = number;
}
count = 1;
number = array[i];
}
}
cout << "mode : " << mode << endl;
«Режим» — это значение, которое встречается чаще всего. Если номер не повторяется, то для списка нет режима.
Так что сортировка не принесет пользы, если вам нужно знать «режим».
Вы уверены, что не имеете в виду медиану? Медиана — это среднее число в наборе.
Если у вас 1, 2, 3, 4, 5, медиана (среднее число) — это (total_number) / 2), округленная в большую сторону, если она нечетная, 2,5 -> 3, и наша медиана будет равна 3. Вы действительно можете рассчитать только Медиана, если ваши номера отсортированы.
Если у вас четное число в наборе 1,2,3,4,5,6
ваш режим слотов 3,4 (по совпадению также 3,4)
(total_number) / 2 слота и (total_number) / 2 + 1 слот для любого четного массива чисел.
Этот код должен дать вам режим. Если есть равное количество двух разных чисел, он выведет первое из таких.
int count = 1, mode = 0, m = 0, i = 1;
size_t sz = sizeof(array)/sizeof(*array);
while(i != sz+1) {
if(array[i-1] != array[i]) {
if(count > m) {
mode = array[i-1];
m = count;
count = 1;
}
}
else
++count;
++i;
}
std::cout << "mode: " << mode << std::endl;
Этот код находит режим в C ++:
#include <iostream>
using namespace std;
int main(int argc, char** argv)
{
int i,j,k=0,n,repeat_max=0,cn=0;
int array1[50],mode[50],count[50]={0},c[50];
cout<<"\n inter count:\t";
cin>>n;cout<<"\n";
for(i=0;i<n;i++)
cin>>array1[i];
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(array1[i]==array1[j])
{
count[i]++;
if(count[i]>=repeat_max)
{
repeat_max=count[i];
mode[k++]=array1[i];
}
}
}
}
cout<<"\n================\n";
for(i=1;i<k;i++)
cout<<"\t mode[i]="<<mode[i]<<"\n";
cout<<"\t\n\nrepeat array:"<<repeat_max;
return 0;
}
Я сделал это так:
int main()
{
int mode,modecount2,modecount1;
bool is_nomode=false;
vector<int> numbers = { 15,43,25,25,25,25,16,14,93,93,58,14,55,55,55,64,14,43,14,25,15,56,78,13,15,29,14,14,16 };
sort(numbers);
//If you uncomment the following part, you can see the sorted list of above numbers
//for (int i = 0; i < numbers.size(); ++i) std::cout << numbers[i] << '\n';
//keep_window_open();
mode = numbers[0];
modecount1 = 0;
modecount2 = 1; //Obviously any number exists at least once!
for (int i = 1; i < numbers.size(); ++i) {
if(numbers[i]==numbers[i-1]) ++modecount2;
else {
if (modecount2 > modecount1) {
mode = numbers[i - 1];
modecount1 = modecount2;
}
else if (i != 1 && modecount2 == modecount1) { std::cout << "No mode!\n"; is_nomode = true; break; }
modecount2 = 1;
}
}
if(!is_nomode) std::cout << "Mode of these numbers is: " << mode << std::endl;
keep_window_open();
Также вы можете добавить еще 25 к списку номеров и посмотреть, что произойдет, если два числа встречаются одинаково!
Я надеюсь, что это помогает.