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

VB.NET Discussion :

Une liste -> comparer chaque élément avec chaque élément


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 53
    Par défaut Une liste -> comparer chaque élément avec chaque élément
    Bonjour !
    Sous ce titre un peu étrange, se cache un problème simple.
    Pour vous situer le contexte, j'essaye de créer un importeur d'objets 3D Wavefront dans un visualisateur OpenGL créé avec OpenTK. Je vous passe les détails, mais à un moment, j'ai une liste de Vertex (qui peut être très grande).
    Pour chaque vertex, je dois comparer sa position avec tous les autres vertex de la liste.
    Pour y arriver, j'utilise deux boucles For imbriquées et je teste la position avec un pseudo-code du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    For i As Integer = 0 To groupVertices.Count - 1
        For j As Integer = 0 To groupVertices.Count - 1
            If Not i = j Then
                If groupVertices(i).Position.Equals(groupVertices(j).Position) Then
                'les vecteurs de position des deux vertex est identique
                'quelques autres calculs peuvent être faits ici
                End If
            End If
        Next
    Next
    Tout fonctionne comme espéré ... quand la liste contient peu d'éléments, mais ma liste peut contenir plus de 20000 éléments !!!
    Et là, c'est l'horreur. Cette méthode met plus de 20 secondes à tout parcourir, même si je ne fait aucun calcul complexe (à la place des commentaires).

    Est-ce qu'il existe un moyen plus rapide pour faire ce genre de comparaison ?

    Merci d'avance pour vos idées.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    291
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 291
    Par défaut
    Bonjour,

    Avec groupVertices.equals ?
    Ou groupVertices.Where ?

  3. #3
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Il faut diminuer la plage de recherche à chaque tour, car une fois que l'on a testé un élément avec tous les autres on peut l'exclure le coup d'après.

    Si par exemple au premier tour tu testes avec i=0 et j=1. Le coup d'après pas la peine de tester i=1 et j=0 puisque c'est déjà fait.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    For i As Integer = 0 To groupVertices.Count - 2
        For j As Integer = i + 1 To groupVertices.Count - 1
            If groupVertices(i).Position.Equals(groupVertices(j).Position) Then
            'les vecteurs de position des deux vertex est identique
            'quelques autres calculs peuvent être faits ici
            End If
        Next
    Next

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 53
    Par défaut
    Bonjour Geo2A et StormimOn

    J'utilise "Equals" pour comparer des "Vector3" (un vecteur contenant 3 Single).

    Merci beaucoup pour l'idée StormimOn ! Effectivement, ça serait bien plus simple comme ça et en plus, plus simple que mon idée de départ.
    Par contre, autant je comprends le principe, autant j'ai du mal à imaginer les étapes des boucles imbriquées avec les itérations comme tu les as écrites.

    Ce n'est pas bien grave, j'ai compris le principe, je vais essayer d'implémenter ça moi même.

    Merci beaucoup

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 53
    Par défaut
    Je reviens dans le coin pour parler de mes différents tests, mais surtout pour te dire un grand merci StormimOn

    Cette méthode est plus que 2x plus rapide !!
    Il me semble avoir compris le truc des indices d'itération. Je trouve la syntaxe moins explicite, mais bien astucieuse. Si je comprends bien le "i+1" (dans la boucle interne) permet de ne pas retester le "i" de la boucle externe, et comme on rajoute 1 à "i" dans la boucle interne, on doit aller jusqu'à "count - 2" dans la boucle externe pour ne pas dépassé le maxi.

    C'est bien ça ?
    J'ai horreur de copier un code sans l'avoir compris.


    Sinon j'ai essayé de faire un petit programme pour tester mes différentes méthodes, et j'ai pu remarquer que tester l'égalité de vecteurs avec "Equals" est beaucoup plus lent (environ 2x plus lent) que de le tester avec une fonction de mon cru toute bête du genre:

    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
     
    Private Function IsVector3Equals(ByVal vec1 As Vector3, ByVal vec2 As Vector3) As Boolean
        Dim isXequal As Boolean = False
        Dim isYequal As Boolean = False
        Dim isZequal As Boolean = False
     
        If vec1.X = vec2.X Then
            isXequal = True
        End If
        If vec1.Y = vec2.Y Then
            isYequal = True
        End If
        If vec1.Z = vec2.Z Then
            isZequal = True
        End If
     
        If isXequal AndAlso isYequal AndAlso isZequal Then
            Return True
        Else
            Return False
        End If
     
        End Function
    y'a-t-il une raison à cela? est-ce que "Equals" fait d'autres tests?

    sinon, avec ma méthode, sur une liste de 3000 éléments:
    -avec ma méthode et le vrai Equals: 9000000 comparaisons pour 2400 milliseconds.
    -avec ma méthode et mon Equals: 9000000 comparaisons pour 1400 ms
    -avec ta méthode et mon Equals: 4498500 comparaisons pour 433 ms !

    C'est vraiment le genre de tests que je ne fais jamais en tant que programmeur amateur, mais ça montre bien l'importance d'utiliser des méthodes adéquates.

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

Discussions similaires

  1. Carrousel avec plusieurs éléments dans chaque slide
    Par rotciv46 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 11/05/2015, 00h40
  2. Une liste à puces peut-elle se déplier à chaque clic ???
    Par isaldana38 dans le forum VBA PowerPoint
    Réponses: 0
    Dernier message: 29/08/2014, 14h19
  3. Réponses: 3
    Dernier message: 12/12/2007, 11h39
  4. Trier une liste en comparant des doubles
    Par babylone7 dans le forum Langage
    Réponses: 10
    Dernier message: 03/05/2007, 10h38
  5. Réponses: 17
    Dernier message: 12/07/2006, 22h04

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