0

2つの異なる配列から数値を取得するときに、重複する数値が新しい配列に格納されないようにする方法を知る必要があります。この関数は、各「一意の」値を1回保存し、重複する値を再度保存しないようになっています。

これまでの私の関数コードは次のとおりです。

int * arrayIntersect(int *sizeOfResult, const int *a, const int *b, int sizeOfA, int sizeOfB){
int i;
int j;
int k = 0;
int c[(sizeOfA + sizeOfB)];

    for(j = 0; j < sizeOfB; j++){
        for(i = 0; i < sizeOfA; i++){
            if(a[i] == b[j]){
                c[k] = a[i];
                (*sizeOfResult)++;
                k++;
            }   
        }
    }
int *d = (int *)malloc(sizeof(int) * *sizeOfResult);
    for(i = 0; i < *sizeOfResult; i++){
        d[i] = c[i];
    }
return d;

}

必要な値が出力されますが、新しい動的配列の内容を出力するときに同じ番号が複数回表示されないようにしたいと思います。

重複を防ぐためにコードを改善する方法について何かアイデアはありますか?

4

2 に答える 2

0

それを行う適切な方法は、配列を順序付けてから、@ Murilo Vasoncelosが指摘したように、挿入ごとにバイナリ検索を実行することです。

以下は、aとbをループし、反復ごとに番号が以前に挿入されているかどうかを確認する、迅速で汚いソリューションです。そうでない場合は、挿入します。

int duplicate = 0;
*sizeOfResult = 0;
for(j = 0; j < sizeOfA; j++){
    for(i = 0; i < (*sizeOfResult); i++){
        if(c[i] == a[j]){
            duplicate = 1;
            break;
        }   
    }
    if (!duplicate)
    {
        c[(*sizeOfResult)] = a[i];
        (*sizeOfResult)++;
    }
    duplicate = 0;
}
for(j = 0; j < sizeOfB; j++){
    for(i = 0; i < (*sizeOfResult); i++){
        if(c[i] == b[j]){
            duplicate = 1;
            break;
        }   
    }
    if (!duplicate)
    {
        c[(*sizeOfResult)] = b[i];
        (*sizeOfResult)++;
    }
    duplicate = 0;
}
于 2012-10-26T01:26:15.790 に答える
0

配列abが順序付けられている場合は、配列の共通部分に次の線形アルゴリズムを使用できます。

int* inter(int* szr, int* a, int* b, int sza, int szb)
{
    int c[MAX(sza, szb)];
    int i, j, k = 0;

    for (i = 0, j = 0; i < sza && j < szb;) {
        if (a[i] == b[j]) {
            if (k == 0 || c[k - 1] < a[i]) {
                c[k++] = a[i];
            }

            i++;
            j++;
        }
        else if (a[i] < b[j]) {
            i++;
        }
        else {
            j++;
        }
    }

    *szr = k;

    int* ans = (int*)malloc(sizeof(int) * k);
    for (i = 0; i < k; ++i) {
        ans[i] = c[i];
    }

    return ans;
}
于 2012-10-26T01:30:44.030 に答える