Maison > développement back-end > C++ > Comment l'algorithme de Knuth peut-il générer des permutations efficacement ?

Comment l'algorithme de Knuth peut-il générer des permutations efficacement ?

Barbara Streisand
Libérer: 2025-01-04 06:15:38
original
565 Les gens l'ont consulté

How Can Knuth's Algorithm Generate Permutations Efficiently?

Génération rapide de permutations à l'aide de l'algorithme de Knuth

L'optimisation de la génération de permutations est un problème fondamental en informatique. Ceci est particulièrement crucial lorsqu’il s’agit de grands ensembles de données, où le temps requis pour énumérer toutes les permutations peut devenir important. L'extrait de code suivant présente un algorithme efficace pour générer des permutations, connu sous le nom d'algorithme de Knuth :

private static bool NextPermutation(int[] numList)
{
    // Find the largest index j such that a[j] < a[j + 1].
    int largestIndex = -1;
    for (int i = numList.Length - 2; i >= 0; i--)
    {
        if (numList[i] < numList[i + 1]) {
            largestIndex = i;
            break;
        }
    }

    // If no such index exists, the permutation is the last permutation.
    if (largestIndex < 0) return false;

    // Find the largest index l such that a[j] < a[l].
    int largestIndex2 = -1;
    for (int i = numList.Length - 1 ; i >= 0; i--) {
        if (numList[largestIndex] < numList[i]) {
            largestIndex2 = i;
            break;
        }
    }

    // Swap a[j] with a[l].
    int tmp = numList[largestIndex];
    numList[largestIndex] = numList[largestIndex2];
    numList[largestIndex2] = tmp;

    // Reverse the sequence from a[j + 1] up to and including the final element a[n].
    for (int i = largestIndex + 1, j = numList.Length - 1; i < j; i++, j--) {
        tmp = numList[i];
        numList[i] = numList[j];
        numList[j] = tmp;
    }

    return true;
}
Copier après la connexion

Cet algorithme fonctionne en temps O(n^2), où n représente le nombre d'éléments dans la liste d'entrée. Il utilise plusieurs optimisations pour minimiser les calculs, notamment :

  • Identification itérative du plus grand index j où a[j] < a[j 1].
  • Identification itérative du plus grand indice l où a[j] < a[l].
  • Échange efficace d'éléments à l'aide d'une variable temporaire.
  • Inversion efficace de la séquence de a[j 1] à la fin à l'aide d'un échange en miroir.

Ces optimisations garantissent une génération efficace de la permutation suivante dans un ensemble, ce qui rend cet algorithme parfaitement adapté aux applications nécessitant une génération de permutation rapide.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal