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

Langage PHP Discussion :

[Tableaux] Algorithme pour les combinaisons [Sources]


Sujet :

Langage PHP

  1. #21
    Expert éminent
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Points : 7 285
    Points
    7 285
    Par défaut
    allez la version de la mort qui tue

    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
    <?php
    	error_reporting(E_ALL | E_STRICT);
     
    	$long_tabl = 4;
    	$nbre_combin = pow($long_tabl, $long_tabl);
     
    	$cpt = 0;
     
    	for($i=0; $i<$nbre_combin; $i++) {
    		$chaine_convertie = base_convert($i, 10, $long_tabl);
    		while (strlen($chaine_convertie) < $long_tabl) {
    			$chaine_convertie = '0'.$chaine_convertie;
    		}
    		$tableau_index_possibles[] = str_split($chaine_convertie);
    	}
    	print_r($tableau_index_possibles);
     
    ?>
    et donc, comme j'utilise base_convert, la longueur max du tableau peut être de 36
    Globalement inoffensif
    Merci de respecter les règles du forum.
    Aucune question technique par MP !
    _______________________________________________________________________
    Cours Ruby et Ruby on Rails (RoR) - Cours PHP - FAQ Ruby / Rails - Livres Ruby / Rails
    Ajax facile avec Ruby on Rails, Prototype, script.aculo.us et les RJS
    Tutoriaux HTML/CSS et PHP

  2. #22
    Expert éminent
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Points : 7 285
    Points
    7 285
    Par défaut
    et voi la version dédoublonée :

    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
    <?php
    	error_reporting(E_ALL | E_STRICT);
     
    	$long_tabl = 3;
    	$nbre_combin = pow($long_tabl, $long_tabl);
     
    	$cpt = 0;
     
    	for($i=0; $i<$nbre_combin; $i++) {
    		$chaine_convertie = base_convert($i, 10, $long_tabl);
    		while (strlen($chaine_convertie) < $long_tabl) {
    			$chaine_convertie = '0'.$chaine_convertie;
    		}
    		$tabl_indice_encours = str_split($chaine_convertie);
     
    		if ($tabl_indice_encours == array_unique($tabl_indice_encours)) {
    			$tableau_index_possibles[] = $tabl_indice_encours;
    		}
    	}
    	print_r($tableau_index_possibles);
    ?>
    Attention tout de même : il y aura (longueur_tableau ^ longueur_tableau) itérations. 32^32, ça commence à faire beaucoup (à la louche 1.5 .10^48)...
    Globalement inoffensif
    Merci de respecter les règles du forum.
    Aucune question technique par MP !
    _______________________________________________________________________
    Cours Ruby et Ruby on Rails (RoR) - Cours PHP - FAQ Ruby / Rails - Livres Ruby / Rails
    Ajax facile avec Ruby on Rails, Prototype, script.aculo.us et les RJS
    Tutoriaux HTML/CSS et PHP

  3. #23
    Membre éprouvé Avatar de FCYPBA
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 745
    Points : 952
    Points
    952
    Par défaut
    Comme quoi on pouvait s'en sortir sans recursivité.

    Par contre, ta solution ne répond pas au problème qui était les combinaisons de lettres possibles (si 'a' présent une fois alors une seule fois présent dans la solution), mais je pense que ta solution est plus propre que la mienne.

    Il reste juste à afficher les résutats
    Pierre
    1. Dans le manuel ( PHP, MySQL,..., rayez la mention inutile), tu te plongeras à deux fois plutôt qu'aucune.
    2. Dans la doc php, tu liras attentivement les sections Chaines de caractères, Tableaux et Système de fichiers
    3. Un code rapide c'est bien, un code maintenable c'est mieux
    ...

    Why was the font tag an orphan ? Because it didn't have a font-family.

  4. #24
    Expert éminent
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Points : 7 285
    Points
    7 285
    Par défaut
    exactement, ma solution donne les index du tableau initial à afficher pour avoir le résultat

    m'enfin, je ne pense pas que l'affichage pose de soucis à quelqu'un, laissons donc dans l'état
    Globalement inoffensif
    Merci de respecter les règles du forum.
    Aucune question technique par MP !
    _______________________________________________________________________
    Cours Ruby et Ruby on Rails (RoR) - Cours PHP - FAQ Ruby / Rails - Livres Ruby / Rails
    Ajax facile avec Ruby on Rails, Prototype, script.aculo.us et les RJS
    Tutoriaux HTML/CSS et PHP

  5. #25
    Expert éminent
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Points : 7 285
    Points
    7 285
    Par défaut
    bon, finalement, dans un élan de gentillesse hors du commun, voici le script qui réponds exactement à la question de départ :

    Version avec doublons :
    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
    22
    23
    <?php
    	error_reporting(E_ALL | E_STRICT);
    	$mon_tableau = array('a', 'b', 'c');
    	$long_tabl = count($mon_tableau);
    	$nbre_combin = pow($long_tabl, $long_tabl);
     
    	$cpt = 0;
     
    	for($i=0; $i<$nbre_combin; $i++) {
    		$chaine_convertie = base_convert($i, 10, $long_tabl);
    		while (strlen($chaine_convertie) < $long_tabl) {
    			$chaine_convertie = '0'.$chaine_convertie;
    		}
    		$tabl_indice_encours = str_split($chaine_convertie);
     
    		$chaine_finale = '';
    		foreach ($tabl_indice_encours as $element) {
    			$chaine_finale .= $mon_tableau[$element];
    		}
    		$tableau_index_possibles[] = $chaine_finale;
    	}
    	print_r($tableau_index_possibles);
    ?>
    Version sans doublons :
    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
    22
    23
    24
    25
    <?php
    	error_reporting(E_ALL | E_STRICT);
    	$mon_tableau = array('a', 'b', 'c');
    	$long_tabl = count($mon_tableau);
    	$nbre_combin = pow($long_tabl, $long_tabl);
     
    	$cpt = 0;
     
    	for($i=0; $i<$nbre_combin; $i++) {
    		$chaine_convertie = base_convert($i, 10, $long_tabl);
    		while (strlen($chaine_convertie) < $long_tabl) {
    			$chaine_convertie = '0'.$chaine_convertie;
    		}
    		$tabl_indice_encours = str_split($chaine_convertie);
     
    		if ($tabl_indice_encours == array_unique($tabl_indice_encours)) {
    			$chaine_finale = '';
    			foreach ($tabl_indice_encours as $element) {
    				$chaine_finale .= $mon_tableau[$element];
    			}
    			$tableau_index_possibles[] = $chaine_finale;
    		}
    	}
    	print_r($tableau_index_possibles);
    ?>
    Globalement inoffensif
    Merci de respecter les règles du forum.
    Aucune question technique par MP !
    _______________________________________________________________________
    Cours Ruby et Ruby on Rails (RoR) - Cours PHP - FAQ Ruby / Rails - Livres Ruby / Rails
    Ajax facile avec Ruby on Rails, Prototype, script.aculo.us et les RJS
    Tutoriaux HTML/CSS et PHP

  6. #26
    Membre éclairé Avatar de Death83
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 667
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 667
    Points : 878
    Points
    878
    Par défaut
    Waou bas dis donc il y'en a qui se sont creusé se matin lol.

    Merci beaucoup je vais tester cette dernière version .

    Juste ca sert à quoi ca:
    error_reporting(E_ALL | E_STRICT);
    manganimes (en construction) -
    zemanga

  7. #27
    Expert éminent
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Points : 7 285
    Points
    7 285
    Par défaut
    ça sert juste à afficher tout les warnings et autres erreurs. utille en phase de dev seulement, faut le passer à 0 en prod
    Globalement inoffensif
    Merci de respecter les règles du forum.
    Aucune question technique par MP !
    _______________________________________________________________________
    Cours Ruby et Ruby on Rails (RoR) - Cours PHP - FAQ Ruby / Rails - Livres Ruby / Rails
    Ajax facile avec Ruby on Rails, Prototype, script.aculo.us et les RJS
    Tutoriaux HTML/CSS et PHP

  8. #28
    Expert éminent
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Points : 7 285
    Points
    7 285
    Par défaut
    Solution complémentaire sans le dégagement de doublons):

    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
    $tabl = array('a', 'b', 'c');
     
    	$long_tabl = count($tabl);
     
    	$tabl_result = $tabl;
     
    	for($i=1; $i<$long_tabl; $i++) {
    		foreach($tabl as $element1) {
    			foreach($tabl_result as $element2) {
    				$tabl_temp[] = $element1.$element2;
    			}
    		}
     
    		$tabl_result = $tabl_temp;
    		unset($tabl_temp);
    	}
     
    	print_r($tabl_result);
    Mais comme dans le code précédent, dès qu'on passe à 8 éléments, PHP craque... L'avantage, c'est qu'on ne joue plus avec les index.

    il faudrait peut-être l'optimiser en décomposant la longueur du tableau en sommes de petits chiffres, comme ça au lieu de 'multiplier' à chaque fois par le tableau de combinaisons au niveau 1, on pourra passer au niveau 2 ou 3, ça devrait faire gagner des pèpètes
    Globalement inoffensif
    Merci de respecter les règles du forum.
    Aucune question technique par MP !
    _______________________________________________________________________
    Cours Ruby et Ruby on Rails (RoR) - Cours PHP - FAQ Ruby / Rails - Livres Ruby / Rails
    Ajax facile avec Ruby on Rails, Prototype, script.aculo.us et les RJS
    Tutoriaux HTML/CSS et PHP

  9. #29
    Expert éminent
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Points : 7 285
    Points
    7 285
    Par défaut
    Allez, version optimisée sans doublons :

    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
     
    	$tabl = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i');
     
    	$long_tabl = count($tabl);
     
    	$tabl_result = $tabl;
     
    	for($i=1; $i<$long_tabl; $i++) {
    		foreach($tabl as $element1) {
    			foreach($tabl_result as $element2) {
    				if (strpbrk($element1, $element2) == false) {
    					$tabl_temp[] = $element1.$element2;
    				}
    			}
    		}
     
    		$tabl_result = $tabl_temp;
    		unset($tabl_temp);
    	}
     
    	print_r($tabl_result);
    ça m'a permis de vachement réduite le nombre d'itérations (986400 'seulement' pour un tableau initial de longueur 9). Attention tout de même, le dédoublonnage à l'aide de la fonction strpbrk suppose que le tableau ne contient que des chaines uniques de longueur 1.
    Globalement inoffensif
    Merci de respecter les règles du forum.
    Aucune question technique par MP !
    _______________________________________________________________________
    Cours Ruby et Ruby on Rails (RoR) - Cours PHP - FAQ Ruby / Rails - Livres Ruby / Rails
    Ajax facile avec Ruby on Rails, Prototype, script.aculo.us et les RJS
    Tutoriaux HTML/CSS et PHP

  10. #30
    Membre à l'essai

    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2006
    Messages : 14
    Points : 21
    Points
    21
    Billets dans le blog
    1
    Par défaut
    Tu peux crée un dictionnaire (un arbre)
    par exemple sabot, sabine, ca.
    Tu vas sur la lettre S, tu trouves un pointeur vers un arbre qui contient les deuxièmes lettres
    par exemple tu trouves sa, sabot, sabine.
    un flag te previens que tu peux pointer vers une troisieme lettre mais que tu as également une feuille.
    et ainsi de suite.
    La recherche s'arrête lorsqu'il n'y a plus depointeurs vers un autre arbre.
    Chaque arbre est un tableau, avec, les lettres, les pointeurs vers le tableau suivant et les flags.
    Ce n'est pas très simple sans schéma.
    BA

  11. #31
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2007
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Pour éviter les doublons, une astuce peut être d'associer à chaque élément constitutif un nombre premier(depuis une bibliothèque) et d'indexer une combinaison obtenue avec le produit de ses éléments. Ainsi pas de doublons. ex : 1 => a, 2 => b, 3 => c, 5 => d, 7 => e et 11 => f...
    abc = 6 = bca <> bcd, aef, cbe, aaa, aaaa, ... et ça marche queque soit le nombre d'éléments constitutifs et d'éléments des combinaisons.

  12. #32
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 6
    Points : 9
    Points
    9
    Par défaut
    Meme si c'est un peu tard, je vous soumets mon code que je viens de faire,
    n'ayant pas trouvé exactement ce que je voulais.

    Ps: le code ci-dessous fait exactement ce que je voulais :
    trouver toutes les combinaisons possibles de valeurs
    entre différents tableaux.


    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    <?php
    /* 
     *  This is the XXX Project Licence
     * do What The Fuck you want to Public License
     * 
     * Version 1.0, March 2000
     * Copyright (C) 2000 Banlu Kemiyatorn (]d).
     * 136 Nives 7 Jangwattana 14 Laksi Bangkok
     * Everyone is permitted to copy and distribute verbatim copies
     * of this license document, but changing it is not allowed.
     * 
     * Ok, the purpose of this license is simple
     * and you just
     * 
     * DO WHAT THE FUCK YOU WANT TO.
     * 
     */
     
    /**
     * Ling_Function_ArrayMixer.php
     * 
     * @author Ling
     * 12 déc. 2009 16:52:36
     * 
     */
     
    class Ling_Function_ArrayMixer
    {
        protected $result;
        protected $popNext;
        protected $matrix;
        protected $newArray;
        protected $oldArray;
     
        public function __construct()
        {
            $this->result  = array();
            $this->popNext = false;
            $this->matrix  = array();
            $this->newArray  = array();
            $this->oldArray  = array();
        }
     
        public function append(array $array)
        {
            $this->matrix[] = $array;
        }
     
        public function makeTree()
        {
     
            $lastArray = array_pop($this->matrix);
            if(count($this->matrix) > 0)
            {
                foreach(end($this->matrix) as $k => $v)
                {
                    $this->newArray[$v] = $lastArray;
                }
     
                while(count($this->matrix) > 1)
                {
                    $lastArray = array_pop($this->matrix);
                    $this->oldArray = $this->newArray;
                    $this->newArray = array();
                    foreach(end($this->matrix) as $k => $v)
                    {
                        $this->newArray[$v] = $this->oldArray;
                    }
                }
            }
            else
            {
                $this->result = $lastArray;
            }
     
        }
     
        public function ListageArray($tb, $todisplay=array())
        {
            foreach($cit = new CachingIterator(new ArrayIterator($tb)) as $key => $value)
            {
                if(is_array($value))
                {
                    if($this->popNext === true)
                    {
                        array_pop($todisplay);
                        $this->popNext = false;
                    }
                    $todisplay[] = $key;
                    self::ListageArray($value, $todisplay);
                }
                else
                {
                    $prefix = implode("_",$todisplay) . "_";
                    $this->result[] = $prefix . $value;
                    if(!$cit->hasNext())
                    {
                        $this->popNext = true;
                    }
                }
            }
        }
     
        public function proceed()
        {
            $this->makeTree();
            $this->ListageArray($this->newArray);
        }
     
        public function result()
        {
            return $this->result;
        }
     
    }
     
    //$t1 = array('a','b','c');
    //$t2 = array('m1','m2','m3','haha','oups');
    //$t3 = array('ok','ko');
    //$t4 = array('poule','merci','yoma');
    //
    //$x = new Ling_Function_ArrayMixer();
    //$x->append($t1);
    //$x->append($t2);
    //$x->append($t3);
    //$x->append($t4);
    //$x->proceed();
    //a($x->result());
    Si qqn a une solution plus élégante je suis preneur.

  13. #33
    Futur Membre du Club
    Inscrit en
    Avril 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 4
    Points : 5
    Points
    5
    Par défaut modification de cette fonction
    j'ai essayé de modifier cette fonction pour rendre récursive mais le probléme est que j'ai des duplications des champs:
    voici le code
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    function combinaison($mc,$m)
     { 
          $tableau = array();
          $x=0;
     
    	  while($m>0)
    	  {
           for($i=0;$i<=$m;$i++) 
    	   {
    	    for($u=0;$u<=$m;$u++)
    	     { $possible =$mc[$i];
    		   for($y=$u;$x<$m;$y++)
    		    {
    		      if (!isset($mc[$y])) $y = 0;
                     if ($y != $i) $possible .= '&nbsp;'.$mc[$y];
    			  $x++;
                 }
     
     
               $tableau[].= $possible;
    		   $x =0; 
    		   }
    	    }
    	   $m=$m-1;
    	   self::combinaison($mc,$m);
          }
     
      return $tableau;
     
     }
    y'a t-il quelqu'un peut m'aider à améliorer ce code pour que ne puisse pas avoir de duplication
    merci

  14. #34
    Membre habitué Avatar de Onimaru
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Turquie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2010
    Messages : 283
    Points : 129
    Points
    129
    Par défaut Réponse
    Salut à tous,
    Il y une réponse à ce problème dans cette discutions :

    http://www.developpez.net/forums/d96...ons-possibles/

Discussions similaires

  1. [Algorithme] Enumérer les combinaisons
    Par Flaburgan dans le forum Général Java
    Réponses: 6
    Dernier message: 04/07/2012, 16h41
  2. algorithmes pour les jeux du casino
    Par jonh8 dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 29/03/2011, 05h04
  3. [OCILIB] Algorithme pour les nulls
    Par cobfly dans le forum Interfaces de programmation
    Réponses: 3
    Dernier message: 19/05/2010, 13h54
  4. Algorithme pour les thematiques d'un texte
    Par redkan dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 16/04/2009, 13h59
  5. [Tableaux] Aide pour un algorithme sur les tableaux
    Par sara21 dans le forum Langage
    Réponses: 7
    Dernier message: 20/05/2007, 10h28

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