Maison >Java >javaDidacticiel >Comment générer toutes les permutations d'un tableau, y compris les cas avec des valeurs répétées ?

Comment générer toutes les permutations d'un tableau, y compris les cas avec des valeurs répétées ?

DDD
DDDoriginal
2024-12-29 00:47:10986parcourir

How to Generate All Permutations of an Array, Including Cases with Repeated Values?

Permutation du tableau

Étant donné un tableau d'entiers distincts, trouvez le nombre total et répertoriez toutes les permutations possibles du tableau.

Code

Le code suivant fournit un algorithme récursif pour trouver les permutations d'un tableau :

import java.util.*;

public class Permute {

    public static void main(String[] args) {
        int[] a = new int[]{3, 4, 6, 2, 1};
        permute(a, 0);
    }

    private static void permute(int[] a, int k) {
        if (k == a.length - 1) {
            System.out.println(Arrays.toString(a));
        } else {
            for (int i = k; i < a.length; i++) {
                swap(a, i, k);
                permute(a, k + 1);
                swap(a, i, k);
            }
        }
    }

    private static void swap(int[] a, int x, int y) {
        int temp = a[x];
        a[x] = a[y];
        a[y] = temp;
    }
}

Cet algorithme génère toutes les permutations du tableau en échangeant le premier élément avec chacun des autres éléments du tableau, puis en appelant récursivement l'algorithme sur le tableau restant .

Itérateurs et Extension au cas de valeurs répétées

L'inconvénient de cet algorithme est qu'il ne gère pas le cas de valeurs répétées dans le tableau. Pour gérer ce cas, nous pouvons modifier l'algorithme pour utiliser une pile au lieu de la récursivité. Le code suivant fournit un algorithme itératif pour trouver les permutations d'un tableau :

import java.util.*;

public class Permute {

    public static void main(String[] args) {
        int[] a = new int[]{3, 3, 4, 4, 6, 2, 1};
        permuteIterative(a);
    }

    private static void permuteIterative(int[] a) {
        Stack<Integer> stack = new Stack<>();
        Set<Integer> visited = new HashSet<>();
        stack.push(0);
        visited.add(0);

        while (!stack.isEmpty()) {
            int k = stack.peek();
            if (k == a.length - 1) {
                System.out.println(Arrays.toString(a));
                stack.pop();
            } else {
                for (int i = k + 1; i < a.length; i++) {
                    if (!visited.contains(i)) {
                        swap(a, i, k);
                        stack.push(i);
                        visited.add(i);
                        break;
                    }
                }
                if (stack.peek() == k) {
                    stack.pop();
                    visited.remove(k);
                }
            }
        }
    }

    private static void swap(int[] a, int x, int y) {
        int temp = a[x];
        a[x] = a[y];
        a[y] = temp;
    }
}

Cet algorithme utilise une pile pour garder une trace de la permutation actuelle. L'algorithme commence par placer le premier élément du tableau sur la pile. Ensuite, l'algorithme extrait à plusieurs reprises les éléments de la pile et les échange avec l'élément non visité suivant du tableau. S'il n'y a plus d'éléments non visités dans le tableau, l'algorithme supprime l'élément de la pile et continue avec l'élément suivant dans la pile.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn