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 :

Toutes les combinaisons possibles d'un tableau


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur

    Homme Profil pro
    Technical Lead Salesforce
    Inscrit en
    Février 2009
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technical Lead Salesforce

    Informations forums :
    Inscription : Février 2009
    Messages : 563
    Par défaut Toutes les combinaisons possibles d'un tableau
    Bonjour, je suis en train de créer une fonction qui reçoit en paramètre un tableau et retourne toutes les combinaisons possibles de ce tableau.

    Par exemple, si on reçoit le tableau suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $tableau = array("a", "b");
    Je voudrais faire en sorte de créer toutes les combinaisons possibles avec toutes les tailles possibles.

    Avec ce tableau, ca doit retourner:
    a
    b
    aa
    ab
    ba
    bb
    Voilà actuellement où j'en suis:
    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
     
    // longueur actuelle du mot
    $longueur = 1;
    // longueur maximum des mots
    $longueurMax = 3;
    // 
    $i = 0;
    // mot actuel
    $currentWord = "";
    $tabExemple = array("a", "b");
    // nombre de caracteres dans le tableau
    $nbrTab = count($tabExemple)-1;
    // nombre de mots total
    $nbrTotal = 0;
     
    while($longueur <= $longueurMax)
    {
    	$nbrTotal = $nbrTotal + parcourDictionnaire($tabExemple, $currentWord);
     
    	if($i <= $nbrTab)
    	{
    		$currentWord = $currentWord . $tabExemple[$i];
    		$i++;
    	}else
    	{
    		$i = 0;
    	}
    	$longueur++;
    }
     
    echo "Nombre d'entree dans le tableau: " . $nbrTab . "<br/>";
    echo "Nombre total de mots: " . $nbrTotal;
     
    function parcourDictionnaire($tabCaractere, $motCourant)
    {
    	$nbr = 0;
    	foreach($tabCaractere as $caractere)
    	{
    		echo $motCourant . $caractere . "<br/>";
    		$nbr++;
    	}
    	return $nbr;
    }
    Malheureusement, cela me renvoit:
    a
    b
    aa
    ab
    aba
    abb
    Et je ne sais pas trop malheureusement ce qui ne va pas. :/
    - Mes articles
    - Consultant technique Salesforce
    - Salesforce Certified Administrator
    - Salesforce Certified Platform App Builder
    - Salesforce Certified Developper I
    - Salesforce Certified Sales Cloud
    - Salesforce Certified Service Cloud

  2. #2
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 242
    Par défaut
    J'avoue que je n'ai pas compris grand chose à ta fonction... A vrai dire, je ne sais pas quel algorithme tu as voulu utiliser derrière. Est ce que tu as essayé de dérouler ton exemple sur papier avec ta fonction ?

    Je me permet de te proposer une solution qui a l'air de fonctionner correctement. C'est une fonction récursive, j'espère que tu n'as rien contre, mais dans ton cas, c'est ce qui m'est venu en premier. Essaie de bien comprendre comment elle fonctionne et ne de pas la reprendre bêtement...
    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
     
    <?php
    /**
     * Retourne tous les combinaisons des éléments de $tab 
     * de taille $taille ou inférieure (de taille supérieure ou égale à 1)
     * @param array $tab tableau des éléments de base
     * @param int taille maximale des combinaisons résultantes
     * @return array toutes les combinaisons
     */
    function combinaisons(array $tab, $taille)
    {
    	// Cas de base : pour une taille de 1, on retourne simplement le tableau
    	if ($taille == 1) {
    		return $tab;
    	}
    	else {
    		// Cas général :
    		// Tableau de résultats final
    		$result = array(); 
    		// Calcul des combinaisons pour la taille inférieure (appel récursif)
    		$combinaisons = combinaisons($tab, $taille - 1);
    		// Création des nouvelles combinaisons à partir de celle de taille inférieure: 
    		// On ajoute chaque caractère de départ devant chacune des combinaisons trouvées
    		foreach($tab as $caractere) {
    			foreach($combinaisons as $combinaison) {
    				$result[] = $caractere . $combinaison;
    			}
    		}
    		// Le résultat est aussi bien les combinaisons de taille inférieure que celle générées
    		// On met donc les deux ensemble
    		$result = array_merge($result, $combinaisons);
    		return $result;
    	}
    }
     
    echo 'test 1 array("a", "b"), taille 2';
    var_dump(combinaisons(array("a", "b"), 2));
     
    echo 'test 2 array("a", "b"), taille 3';
    var_dump(combinaisons(array("a", "b"), 3));
     
    echo 'test 3 array("a", "b", "c"), taille 3';
    var_dump(combinaisons(array("a", "b", "c"), 3));
    ?>
    Attention quand même, c'est le genre de fonction qui va très vite prendre du temps (la sortie est de taille exponentielle, pour un tableau de taille 2, si tu veux toutes les combinaisons de taille inférieure ou égale à n, tu vas avoir dans les 2^(n+1) résultats...)

    [EDIT] Petite erreur sur la complexité, c'est pas 2^(n+1), c'est bien plus que ça...

  3. #3
    Rédacteur

    Homme Profil pro
    Technical Lead Salesforce
    Inscrit en
    Février 2009
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technical Lead Salesforce

    Informations forums :
    Inscription : Février 2009
    Messages : 563
    Par défaut
    J'avoue ne pas tout comprendre

    Pourquoi si j'utilise un tableau avec un nombre de caractères supérieur à , ca ne veut pas fonctionner, ca ne charge pas la page?

    J'avais essayé pour voir ce que ca donnait sur papier mais je bloquait lorsqu'il s'agit de la combinaison à 2 caractères et de tester avec tout les autres puis de prendre le caractère supérieur dans le tableau..
    - Mes articles
    - Consultant technique Salesforce
    - Salesforce Certified Administrator
    - Salesforce Certified Platform App Builder
    - Salesforce Certified Developper I
    - Salesforce Certified Sales Cloud
    - Salesforce Certified Service Cloud

  4. #4
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 242
    Par défaut
    Supérieur à combien ? On dirait qu'il manque un chiffre ^^.

    Je vais essayer de t'expliquer le principe de ma fonction...
    On va partir d'un cas simple avec le tableau (a, b).

    Si je veux toutes les combinaisons de taille 1, facile, c'est simplement le tableau de départ (a, b). Ca constitue le cas de base de ma récursivité.

    Si je veux toutes les combinaisons de taille 2 ou inférieure, je recherche d'abord toutes celles de taille 1. Ok, je les ai (appel récursif). Comment constituer ceux de taille 2 ? Hé bien en ajoutant chaque caractère du tableau de départ, aux combinaisons de taille 1.
    Clairement, j'ajoute 'a' :
    devant 'a' (combinaison de taille inférieure) => 'aa'
    devant 'b' (combinaison de taille inférieure) => 'ab'
    Et j'ajoute 'b' :
    devant 'a' (combinaison de taille inférieure) => 'ba'
    devant 'b' (combinaison de taille inférieure) => 'bb'
    Ce qui me donne 4 nouvelles combinaisons.


    Par contre à partir de la taille 3, on a un petit soucis (mais qui peut se corriger facilement). Certains éléments sont en double comme 'aa'. Déroule avec la taille 3 et tu comprendras.
    J'avais laissé ce bug exprès pour voir si tu suivais (non en fait je viens de m'en rendre compte^^). C'est vraiment pas dur à corriger si tu as pigé le principe. Je ne met donc pas le code définitif, à toi de le faire...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 128
    Par défaut
    Bonjour,

    Je me permet de poser ma question sur ce topic car mon problème ressemble beaucoup à celui exposé plus haut, à la différence que mon tableau en entrée est un tableau de chiffres, dont je voudrais exporter toutes les combinaisons de multiplications possibles :

    Je souhaiterais avoir ces résultats :


    Autre exemple pour ce tableau :

    ces résultats :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    1
    2
    3
    1*2
    1*3
    2*3
    Auriez vous éventuellement un algo utilisable ?

    Merci !

  6. #6
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 242
    Par défaut
    Je pense que tu peux adapter l'algo que j'avais proposé plus haut pour avoir ce que tu veux.
    Indice : quand on regarde, on remarque que le nombre de gauche est toujours strictement plus petit que le nombre de droite... Un petit if bien placé ferait-il l'affaire ?
    Hésite pas à remettre une réponse si tu trouves pas, ou si ce que je dis ne tient pas finalement...

Discussions similaires

  1. Stocker dans un tableau toutes les combinaisons possibles entre plusieurs tableaux.
    Par gui-yem dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 19/03/2014, 15h22
  2. Toutes les combinaisons possible d'un tableau
    Par Space23 dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 16/03/2014, 21h27
  3. Réponses: 16
    Dernier message: 20/10/2006, 16h31
  4. trouver les combinaisons possibles d'un tableau ?
    Par titoumimi dans le forum Algorithmes et structures de données
    Réponses: 12
    Dernier message: 20/09/2006, 20h29
  5. toutes les combinaisons possibles
    Par marocleverness dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 29/05/2006, 00h11

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