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

Contribuez / Téléchargez Sources et Outils PHP Discussion :

Liste de combinaison de p parmi n éléments


Sujet :

Contribuez / Téléchargez Sources et Outils PHP

  1. #1
    Membre actif
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : développeur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2004
    Messages : 479
    Points : 281
    Points
    281
    Par défaut Liste de combinaison de p parmi n éléments
    Je me suis inspiré de ceci http://www.developpez.net/forums/d42...s/#post5735783 pour la version php :


    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
    <?php
    	// construction recursive des listes possibles
    	function partition($index, $p, $n, $ordered, $liste) {
    		if ($index>=$p) {// la liste est construite -> FIN
    			for ($i=0;$i<count($liste);$i++) {
    				$res = $liste[$i];
    				echo " - ".$res;
    			}
    			echo"<br>";
    		}
    		// ajoute un nouvel element candidat dans la liste
    		// - sans ordre -> candidat: tous les elements
    		// - avec ordre -> candidat: seulement les elements supérieurs au précédent
    		$start=1;
    		if ($ordered && $index>0) {
    			$start = $liste[$index-1]+1;
    		}
    		for($i=$start;$i<=$n;$i++) {
    			$liste[$index] = $i;
    			partition($index+1, $p, $n, $ordered, $liste);
    		}
    	}
    	partition(0, 7, 16, true, array());
    ?>
    On obtient toutes les combinaisons de 7 éléments parmi 16.

  2. #2
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Hello

    On pourrait changer ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // la liste est construite -> FIN
    		for ($i=0;$i<count($liste);$i++) {
    			$res = $liste[$i];
    			echo " - ".$res;
    		}
    		echo"<br>";
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    echo implode(' - ', $liste) . '<br />';
    et puis peut être changer sa signature:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function partition($index, $p, $n, $ordered = true, $liste = array())
    Mais bon, c'est cosmétique

  3. #3
    Membre actif
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : développeur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2004
    Messages : 479
    Points : 281
    Points
    281
    Par défaut
    C'est effectivement plus propre.


    Un autre code, mais cette fois, ce n'est pas parmi la suite continue des n premiers nombres, mais parmi n éléments qui n'ont aucun lien entre eux :

    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
     
    $liste2 = array("banane",5,"escalier",9,11);
     
    function partition2($index, $p, $n, $ordered, $liste) {
    	global $liste2;
    	if ($index>=$p) {// la liste est construite -> FIN
    		echo implode(" - ", $liste)."<br/>";
    		return;
    	}
    	// ajoute un nouvel element candidat dans la liste
    	// - sans ordre -> candidat: tous les elements
    	// - avec ordre -> candidat: seulement les elements supérieurs au précédent
    	$start=0;
    	if ($ordered && $index>0) {
    		$start = array_search($liste[$index-1], $liste2) + 1;
    	}
    	for($i=$start;$i<$n;$i++) {
    		$liste[$index] = $liste2[$i];
    		partition2($index+1, $p, $n, $ordered, $liste);
    	}
    }
    partition2(0, 4, count($liste2), $ordered = true, $liste = array());
    Et on obtient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    banane - 5 - escalier - 9
    banane - 5 - escalier - 11
    banane - 5 - 9 - 11
    banane - escalier - 9 - 11
    5 - escalier - 9 - 11

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

Discussions similaires

  1. generer toutes combinaisons de N parmi K ?
    Par zhao dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 19/10/2008, 11h54
  2. Obtenir la liste des combinaisons de p éléments d une liste de n éléments?
    Par Stéphane Nadry dans le forum Général Python
    Réponses: 7
    Dernier message: 18/02/2008, 21h16
  3. [MySQL] Liste déroulante + affichage des données d'un élément de la liste
    Par Sofute dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 15/02/2007, 00h02
  4. Réponses: 22
    Dernier message: 27/10/2006, 03h26
  5. Tri aléatoire parmis les éléments d'une liste
    Par ahouba dans le forum Access
    Réponses: 2
    Dernier message: 29/06/2006, 19h03

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