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

Java Discussion :

Optimiser un tirage au sort dans une collection


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 147
    Par défaut Optimiser un tirage au sort dans une collection
    Bonjour,

    J'ai une collection de taille importante (plusieurs centaines d'éléments) dans laquelle je dois sélectionner des éléments tirés au hasard.
    Comme cette opération doit être répétée très souvent, elle est susceptible de peser sur les performances du logiciel.
    Quel algorithme utiliseriez-vous avec quel type de collection si vous vouliez optimiser cette opération ?

  2. #2
    Membre Expert Avatar de Nico02
    Homme Profil pro
    Developpeur Java/JEE
    Inscrit en
    Février 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Developpeur Java/JEE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 728
    Par défaut
    Salut,

    je vois pas trop en quoi quelques appels à Random.nextInt() peuvent peser sur les performances d'un appli ?

    Essayons un petit cas de test.

    Disons que tes éléments sont stockés dans une ArrayList d'Integer et que j'ajoute des éléments au fur et à mesure dans la liste, puis j'en affiche un au hasard à chaque fois.

    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
     
    Random rand = new Random();
     
    ArrayList<Integer> list = new ArrayList<Integer>();
     
    long time = System.currentTimeMillis();
     
    for(int i=0;i<10000;i++)
    {
    	list.add( i );
    	System.out.println( list.get( rand.nextInt( list.size()  ) ) );
    }
     
    System.out.println( "temps d'éxécution : " + ( System.currentTimeMillis() - time ) + "ms" );
     
    ---> temps d'éxécution : 886ms
    Après à voir aussi selon ce que tu as comme éléments à stocker e surtout sur quoi tu te bases pour y accéder mais bon là il faut plus d'infos.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 147
    Par défaut
    Ce n'est pas les appels à Random qui pèsent, mais l'accès aux éléments de la collection.
    Si on compare ArrayList et LinkedList :
    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
    		int size = 10000;
    		Random rand = new Random(); 
    		ArrayList<Integer> arrayList = new ArrayList<Integer>();
    		LinkedList<Integer> linkedList = new LinkedList<Integer>();
    		for(int i=0;i<size;i++) {
    			arrayList.add(rand.nextInt());
    			linkedList.add(rand.nextInt());
    		}
    		long time1 = System.currentTimeMillis();
    		for(int i=0;i<10000;i++) {
    			arrayList.get(rand.nextInt(size-1));
    		}
    		System.out.println( "Temps d'exécution 1 : " + ( System.currentTimeMillis() - time1 ) + "ms" );
    		long time2 = System.currentTimeMillis();
    		for(int i=0;i<10000;i++) {
    			linkedList.get(rand.nextInt(size-1));
    		}
    		System.out.println( "Temps d'exécution 2 : " + ( System.currentTimeMillis() - time2 ) + "ms" );
    Je trouve :
    Temps d'exécution 1 : 2ms
    Temps d'exécution 2 : 62ms

    Le type de collection à utiliser doit donc être réfléchi.
    Ma question est : Y a t-il une autre façon de ranger ces éléments dans une collection et d'y accéder pour accélérer encore les tirages au sort ?

  4. #4
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Pour accéder le plus rapidement possible à un élément via sa position dans une liste, utilise un ArrayList.
    Quelles sont tes contraintes sur la structure de stockage à utiliser ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 147
    Par défaut
    A priori, une fois la liste initialisée, il ne devrait pas y avoir d'ajouts ou de retraits, ou alors pas souvent, donc de ce côté là j'ai pas de souci.
    En revanche, en plus des tirages au sort, j'aurais besoin fréquemment d'une copie complète de liste mélangée au hasard (à l'aide de Collections.shuffle()).
    Là encore, ArrayList semble plus performant.

    Enfin, j'aurai sans doute aussi besoin de pouvoir accéder aux éléments par leur nom, et je pensais donc à une HashMap<String,Object>.
    Le problème c'est que la HashMap n'est pas adaptée aux tirages au sort.
    La solution serait alors de maintenir deux collections contenant les mêmes objets:
    - ArrayList pour les tirages au sort,
    - HashMap pour les accès par le nom.
    Qu'est-ce que tu en penses ?

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Ca me semble correct. Quoi que si la Collection ne change plus une fois chargée, un tableau me semblerait plus approprié qu'un ArrayList. C'est beaucoup plus facile à copier et à mélanger

Discussions similaires

  1. [VB.NET] Suppression d'objets dans une collection
    Par master56 dans le forum VB.NET
    Réponses: 7
    Dernier message: 03/06/2010, 21h46
  2. Réponses: 8
    Dernier message: 03/02/2006, 15h15
  3. [PL/SQL] Charger une table dans une collection
    Par nosnoss dans le forum Oracle
    Réponses: 10
    Dernier message: 03/03/2005, 17h56
  4. Controle dans une collection
    Par rolototo dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 07/02/2005, 14h12
  5. Réponses: 12
    Dernier message: 26/02/2003, 08h14

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