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

Algorithmes et structures de données Discussion :

Comment optimisez mon code ? Systeme de combinaison


Sujet :

Algorithmes et structures de données

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 123
    Par défaut Comment optimisez mon code ? Systeme de combinaison
    Bonjour, voila le code que j'utilise

    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
     
    Public Function Komb1(ByVal tableau, ByVal Prefixe As String, ByVal min As Integer, ByVal max As Integer, ByVal n As Integer) As String
        Dim i As Integer
        Dim Resultat As String
     
        For i = min To max - n + 1
            If Prefixe = "-1" Then
                Resultat = tableau(i)
            Else
                Resultat = Prefixe & "*" & tableau(i)
            End If
     
            If n > 1 Then
                Komb1 tableau, Resultat, i + 1, max, n - 1
            Else
                If total1 = vbNullString Then
                    total1 = Resultat
                Else
                    total1 = total1 & "+" & Resultat
                End If
            End If
        Next
     
        Komb1 = total1
    End Function
    Rezultat=>
    Combinaison de 2 element sur 5 (2/5) -> 10 combinaison possible
    A*B+A*C+A*D+A*E+A*F+B*C+B*D+B*E+B*F+C*D+C*E+C*F+D*E+D*F+E*F


    Mon probleme c'est que quand je dois calculer de grande combinaison (4/13) ->715 combinaisons possible, le temps de calcul est trop eleve, tout ce qui est superieur a 5s est trop eleve pour moi

    Qu'elle est la meilleure maniere de faire ? Puis-je optimiser mon code,stocker dans un tableau, ou dans un fichier ?

    Merci

  2. #2
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    c'est obligé de le faire en recursif ?
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 123
    Par défaut
    Bien sur que non

    Si vous avez un algo plus rapide ou tout autre language.

    Merci

  4. #4
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Citation Envoyé par enibris Voir le message
    Bien sur que non

    Si vous avez un algo plus rapide ou tout autre language.

    Merci
    Sérieux, tout autre langage ?
    Du Haskell alors :
    Code Haskell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    import List
     
    combination 0 _ = [[]]
    combination n xs = [e:es| e:ys <- tails xs, es <- combination (n-1) ys]
     
    main = putStr . concat . intersperse "+" . map (intersperse '*') . combination 4 $ ['A'..'M']

    Complètement instantanné, bien sûr !

    (N'hésite pas à me demander des explications, mais j'aimerais bien avoir quelques détails sur tes connaissances et tes études (éventuelles) avant)

    --
    Jedaï

  5. #5
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    ah... Jedai. L'evangeliste Haskell

    Bon sinon en imperatif, le principe c'est de faire toutes les listes de taille "p" telles que les nombres dans les listes soient toujours dans l'ordre croissant:

    partition: p=2 / n=5:
    (0,1), (0,2), (0,3), (0,4), (1,2), (1,3), (1,4), (2,3), (2,4), (3,4)

    Ensuite il suffit d'utiliser ces nombres comme des "index" dans le tableau.

    L'idée la plus simple est de faire des boucles for/next imbriquées:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    For i=0 to 4
        For j=i+1 to 4
            ' ajouter la liste (i,j)
        Next j
    Next i
    Bien sur, le nombre de boucles imbriquées dépend du parametre "p".
    Si ce parametre est une variable, il faut trouver une autre astuce pour generer les listes...
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 123
    Par défaut
    @jedai
    La tu m'assasines. Avec BAC +2, ca etre tres dur.
    Je pensais vb,deplhi,c & c++, algo..

    C'est pour implementer dans VB

    L'histoire des boucles je vais essayer. Au finale je depasse pas p=16/ n=16

    Merci

  7. #7
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par enibris Voir le message
    L'histoire des boucles je vais essayer. Au finale je depasse pas p=16/ n=16
    J'ai posté une version recursive dans la rubrique "contribuez", pour le cas ou "p" est une variable.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  8. #8
    Membre très actif

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Par défaut
    salut

    il y a une version itérative pour les combinaisons qui est bien pensée,
    mais je lui préfère la version récursive qui est facile à écrire
    (les tableaux commencent à l'indice 0)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    combinaison (tableau t, tablau combi, entier n, entier p, entier i, entier j) {
       si i = p alors afficher (combi)
       sinon 
          si n-j >= p-i alors // il reste suffisament d'éléments dans t
            combinaison (t, combi, n, p, i, j+1) // on n'a pas mis l'élément t[j] dans le tableau combi
            combi[i] <- t[j] // on met l'élément t[j] dans le tableau combi
            combinaison (t, combi, n, p, i+1, j+1)
          fin si
       fin si
    }

    le premier appel récursif:

    combinaison ( tableau = {1,2,3,4...n}, combi = {}, n, p, 0, 0 )

    le principe est qu'on met simplement en oeuvre la formule C(n,p) = C(n-1,p-1) + C(n-1,p)

Discussions similaires

  1. Comment stocker ou optimisez mon code ?
    Par enibris dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 11/10/2007, 15h21
  2. Optimiser le code ->Systeme de combinaison
    Par enibris dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 10/10/2006, 21h19
  3. Comment convertir mon code ASP et ASP.Net ?
    Par yushkoya dans le forum ASP.NET
    Réponses: 3
    Dernier message: 25/07/2006, 17h24
  4. [Sécurité] Comment protéger mon code source en local
    Par Chikh001 dans le forum Langage
    Réponses: 3
    Dernier message: 09/06/2006, 11h16
  5. [Sécurité] Comment amélioré mon code ?
    Par Nadd dans le forum Langage
    Réponses: 14
    Dernier message: 03/03/2006, 20h13

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