配列の中央値とモードを検出する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;
配列がすでに並べ替えられている場合は、数値の出現を一度に数えることができます。次に、発生回数が最も多い数を保存します。また、モードは1つのforループでのみ確認できます。それ以外の場合は、複数のforループを実行する必要があります。以下のリンクにある詳細な例を参照してください Find-the-Mode-of-a-Set-of-Numbers
これがコードです
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 1 2 2 2 3 3 4 5
ランレングスエンコーディングは
{1, 2}, {2, 3}, {3, 2}, {4, 1}, {5, 1}
O(n)スペースが必要です。
これがコードスニペットです。
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;
これは私がそれをした方法です、私の解決策は入力としてソートされたベクトルを取ります。これは、O(n)時間の複雑さを持ち、ベクトルに複数の「モード」番号がある場合でも機能します。
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;
}
Diedreiの答えは近いですが、ソートされた配列の最後の数によってモードが定義されている場合(1,2,3,3,4,4,4
はモードとして3を返す)など、いくつかの欠点を指摘する人がいます。また、複数のモードを処理する方法の要件に応じて、異なるソリューションがあります。
このソリューションはいくつかのことを行います:
-1
を返します(各番号は1回だけ発生します)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;
「モード」は、最も頻繁に発生する値です。番号が繰り返されない場合、リストのモードはありません。したがって、「モード」を知る必要がある場合は、ソートしてもメリットはありません。
中央値について言及していませんか?中央値は、セットの真ん中の数です。 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 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;
私はこのようにしました:
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を追加して、2つの数値が同じオカレンスを持つ場合に何が起こるかを確認できます!お役に立てば幸いです。
「部屋に10人のプログラマーを配置して同じプログラムをコード化すると、12の異なる結果が得られる」という古い格言があります。したがって、私のバージョンの質問に答えます。速度はそれほど速くないかもしれませんが(他のいくつかの提案と比較して速度をテストする予定です)、理解しやすいと思います。
#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;
}
このコードは、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;
このコードはあなたにモードを与えるはずです。 2つの異なる数が等しい場合、最初のものが出力されます。
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;
このコードは「マップ」を使用して、指定された配列からモードを見つけます。配列がすでにソートされていることを前提としています。
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;
}