プログラミングの世界では、配列の操作は基本的なスキルです。一般的なプロセスの 1 つとして、配列のシャッフル (要素のランダムな再配置を含む) を行うことができます。この手順は、ランダム化されたゲーム デッキの構築、統計シミュレーションの実行、またはデータをよりランダムに表示する場合などに不可欠です。最初は、配列をシャッフルするために適用できるロジックがたくさんあります。 ArrayList、ハッシュ セット、リンク リストなどのさまざまなタイプのコレクション フレームワークを使用できます。配列のシャッフルは別の方法で実行できます。
配列をシャッフルするアルゴリズム:
以下は配列のシャッフルのアルゴリズムです。
ステップ1: 始める
ステップ2: 配列の最後の要素から開始して、最初の要素に戻ります。
ステップ 3: インデックス i の要素ごとに、j が [0, i] の範囲内になるようにランダムなインデックス j を生成します。
ステップ4: インデックス i と j の要素を交換します。
ステップ5: 最後の要素から最初の要素まで逆方向に、配列内のすべての要素に対して手順 2 と 3 を繰り返します。
ステップ6: 終わり
整数、文字などのさまざまなタイプの要素を含む配列をシャッフルできます。
フィッシャー・イェーツのシャッフル アルゴリズム:
次の Java プログラムは、整数で構成される配列をシャッフルするために使用されます。
ArrayShuffle.java
import java.util.Random; public class ArrayShuffler { public static void main(String[] args) { // Sample array of integers int[] array = {1, 2, 3, 4, 5}; // Shuffle the array shuffleArray(array); // Print the shuffled array for (int num : array) { System.out.print(num + ' '); } } public static void shuffleArray(int[] array) { Random rand = new Random(); for (int i = array.length - 1; i > 0; i--) { // Generate a random index between 0 and i (inclusive) int j = rand.nextInt(i + 1); // Swap the elements at indices i and j int temp = array[i]; array[i] = array[j]; array[j] = temp; } } }
出力:
1 3 2 4 5
要素をランダムに配置し、シャッフルされた配列を出力するため、システムで実行すると出力が異なる場合があります。
複雑さ:
シャッフル アルゴリズムの空間計算量は、配列のサイズに依存する追加のデータ構造を使用しないため、O(1) です。 shuffleArray() メソッドで使用されるフィッシャー・イェーツ シャッフル アルゴリズムの時間計算量は O(n) です。ここで、n は配列内の要素の数です。
Java でリストを使用して配列をシャッフルする:
ShuffleArray.java
import java.util.Arrays; import java.util.Collections; import java.util.List; public class ShuffleArray { public static void main(String[] args) { Integer[] intArray = {1, 2, 3, 4, 5, 6, 7}; List intList = Arrays.asList(intArray); Collections.shuffle(intList); intList.toArray(intArray); // This line will not resize the array System.out.println(Arrays.toString(intArray)); } }
出力:
[4, 1, 7, 3, 6, 5, 2]
要素をランダムに配置し、シャッフルされた配列を出力するため、システムで実行すると出力が異なる場合があります。
複雑さ:
文字列から文字へ
空間複雑度も O(n) です。これは、Collections.shuffle() メソッドが元のリストをその場で変更し、追加のデータ構造を使用しないためです。このコードの時間計算量は O(n) です。ここで、n は配列内の要素の数です。
文字を含む配列をシャッフルします:
ShuffleCharacters.java
import java.util.Arrays; import java.util.Random; public class ShuffleCharacters { public static void main(String[] args) { char[] charArray = {'a', 'b', 'c', 'd', 'e', 'f', 'g'}; shuffleArray(charArray); System.out.println('Shuffled Characters: ' + Arrays.toString(charArray)); } public static void shuffleArray(char[] array) { Random rand = new Random(); for (int i = array.length - 1; i > 0; i--) { int j = rand.nextInt(i + 1); // Swap characters at indices i and j char temp = array[i]; array[i] = array[j]; array[j] = temp; } } }
出力:
Shuffled Characters: [e, f, g, d, a, c, b]
要素をランダムに配置し、シャッフルされた配列を出力するため、システムで実行すると出力が異なる場合があります。
複雑さ:
シャッフル アルゴリズムの空間計算量は、配列のサイズに依存する追加のデータ構造を使用しないため、O(1) です。 shuffleArray() メソッドで使用されるプログラムの時間計算量は O(n) です。ここで、n は配列内の文字数です。
結論:
Java での配列のシャッフルは、開発者がランダムで偏りのないデータの配置を作成できるようにする重要なスキルです。この探索全体を通じて、非プリミティブ配列に対する Collections.shuffle() メソッドの使用とプリミティブ配列に対する Fisher-Yates シャッフル アルゴリズムの実装という 2 つの効果的なアプローチを取り上げてきました。 Collections.shuffle() メソッドは、組み込み機能を利用して、オブジェクトまたは非プリミティブ配列のシャッフル プロセスを簡素化します。一方、Fisher-Yates アルゴリズムは、プリミティブ配列をシャッフルする効率的かつ公平な方法を提供し、順列の均一性を保証します。