ホームページ >ウェブフロントエンド >jsチュートリアル >JavaScript で配列のすべての順列を生成するにはどうすればよいですか?

JavaScript で配列のすべての順列を生成するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-22 05:14:18343ブラウズ

How to Generate All Permutations of an Array in JavaScript?

JavaScript で順列を計算する方法

順列とは、配列から可能なすべてのシーケンスを生成することを指します。 JavaScript では、いくつかの異なるアプローチを使用して整数の配列を並べ替えることができます。

メモ化によるアプローチ

1 つのアプローチには、再帰とメモ化を使用して、以前に計算された並べ替えを追跡することが含まれます。実装例は次のとおりです。

let permArr = [];
let usedChars = [];

function permute(input) {
  const chars = input.sort();  // Prevent duplicate permutations with identical values

  for (let i = 0; i < chars.length; i++) {
    const ch = chars.splice(i, 1);
    usedChars.push(ch);
    if (chars.length === 0) {
      permArr[permArr.length] = usedChars.join("");
    }
    permute(chars.join(""));
    chars.splice(i, 0, ch);
    usedChars.pop();
  }

  return permArr;
}

非変異配列を使用したアプローチ

別のアプローチでは、非変異スライス手法を使用して、元の配列の変更を回避します。

function permutator(inputArr) {
  let result = [];

  function permute(arr, memo = []) {
    if (arr.length === 0) {
      result.push(memo);
    } else {
      for (let i = 0; i < arr.length; i++) {
        permute(arr.slice(0, i).concat(arr.slice(i + 1)), memo.concat(arr[i]));
      }
    }
  }

  permute(inputArr);

  return result;
}

ES6 バージョン

非変異の ES6 実装アプローチ:

const permutator = (inputArr) => {
  let result = [];

  const permute = (arr, m = []) => {
    if (arr.length === 0) {
      result.push(m);
    } else {
      for (let i = 0; i < arr.length; i++) {
        let curr = arr.slice();
        let next = curr.splice(i, 1);
        permute(curr.slice(), m.concat(next));
      }
    }
  };

  permute(inputArr);

  return result;
};

サンプルの入力と出力

たとえば、次の入力配列の場合:

[1, 2, 3]

置換関数は次の出力を行います:

[
  [ 1, 2, 3 ],
  [ 1, 3, 2 ],
  [ 2, 1, 3 ],
  [ 2, 3, 1 ],
  [ 3, 1, 2 ],
  [ 3, 2, 1 ]
]

これらの順列は、入力配列要素の考えられるすべての組み合わせを調査することによって生成され、各要素が 1 回で 1 回だけ使用されるようになります。それぞれの順列

以上がJavaScript で配列のすべての順列を生成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。