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

JavaScriptで2つの配列の対称差を求める方法

対称差(Symmetric Difference)とは

数学において、2つの集合AとBの対称差は「A △ B」と表記されます。

対称差とは、AまたはBのどちらか一方にのみ属し、両方には属さない要素すべてからなる集合として定義されます。

具体例

例えば、以下のような2つの配列があるとします。

const A = [1, 2, 3, 4, 5, 6, 7, 8];
const B = [1, 3, 5, 6, 7, 8, 9];

この場合、AとBの対称差は次のようになります。

const diff = [2, 4, 9];

2と4は配列Aにのみ存在し、9は配列Bにのみ存在します。両方の配列に共通して含まれる1、3、5、6、7、8は除外されるため、結果は[2, 4, 9]となるわけです。

実装例

それでは、実際にJavaScriptで対称差を求めるコードを見てみましょう。

const A = [1, 2, 3, 4, 5, 6, 7, 8];
const B = [1, 3, 5, 6, 7, 8, 9];

const symmetricDifference = (arr1, arr2) => {
    const res = [];
    // arr1側の処理:arr2に存在しない要素だけを追加
    for(let i = 0; i < arr1.length; i++){
        if(arr2.indexOf(arr1[i]) !== -1){
            continue;
        };
        res.push(arr1[i]);
    }
    // arr2側の処理:arr1に存在しない要素だけを追加
    for(let i = 0; i < arr2.length; i++){
        if(arr1.indexOf(arr2[i]) !== -1){
            continue;
        };
        res.push(arr2[i]);
    };
    return res;
};

console.log(symmetricDifference(A, B));

出力結果

このコードを実行すると、コンソールに以下の出力が表示されます。

[2, 4, 9]

コードの解説

この関数の仕組みは非常にシンプルです。

  • まず、結果を格納するための空の配列resを用意します。
  • 最初のループでは、arr1の各要素をチェックし、arr2内に存在しない要素だけをresに追加します。
  • 次のループでは逆に、arr2の各要素をチェックし、arr1内に存在しない要素だけをresに追加します。

この2段階の処理により、「どちらか一方の配列にのみ含まれる要素」だけが集まり、対称差が求まります。

補足:Setを使ったより効率的な方法

上記の実装ではindexOf()を使用していますが、このメソッドは要素を探すたびに線形探索を行うため、配列が大きくなるとパフォーマンスが低下します。要素数が多い場合は、Setを活用するのがおすすめです。

const symmetricDifference = (arr1, arr2) => {
    const set1 = new Set(arr1);
    const set2 = new Set(arr2);
    return [
        ...arr1.filter(x => !set2.has(x)),
        ...arr2.filter(x => !set1.has(x))
    ];
};

console.log(symmetricDifference(A, B)); // [2, 4, 9]

Setのhas()メソッドはほぼ定数時間で動作するため、大規模なデータセットでも高速に対称差を計算できます。また、filter()とスプレッド構文を使うことで、コードもより簡潔になります。

  1. C++で2つの配列間の互換性の差を求める方法

    問題の概要 2人の友人が、お互いの相性を確かめたいと考えています。そこで、1からnまでの番号が付けられた映画を、それぞれが好みに応じてランク付けします。このとき求めるのが、2人の間の「互換性の差」です。 互換性の差とは、同じ映画に対する2人の相対的な順位付けがどれだけ食い違っているかを表す数値のことです。たとえば、A = [3, 1, 2, 4, 5]、B = [3, 2, 4, 1, 5] という2つの順位リストが与えられた場合、出力は 2 になります。これは、友人Aが映画1を映画2や4よりも上位にランク付けしている一方で、友人Bはそれらより下位にランク付けしているためです。 アルゴリズムの

  2. 2つのNumPy配列の差集合を求める方法【setdiff1d()関数の使い方】

    この記事では、PythonのNumPyライブラリを使って、2つの配列の差集合を求める方法を解説します。差集合とは、「片方の配列には含まれているが、もう片方には含まれていない要素」の集まりのことです。NumPyでは、setdiff1d()関数を使うことで、この差集合を簡単に計算できます。この関数は array1 と array2 の2つの引数を受け取り、array1 に含まれるが array2 には含まれない一意な値を返します。処理の流れ(アルゴリズム)ステップ1:numpy をインポートする。ステップ2:2つのNumPy配列を定義する。ステップ3:setdiff1d() 関数を使って差集合を求