Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語で配列内に複数回出現する重複要素を検出する方法

はじめに:配列とは

配列(Array)とは、同じデータ型の要素を格納するコンテナであり、使用する前にその長さ(サイズ)を定義しておく必要があります。また、同じ値は配列内のどの位置にでも、何度でも出現できます。この記事では、その性質を利用したプログラムとして、「配列の中で 2 回以上出現する要素を見つけ出して表示する」方法を解説します。

問題の定義

ある配列 arr[] が与えられたとき、その中で繰り返し出現している要素をすべて見つけ出し、画面に出力するプログラムを作成します。
まず、具体例でイメージをつかみましょう。

実行例

入力: arr[] = {5, 11, 11, 2, 1, 4, 2}
出力: 11 2

考え方と処理の流れ

重複要素の検出は、おおむね次のような手順で行います。

  1. 配列 arr の各要素に対して、それ以降の要素と順番に比較を行います。
  2. ループ処理で配列全体を走査しながら、if 文による条件分岐で各要素の出現回数をチェックします。
  3. ある要素が 1 回しか出現していなければカウントは 1 のまま、2 回以上出現していればカウントが増加します。
  4. 最終的にカウントが 2 以上になっている要素だけを画面に出力します。

アルゴリズム(単純比較法)

入力 : arr[](配列)、n(配列の長さ)
Step 1 : i を 0 ~ n-1 まで繰り返す
Step 2 : 各要素について次の処理を行う
   Step 2.1 : j を i+1 ~ n-1 まで繰り返す
   Step 2.2 : if (arr[i] == arr[j]) → arr[i] を出力
   Step 2.3 : else { // 何もしない }

この方法は実装がシンプルですが、二重ループを使用するため計算量は O(n²) となります。

C言語での実装例

次のサンプルコードでは、calloc() で確保したカウント用配列を使い、各値の出現回数を記録しています。すでに 1 回出現した値が再び現れたタイミングで、その要素を重複として出力します。

#include <stdio.h>
#include <stdlib.h>

int main() {
    int arr[] = {21, 87, 212, 109, 41, 21};
    int n = sizeof(arr) / sizeof(arr[0]);
    int maxVal = 256; /* 要素の最大値より大きなサイズを確保 */
    int *count = (int *)calloc(maxVal, sizeof(int));
    int i;

    printf("配列の重複要素 :");

    for (i = 0; i < n; i++) {
        if (count[arr[i]] == 1)
            printf(" %d ", arr[i]);
        else
            count[arr[i]]++;
    }

    free(count);
    return 0;
}

出力結果

配列の重複要素 : 21

この例では、配列 {21, 87, 212, 109, 41, 21} の中で 21 だけが 2 回出現しているため、それが出力されます。なお、カウント配列方式では要素の値が配列のインデックスとして使われるため、扱う数値の範囲に応じて十分なメモリを確保する必要がある点に注意してください。

まとめ

配列内の重複要素を検出するには、全要素同士を比較する単純な方法(O(n²))と、カウント配列で出現回数を管理する効率的な方法があります。後者は平均的に O(n) で高速に処理できる反面、値の範囲に応じたメモリ消費というトレードオフがあります。データの特性に合わせて適切な手法を選ぶことが重要です。

  1. Pythonで配列内の複数の数値の最大公約数(GCD)を求める方法

    はじめに本記事では、Pythonを使って配列(リスト)内の2つ以上の数値から最大公約数(GCD:Greatest Common Divisor)を求める方法を解説します。問題の概要数値の配列が与えられ、そのすべての要素に共通する最大公約数を求めることが目的です。3つ以上の数値のGCDは、「引数として渡されたすべての数値に共通する素因数の積」として定義できます。また、隣り合う2つの数値のGCDを繰り返し計算していくことでも求められます。ここでは、後者のアプローチである「ペアごとのGCDを順番に計算する」方法を実装します。アルゴリズムの流れまず、リストの最初の2つの要素のGCDを計算します。次に、

  2. Pythonで複数の数値や配列の最大公約数(GCD)を求める方法

    本記事では、以下の問題に対する解決策について詳しく解説します。問題の概要与えられた数値の配列から、それらすべての最大公約数(GCD)を求める必要があります。アプローチ2つより多い数値の最大公約数を求める場合、GCDは引数として渡されたすべての数値に共通する素因数の積と等しくなります。これは数学的な定義に基づく方法ですが、実装がやや複雑になります。もう一つの方法として、2つの数値ずつペアでGCDを繰り返し計算するという手法があります。具体的には、最初の2つの数値のGCDを求め、その結果と次の数値のGCDを計算し、これを配列の最後まで繰り返します。本記事では、後者のアプローチを実装していきます。実