web-dev-qa-db-ja.com

C ++ソートされた配列のモードの計算

配列の中央値とモードを検出する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; 
7
John

配列がすでに並べ替えられている場合は、数値の出現を一度に数えることができます。次に、発生回数が最も多い数を保存します。また、モードは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;
7
Deidrei

1つの方法は、ランレングスエンコーディングを使用できることです。ランレングスエンコーディングでは、表現は次のようになります。 (アイテム、その頻度)。

その間、最大頻度とアイテムを追跡します。ランレングスを完了すると、このモードになります。

例えば:

 1 1  2 2 2 3 3 4 5

ランレングスエンコーディングは

 {1, 2}, {2, 3}, {3, 2}, {4, 1}, {5, 1}

O(n)スペースが必要です。

2
doptimusprime

これがコードスニペットです。

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

これは私がそれをした方法です、私の解決策は入力としてソートされたベクトルを取ります。これは、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;

}

1
Anh Nguyen

Diedreiの答えは近いですが、ソートされた配列の最後の数によってモードが定義されている場合(1,2,3,3,4,4,4はモードとして3を返す)など、いくつかの欠点を指摘する人がいます。また、複数のモードを処理する方法の要件に応じて、異なるソリューションがあります。

このソリューションはいくつかのことを行います:

  1. 配列の最後にあるモードの問題を解決します
  2. 複数のモードがある場合(2つ以上の数が1より大きいカウントで同じ発生数を持つ)、モードとして最小の数を返します
  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;
0
STLxZEROx

「モード」は、最も頻繁に発生する値です。番号が繰り返されない場合、リストのモードはありません。したがって、「モード」を知る必要がある場合は、ソートしてもメリットはありません。

中央値について言及していませんか?中央値は、セットの真ん中の数です。 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スロットです、数値の偶数配列の場合。

http://www.purplemath.com/modules/meanmode.htm

0
Harlow44

これはうまくいきました。

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つの数値が同じオカレンスを持つ場合に何が起こるかを確認できます!お役に立てば幸いです。

0
M-J

「部屋に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;
}
0
Scott A

このコードは、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;
}
0
ali
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;
0
Parmar Kamlesh

このコードはあなたにモードを与えるはずです。 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;
0
Mars

このコードは「マップ」を使用して、指定された配列からモードを見つけます。配列がすでにソートされていることを前提としています。

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