IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

Permutation - Afficher toutes les possibilitées


Sujet :

Algorithmes et structures de données

  1. #1
    Membre régulier
    Inscrit en
    Mars 2002
    Messages
    118
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 118
    Points : 70
    Points
    70
    Par défaut Permutation - Afficher toutes les possibilitées
    Bonjour à tous,

    Je sais que plusieurs d'entre-vous avez déjà parlé de ce sujet sur ce forum, mais je n'ai pas trouvé une réponse qui me convient. J'ai un tableau et j'aimerais afficher les n! permutations possible de ce même tableau. J'ai besoin d'un algorithme itératif et j'ai trouvé le suivant sur Wikipedia sous la rubrique Permutation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function permutation(k, s) {
      var int factorial:= 1;
      for j = 2 to length(s) {
        factorial := factorial* (j-1);
        swap s[j - ((k / factorial) mod j)] with s[j];
      }
      return s;
    }
    L'algorithme est simple et pas très diffcile à comprendre et c'est essentiellement ce que je chercher. Je n'ai qu'a passer le numéro de permutation (<n!) la chaine et le tour est joué. Cependant, il y a un bogue dans cette algo et je n'arrive pas a trouver. Voici ma conversion de cette algo en C# 2.0 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public static T[] Permutation<T>(int k, T[] array)
    {
        int factorial = 1;
        for (int j = 2; j < array.Length; j++)
        {
            factorial *= (j - 1);
            int pos = j - ((k / factorial) % j) - 1;
     
            T temp = array[pos];
            array[pos] = array[j];
            array[j] = temp;
        }
     
        return array;
    }
    S'il vous plait, aidez-moi à trouver une correction à cette algo. Une correction qui va me donner une fonction simple (qui tiens en quelques lignes). Merci beaucoup de votre aide!

    Martin

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 114
    Points : 128
    Points
    128
    Par défaut Euh ...
    Je vois qu'une erreur de parenthèse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public static T[] Permutation<T>(int k, T[] array)
    {
        int factorial = 1;
        for (int j = 2; j < array.Length; j++)
        {
            factorial *= (j - 1);
            int pos = j - ((k / factorial) % j)) - 1;
    
            T temp = array[pos];
            array[pos] = array[j];
            array[j] = temp;
        }
    
        return array;
    }

  3. #3
    Membre régulier
    Inscrit en
    Mars 2002
    Messages
    118
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 118
    Points : 70
    Points
    70
    Par défaut
    Mon code compile très bien. Il n'y a donc pas de problème de parenthèse. C'est un erreur dans mon algo que je ne trouve pas. Voici le résultat que j'obtiens

    ABC(00000) = ACB
    ABC(00001) = CBA
    ABC(00002) = ACB
    ABC(00003) = CBA
    ABC(00004) = ACB
    ABC(00005) = CBA

    Voici les résultats que je devrais obtenir

    ABC(00000) = ABC
    ABC(00001) = ACB
    ABC(00002) = BAC
    ABC(00003) = BCA
    ABC(00004) = CAB
    ABC(00005) = CBA

    Merci !

  4. #4
    Membre confirmé
    Profil pro
    Directeur Scientifique
    Inscrit en
    Avril 2005
    Messages
    419
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur Scientifique

    Informations forums :
    Inscription : Avril 2005
    Messages : 419
    Points : 554
    Points
    554
    Par défaut
    Je pense qu'il y a un problème dans les indices du tableau qui vont de 1 à s dans l'algo mais de 0 à s-1 dans ton code. Tu devrais utiliser array[j-1] dans ton code et la boucle doit avoir pour condition de fin j <= array.Length

  5. #5
    Membre régulier
    Inscrit en
    Mars 2002
    Messages
    118
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 118
    Points : 70
    Points
    70
    Par défaut
    Merci Francis !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 01/08/2006, 18h12
  2. Réponses: 4
    Dernier message: 07/07/2006, 12h41
  3. afficher toutes les images en meme temps
    Par dietrich dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 04/04/2006, 12h18
  4. Réponses: 1
    Dernier message: 29/11/2005, 00h37
  5. [VB] Calcul de toute les possibilité
    Par Stan Trinity dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 23/11/2005, 15h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo