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 :

Algorithme de permutation


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 19
    Par défaut Algorithme de permutation
    Bonjour.

    Je suis aussi en train de chercher à énumérer les permutations afin d'executer une fonction sur chaque permutation de [0..n], comme dans la discussion http://www.developpez.net/forums/d50...e-permutation/

    Dans l'idéal, il me faudrait la liste, mais c'est ingérable en mémoire. A la place, ce serait bien d'être capable de générer rapidement la ième permutation si on avait généré la liste, ou encore, à partir de la (i-1)ème de généré la (ième).


    Or ça me parait assez difficile à faire avec vos méthode récursives avec des "prints" quelqu'un aurait une idée, je ne trouve rien ?
    Ou alors, à la limite, dans un langage fonctionnel je peux ajouter aux générateur des permutations le fait qu'il doit prendre une fonction qui prend la permutation en argument, mais comme mon code est actuellement en C++, je suis peu chaud pour tout réécrire.

    Citation Envoyé par acx01b Voir le message
    une permutation d'un ensemble E:
    c'est un n-upplet qui commence par x1 suivi d'une permutation de E privé de x1
    ou un n-upplet qui commence par x2 suivi d'une permutation de E privé de x2
    ou un n-upplet qui commence par x3 suivi d'une permutation de E privé de x3
    ...
    ou un n-upplet qui commence par xn suivi d'une permutation de E privé de xn

    où x1, x2, x3 .... xn sont les éléments de E
    Si on veut travailler comme ça, il y a moyen d'être plus efficace.
    Je donne le code en oCaml, car c'est plus naturel en fonctionnel.

    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
    16
    17
    18
    19
    20
    21
     
    let rec fold_left f accu l =
      match l with
        [] -> accu
      | a::l -> fold_left f (f accu a l) l
     
    let permut l f acc=
      let rec aux l1 l2 acc tmp=
        match (l1,l2) with
          |    [],[]->f tmp acc
          | _,_->  let (acc,_)=
          fold_left (fun (acc, l2) elt l1 ->(aux l1 l2 acc (elt::tmp), elt::l2 ))
            (acc, l2) l1 
        in let (acc,_)=
          fold_left (fun (acc, l1) elt l2 ->(aux l2 l1 acc (elt::tmp), elt::l1 ))
            (acc, l1) l2 
        in acc
      in aux [] l [] []
     
    let list_permut l=
      permut l (fun a b-> a::b) []
    On doit redéfinir fold_left car la fonction a aussi besoin de connaitre la queue de la liste.

    On choisit un élément qu'on met en fin de liste, puis on itére sur la liste sans cet élément. La grosse différence c'est que comme on le retire effectivement de la liste, il ne sera pas reparcouru, contrairement à ce qui se fait avec un tableau.
    On est forcé deux passer recursivement deux listes, car sans ça il faudrait faire un "append" entre les deux listes à passer en argument, ce qui est couteux.

    Dans les deux cas on est clairement en O(n^n), et je n'arrive pas à savoir si on gagne asymptotiquement. Ce qui est sur c'est qu'on passe d'un temps en
    O(n+n^2+n^3+...+n^n)=O(n(1+n(1+n(...(1+n)...)))) n fois à quelque chose en O(n+n(n-1)+n(n-1)(n-2)+...+n!)=O(n*(1+(n-1)*(1+(n-2)*(....(1+1)...)))), ce qui semble à priori être un gain.


    Si vous avez des remarques à faire, je serai ravi, pour le moment, je rame.

  2. #2
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par Arthur Rainbow Voir le message
    ou encore, à partir de la (i-1)ème de générer la (ième).
    Pour cela, il y a l'algorithme de permutation de Kenneth Rosen (livre : Discrete Mathematics and Its Applications).
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 19
    Par défaut
    Je ne connaissais pas, merci beaucoup, ça semble être exactement ce que je veux!

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/01/2016, 14h24
  2. Algorithme de permutation aléatoire
    Par cjacquel dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 12/01/2015, 12h40
  3. Algorithme de permutation
    Par sloshy dans le forum Mathématiques
    Réponses: 4
    Dernier message: 02/07/2012, 16h39
  4. Algorithme de permutation
    Par tagsOf dans le forum Algorithmes et structures de données
    Réponses: 21
    Dernier message: 09/03/2008, 22h23
  5. Algorithme de randomisation ... ( Hasard ...? )
    Par Anonymous dans le forum Assembleur
    Réponses: 8
    Dernier message: 06/09/2002, 14h25

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