Ich muss einen C++ - Code schreiben, der den Median und den Modus eines Arrays ermittelt. Mir wurde gesagt, dass es viel einfacher ist, den Modus eines Arrays zu finden, nachdem die Zahlen sortiert wurden. Ich habe die Funktion sortiert, kann den Modus aber immer noch nicht finden.
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;
Wenn das Array bereits sortiert wurde, können Sie das Vorkommen einer Nummer gleichzeitig zählen. Dann speichern Sie einfach die Nummer mit den größten Vorkommen. Und Sie können den Modus nur in einer for-Schleife herausfinden. Andernfalls müssen Sie mehr als eine for-Schleife ausführen. Ein Beispiel finden Sie unter dem Link unter . .] Finden Sie den Modus einer Anzahl von Zahlen
Hier ist der Code,
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;
Eine Möglichkeit ist, dass Sie Lauflängencodierung verwenden können. Bei der Lauflängencodierung würde die Darstellung folgendermaßen aussehen. (Element, seine Häufigkeit).
Behalten Sie dabei die maximale Häufigkeit und das Element im Auge. Dadurch erhalten Sie den Modus, sobald Sie die Lauflänge abgeschlossen haben.
zum Beispiel:
1 1 2 2 2 3 3 4 5
Es wäre Lauflängencodierung
{1, 2}, {2, 3}, {3, 2}, {4, 1}, {5, 1}
Es benötigt O(n) Platz.
So habe ich es gemacht, meine Lösung verwendet einen sortierten Vektor als Eingabe. Es hat O(n) Zeitkomplexität und kann mit dem Fall arbeiten, in dem sich mehr als 1 "Modus" -Nummer im Vektor befindet.
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;
}
Hier ist das Code-Snippet:
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;
Während Diedreys Antwort nah ist, haben einige Leute auf einige Mängel hingewiesen, beispielsweise ob der Modus durch die letzten Zahlen des sortierten Arrays definiert ist (1,2,3,3,4,4,4
würde 3 als Modus zurückgeben). Abhängig von den Anforderungen an den Umgang mit mehreren Modi gibt es auch unterschiedliche Lösungen.
Diese Lösung führt mehrere Dinge aus:
-1
wenn es keinen Modus gibt (jede Zahl kommt nur einmal vor)int number = array[0];
int mode = number;
int count = 1;
int countMode = 1;
for (int i=1; i<size; i++)
{
if (array[i] == number)
{ // increment the count of occurrences for the current number
++count;
if (count > countMode)
{
countMode = count; // this number now has the most occurrences
mode = number; // this number is now the mode
}
}
else
{ // now this is a different number
count = 1; // reset count for the new number
number = array[i]; // set the new number
}
}
if (countMode == 1) {
mode = -1; // set the mode to -1 if each number in the array occur only once
}
cout << "mode : " << mode << endl;
Der "Modus" ist der am häufigsten vorkommende Wert. Wenn keine Nummer wiederholt wird, gibt es keinen Modus für die Liste. Die Sortierung wäre also nicht von Vorteil, wenn Sie den "Modus" kennen müssen.
Sind Sie sicher, dass Sie sich nicht auf den Median beziehen? Der Median ist die mittlere Zahl in einer Menge. Wenn Sie 1,2,3,4,5 haben, ist der Median (mittlere Zahl) die (total_number)/2) gerundet, wenn er ungerade ist, 2,5. > 3 und unser Medianwert ist 3. Sie können den Medianwert wirklich nur berechnen, wenn Ihre Zahlen sortiert sind. Wenn Sie eine gerade Zahl in einer Menge 1,2,3,4,5,6 Ihr Modus ist Slots 3,4 (zufällig auch 3,4) (total_number)/2 Slot und (total_number)/2 + 1 Slot für ein beliebiges gerades Zahlenfeld.
Das hatte funktioniert.
int vals[9];
sort(vals, vals + 9);
int key = vals[0], value = 1,max_key=0,max_value=0;
for (int l = 1; l < 9; l++){
if (key == vals[l]){
value++;
}
else{
if (value>max_value){
max_key = vals[l-1];
max_value = value;
}
key = vals[l];
value = 1;
}
}
cout<< "Mode: "<< max_key << endl;
Ich habe es so gemacht:
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();
Sie können auch weitere 25 zur Liste der Nummern hinzufügen und sehen, was passiert, wenn zwei Nummern das gleiche Vorkommen haben! Ich hoffe, es hilft.
Es gibt ein altes Sprichwort, das besagt "Wenn Sie 10 Programmierer in einen Raum bringen und ihnen das gleiche Programm zum Code geben, werden Sie 12 unterschiedliche Ergebnisse erhalten", daher meine Version der Beantwortung Ihrer Frage. Es ist vielleicht nicht so schnell (ich habe vor, die Geschwindigkeit gegenüber einigen anderen Vorschlägen zu testen), aber ich glaube, es ist leicht zu verstehen.
#include <iostream>
using namespace std;
int main ()
{
short z[10];
short maxCount = 0, curCount = 0, cur = 0, most = 0;
for (int i = 0; i < 10; i++)
{
cout << "Enter a number: " << endl;
cin >> z[i];
}
for (int i = 0; i < 10; i++)
{
cur = z[i];
for (int a = i; a < 10; a++)
{
if (cur == z[a])
{
curCount++;
cur = z[a];
}
if (curCount > maxCount)
{
maxCount = curCount;
most = z[a];
}
}
curCount = 0;
}
cout << "the mode is : " << maxCount << ", the number is: " << most << endl;
}
Dieser Code findet den Modus in 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 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
count = 1; // reset count for the new number
number = array[i];
}
if (count > countMode) {
countMode = count;
mode = number;
}
}
cout << "mode : " << mode << endl;
Dieser Code sollte Ihnen den Modus geben. Wenn es zwei gleiche Zahlen gibt, wird die erste Zahl ausgegeben.
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;
Dieser Code verwendet "map", um den MODE aus dem angegebenen Array herauszufinden. Es wird davon ausgegangen, dass das Array bereits sortiert ist.
int findMode(int * arr, int arraySize)
{
map<int, int> modeMap;
for (int i = 0; i < arraySize; ++i) {
++modeMap[arr[i]];
}
auto x = std::max_element(modeMap.begin(), modeMap.end(),
[](const pair<int, int>& a, const pair<int, int>& b) {
return a.second < b.second; });
return x->first;
}