begin process at 2012 02 15 08:21:25
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths et Algorithmes

 > COMBINAISONS

COMBINAISONS


 Description

Renvoi toutes les combinaisons de n booléens et toutes les combinaisons d'une chaine de caractère.

Algorythme :
Utilise le fait que les combinaisons d'un octets (en binaire évidemment) sont les chiffres en base 10 de 0 à 255

Code :
Deux fonctions : une qui travaille sur des booléens et une sur des chaînes de caractère.
+des fonctions d'affichage et de test

Source

  • class combinaisons{
  • //renvoi toutes les combinaisons de t booléens
  • static boolean[][]Combinaisons(int t){//t=taille de la chaine
  • boolean[][]comb=new boolean[(int)Math.pow(2,t)][t];
  • for(int i=0;i<comb.length;i++){
  • int a=i;
  • for(int j=comb[0].length-1;j>=0;j--){
  • if(a%2==1){
  • comb[i][j]=true;
  • a=(int)(a/2);
  • }
  • else{
  • a/=2;
  • }
  • }
  • }
  • return comb;
  • }
  • //renvoi toutes les combinaisons d'une chaine de caractère
  • static char[][] Combinaisons(String mot){
  • int longueur=mot.length();
  • int nbr=(int)Math.pow(2,longueur);//nbr=nombre de combinaisons
  • char[][] comb=new char[nbr][longueur];
  • int k=0;
  • for(int i=0;i<nbr;i++){
  • k=i;
  • for(int j=longueur-1;j>=0;j--){
  • if(k%2==0){
  • k/=2;
  • }
  • else{
  • comb[i][j]=mot.charAt(j);
  • k/=2;
  • }
  • }
  • }
  • return comb;
  • }
  • static void afficher(char[][] a){
  • for(int i=0;i<a.length;i++){
  • for(int j=0;j<a[0].length;j++){
  • System.out.print(a[i][j]);
  • }
  • System.out.println();
  • }
  • }
  • static void afficher(boolean[][] a){
  • for(int i=0;i<a.length;i++){
  • for(int j=0;j<a[0].length;j++){
  • System.out.print(a[i][j]);
  • }
  • System.out.println();
  • }
  • }
  • public static void main(String[]adrien){
  • afficher(Combinaisons(5));
  • afficher(Combinaisons("abcd"));
  • }
  • }
class combinaisons{
 //renvoi toutes les combinaisons de t booléens
 static boolean[][]Combinaisons(int t){//t=taille de la chaine
     boolean[][]comb=new boolean[(int)Math.pow(2,t)][t];
     for(int i=0;i<comb.length;i++){
      int a=i;
      for(int j=comb[0].length-1;j>=0;j--){
       if(a%2==1){
        comb[i][j]=true;
        a=(int)(a/2);
       }
       else{
        a/=2;
       }
      }
     }
     return comb;
    }
    
    //renvoi toutes les combinaisons d'une chaine de caractère
    static char[][] Combinaisons(String mot){
     int longueur=mot.length();
  int nbr=(int)Math.pow(2,longueur);//nbr=nombre de combinaisons
     char[][] comb=new char[nbr][longueur];
     int k=0;
     for(int i=0;i<nbr;i++){
      k=i;
      for(int j=longueur-1;j>=0;j--){
       if(k%2==0){
        k/=2;
       }
       else{
        comb[i][j]=mot.charAt(j);
        k/=2;
       }
      }
     }
     return comb;
    }
    static void afficher(char[][] a){
     for(int i=0;i<a.length;i++){
      for(int j=0;j<a[0].length;j++){
       System.out.print(a[i][j]);
      }
      System.out.println();
     }
    }
    static void afficher(boolean[][] a){
     for(int i=0;i<a.length;i++){
      for(int j=0;j<a[0].length;j++){
       System.out.print(a[i][j]);
      }
      System.out.println();
     }
    }
    public static void main(String[]adrien){
     afficher(Combinaisons(5));
     afficher(Combinaisons("abcd"));
    }
}

 Conclusion

Remarques :
Remplacez les tableaux par des listes si vous ne voulez pas de blanc dans les combinaisons.
Ne dépassez pas la capacité du type primitif utilisé !!!
     *   ne marche pas pour les mots de plus de n lettres :
     *   n tq : 2^n=capacité du type
     *   pour les byte n=1*8=8
     *   pour les short n=2*8=16
     *   pour les int : n=4*8=32
     *   pour les long : n=8*8=64

Signature :
Le danseur de Java qui fume des Caml


 Sources de la même categorie

IMPLÉMENTATION DE L'ENSEMBLE C AVEC JAVA par Scupper
CALCUL D'EXPONENTIEL ( PRÉCISION MODIFIABLE) par Scupper
Source avec Zip TRANSFORMATION D'UNE EXPRESSION ARITHMETIQUE (INFIXÉ) EN POS... par billatosco
PROBLÈME DES N-REINES par jojolemariole
Source avec Zip ARRAYMATRIX -MATRICE MULTIDIMENSIONELLE ET GÉNÉRIQUE- , IMP... par labandus

Commentaires et avis

Commentaire de lrequena le 20/05/2005 03:57:25

Je cherchais à faire plus ou moins la même chose ... :-)


import java.util.Vector;
import java.util.Enumeration;

public class Combinaisons{

/**
* La fonction java.lang.Long.toBinaryString(long value) retourne
* la valeur passée en argument sous la forme d'une chaine de
* caractères (formee de bits : 0 ou 1) représentant un nombre binaire (base 2).
   * Pour notre utilisation, il est nécessaire de compléter ce nombre
* par la gauche avec un nombre précis de zéros tel que :
* [Nombre de zéros complémentaires]=[Nombre total d'élements]-[Nombre de bits dans le nombre]
*/
private static String completerParDesZeros(String str, int nbreChiffres){
StringBuffer buffer=new StringBuffer(str);
for(long diff=nbreChiffres-buffer.length();diff>0;diff--) buffer.insert(0,"0");
String tmp=buffer.toString();
buffer=null;
return tmp;
}

/**
* La fonction compte et retourne le nombre de bits à 0 dans le
* nombre binaire passé en argument sous la forme d'une chaine de caractères.
*/
private static int nombreDe0(String binaire){
int compteur=0;
for(int i=0;i<binaire.length();i++) if(binaire.charAt(i)=='0') compteur++;
return compteur;
}

/**
* La fonction compte et retourne le nombre de bits à 1 dans le
* nombre binaire passé en argument sous la forme d'une chaine de caractères.
*/
private static int nombreDe1(String binaire){
int compteur=0;
for(int i=0;i<binaire.length();i++) if(binaire.charAt(i)=='1') compteur++;
return compteur;
}

/**
* La fonction construit une chaine de caractères telle que :
* pour une position donnée [0...n], si le bit est à 1 dans [binaire]
* alors le caractère correspondant dans [listeElements] est ajouté.
*/
private static String remplacerChiffresParElements(String binaire, String listeElements){
final int nbreElements = listeElements.length();
StringBuffer buffer=new StringBuffer();
for(long j=0;j<nbreElements;j++){
buffer.append((binaire.charAt((int)j)=='0')?"-":""+listeElements.charAt((int)j));
}
String tmp=buffer.toString();
buffer=null;
return tmp;
}

/**
* Considerons la liste des éléments et un nombre binaire comme des bandelettes de papier;
* Sur la première est inscrite la liste des éléments pouvant apparaitre dans les combinaisons;
* Sur la deuxième, les bits à 1 sont représentés par des trous.
* En superposant la deuxième bandelette à la première, on peut (littéralement) lire
* la combinaison d'éléments correspondant au nombre binaire.
*
* Probleme à résoudre :
*
* Pour un meme nombre total d'elements, le nombre d'éléments par combinaison peut varier,
* sans que la fonction soit plus rapide.
*
* ex: Avec 3 symboles , le plus grand nombre binaire possible est 111 (soit 2^3 -1=7 en décimal) et le plus petit 000 (soit 0 !)
*
* La fonction incrémente un compteur de 0 à n (7 dans notre exemple)
* 0->000 1->001 2->010 3->011 4->100 5->101 6->110 7->111
*
* transforme cette valeur en binaire; ensuite, si le nombre de bits à 1 est égal au nombre d'éléments demandé
* le masque est utilisé pour construire une combinaison.
*
* Comment ne plus filtrer la liste de toutes les combinaisons possibles de 0 à n éléments, mais bel et bien
* Génerer seulement les combinaisons de x éléments demandées???
*/
protected static Enumeration toutesLesCombinaisons(String listeElements, int nombreElementsDansCombinaison){
final int nbreElements = listeElements.length();
final double nbreLignes = Math.pow(2,nbreElements);

Vector vector= new Vector((int)nbreLignes);
long valeur=(long)nbreLignes-1L;

while(valeur>0){
String binaire=completerParDesZeros(Long.toBinaryString(valeur),nbreElements);
if(nombreElementsDansCombinaison==nombreDe1(binaire)){
String mot=remplacerChiffresParElements(binaire,listeElements);
vector.add(mot);
}
valeur--;
}
return vector.elements();
     }

/**
* La méthode imprime sur la console le contenu de l'objet java.util.Enumeration
*/
protected static void lister(Enumeration enumeration){
     while(enumeration.hasMoreElements()){
System.out.println((String)enumeration.nextElement());
     }
     }
     /**
* Méthode principale
* @author REQUENA Ludwig
*/
     public static void main(String[] args){
long dep1=System.currentTimeMillis();
try{
     if(args.length==2) lister(toutesLesCombinaisons(args[0],Integer.parseInt(args[1])));
else System.exit(0);
}catch(OutOfMemoryError oomerr){
System.err.println("La methode a consomme trop de ressources");
}
long fin1=System.currentTimeMillis();
long diff1=fin1-dep1;
System.out.println("nouvelle methode executee en : "+diff1+" millisecondes.");
     }

}

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,059 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales