-2

理論的には配列からすべての重複値を削除する必要がある関数が機能しないという問題があります。仕組みは次のとおりです。

  1. 2 つの配列があり、それらに 0 から 50 までの乱数を入力します。
  2. 並べ替え関数を使用して配列値を順番に並べ替えます
  3. 次に、重複除外機能を実行します
  4. 配列の値を順番に並べ替えます
  5. 次に、両方の配列の値を出力します

問題は、dedupe 関数のループが、検出された重複エントリの数に関係なく 19 回実行されることです。これは非常に奇妙です。また、それでも重複が発生します。

何か案は?ありがとう!

int* dedupe(int array[ARRAY_SIZE])      //remove duplicate array values and replace with new values.
{   bool dupe = false;
    while(dupe!=true)
    {   
        for(int j=0; j<ARRAY_SIZE; j++)
        {   if(array[j] == array[j+1])
            {   array[j] = rand(); 
                array[j] = array[j] % 51;
                dupe = false;
            }
            else { dupe = true; // the cout part is for debugging
                    cout << dupe << endl; }
        }
    } return array;
}
int main()
{
    int a[9], b[9];
    srand(time(0));
    populate(b);
    populate(a);
    sort(a,ARRAY_SIZE);
    sort(b,ARRAY_SIZE);
    dedupe(a);
    dedupe(b);
    sort(a,ARRAY_SIZE);
    sort(b,ARRAY_SIZE);
    for(int i=0; i<10; i++)
    {   cout << "a[" << i << "] = " << a[i] << "\t\t" << "b[" << i << "] = " << b[i] << endl; }
    return 0;
}

これまでに提案されたものは何も問題を解決していません。誰かが解決策を知っていますか?

4

3 に答える 3

0

forループの内側から戻っていないので、毎回正確にARRAY_SIZE回実行する必要があります。

于 2012-04-20T22:45:30.933 に答える
0

解決したい問題と提供されたアルゴリズムが実際には一致しません。重複を本当に削除したいのではなく、配列内のすべての要素が異なることを保証します。違いは、重複を削除することにより、配列内の要素の数が配列のサイズよりも少なくなるということですが、完全な配列。

(アルゴリズム的に)完璧な解決策が何であるかはわかりませんが、1つの簡単な答えは、有効な範囲内のすべての値の配列を作成し(範囲が小さいため)、それをシャッフルしてから最初のN個の要素を取得することです. これは、カードを使用して値を選択するものと考えてください。

 const int array_size = 9;
 void create_array( int (&array)[array_size] ) {
    const int max_value = 51;
    int range[max_value];
    for ( int i = 0; i < max_value; ++i ) {
       range[i] = i;
    }
    std::random_shuffle( range, range+max_value );
    std::copy_n( range, array_size, array );
 }

これは最も効率的な方法ではありませんが、単純であり、要素の数が少ない場合、パフォーマンスの問題は発生しません。より複雑なアプローチは、範囲内のランダムな要素で配列を初期化し、重複を並べ替えて削除し (実際には削除します。これは、配列が最後にいっぱいにならないことを意味します)、数値の生成とそれらが新しいかどうかのチェックを続行することです。以前に生成された数値に対して。

最も単純なアプローチは、線形時間である他のすべての値と比較するだけですが、9要素の配列では線形時間は問題にならないほど小さいです。

于 2012-04-21T00:54:58.447 に答える
-1

array[j] = rand(); で間違っています。配列[j] = 配列[j] % 51

常に 1 から ARRAY SIZE になります!!

于 2012-04-20T22:51:59.390 に答える