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 :

Calculer la complexité d'un algorithme


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 62
    Par défaut Calculer la complexité d'un algorithme
    bonsoir tout le monde,
    j'ai un probleme dans le calcul de la complexité?
    j'ai cherché mais j'a pas trouvé un bon tutoriel ou le bon cours qui peut m'aider surtout que je suis débutante

    par exemple j'ai l'algo suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for i=1 to N do
    { for j=1 to i do
         operation;
    }
    ou par exemple si j'ai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    i=1;
    j=1;
    if((i<n) && (j<n)) then
     i++;
    else
     j++;
    SVP quelcun peut me donner un bon lien pour mieux comprendre comment calculer la complexité et si possible quelcun qui peut m'aider à calculer la compl de ces 2 algo ci dessus
    BN et meci d'avance

  2. #2
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 77
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Par défaut
    Pour le premier, par exemple, tu as N boucles
    Pour la première boucle tu as 1 sous boucle, pour la seconde 2 et ainsi de suite.
    Le nombre total des boucles est donc 1+2+...+N= N(N+1)/2
    Admettons maintenant que 'operation' est à temps constant O(1). Ton algo sera en O(N²/2)
    car N(N+1)/2= N²/2 + N +1/2 et que pour N grand N+1/2 est négligeable devant N²/2
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 62
    Par défaut calculer la complexité d'un algorithme
    Bonjour,
    merci bien Zavonen d'avoir me répondre, mais SVP est ce que vous pouvez me dire comment calculer la comlexité pour le 2eme exemple car je sais pas c'est quoi la regle qui me permet da calculer la complexité en cas de condition(if condition then i else j)
    merci davance

  4. #4
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 77
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Par défaut
    Pour la seconde c'est difficile à dire.
    Il ne s'agit pas à proprement parler d'algorithme mais d'une brève suite d'instructions.
    2 affectations, 2 tests, une incrémentation.
    La 'complexité' est la somme des 'complexités' de chacune.
    La 'complexité' de chacune ne peut être définie indépendamment du langage du compilateur, du processeur, etc...
    Je ne peux guère t'en dire plus.
    On s'intéresse à ces questions quand de telles suites se trouvent dans des boucles répétées un très grand nombre de fois. On sait par exemple que dans presque tous les systèmes, un test est beaucoup plus rapide qu'un échange (trois affectations), c'est pourquoi on va privilégier des algorithmes qui pour un même O en fonction de N privilégie les tests par rapport aux échanges.
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  5. #5
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Par défaut
    Bonjour,

    le calcul de Zavonen est bien évidemment juste, mais petite précision, lorsque tu donnes la complexité, tu ne mets pas la constante. Donc ton algo a une complexité en O(N²).

    Sinon pour ton algo 2, une condition a une complexité en 0(1).
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  6. #6
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 77
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Par défaut
    Sinon pour ton algo 2, une condition a une complexité en 0(1).
    Plus précisément on 'sort' la constante, algo en (1/2)O(N²).
    Parmi les algos en O(N²) un algo en 1/2O(N²) est quand même 4 fois plus rapide qu'un algo en 2O(N²). Il n'y a pas de petites économies...
    C'est par de telles considérations qu'on peut dire qu'un tri par insertion et meilleur qu'un tri à bulles, alors qu'ils sont tous du même ordre polynomial.
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  7. #7
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 62
    Par défaut calculer la complexité d'un algorithme
    merci bien à vous tous
    just une demande est ce quelcun a un bon cours qui peux m'aider à mieu comprendre la complexité et si c'est possible des exerxices ou des exemple.
    j'ai vraiment cherché mais j'ai pas trouvé une chose importatnte
    bn

  8. #8
    Invité de passage
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1
    Par défaut
    Citation Envoyé par Zavonen Voir le message
    Pour le premier, par exemple, tu as N boucles
    Pour la première boucle tu as 1 sous boucle, pour la seconde 2 et ainsi de suite.
    Le nombre total des boucles est donc 1+2+...+N= N(N+1)/2
    Admettons maintenant que 'operation' est à temps constant O(1). Ton algo sera en O(N²/2)
    car N(N+1)/2= N²/2 + N +1/2 et que pour N grand N+1/2 est négligeable devant N²/2
    Bonsoir;
    Pour cette solution, peut-on raisonner de cette maniere :
    1ére boucle, on a N iterations (N-1+1)
    2éme boucle, on a N itérations (N-1+1) (le j va de 1 à N ou i c'est pareil)
    Total = O(n) * O(n) = 0(n²)

  9. #9
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 6
    Par défaut calcule complexité
    Bonjour,

    après avoir tout lu, j'ai encore du mal avec le calcule de complexité, pourriez vous corriger mon raisonnement?

    AlgoCinq(n) :
    1. x <- 0
    2. pour i <- 1 à n faire :
    3.
    pour j <- 1 à 5 faire :
    4.
    x <- x + 5
    5. renvoie x

    AlgoCinq(n) :
    1. 1
    2. 1+2+...+n = (n(n+1))/2)
    3. (5-j)
    4. 1

    donc on a T(n)= 1+ (1*(5-j)*(n(n+1))/2 +2 (on ajoute 1 pour l'incrémentation de i et 1 pour j))

    T(n)= 1+(2+5*(n(n+1))/2) = 3+ (5n^2/2)+ (5n/2)
    quand n grand
    donc l'algo est en O(n^2/2) donc quadratique.

    Est-ce que c'est correcte?
    merci d'avance

  10. #10
    Membre émérite Avatar de b_reda31
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 899
    Par défaut
    Bonjour,
    Tout d'abord il faut utiliser les mots-clé FinPour afin de lever l'ambiguité et délimiter le bloc qui sera itéré :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    AlgoCinq(n) :
    1.  x <- 0
     
    2.   pour i <- 1 à n faire :
    3.      pour j <- 1 à 5 faire :
    4.            x <- x + 5
             FinPour
          FinPour
     
    5. renvoie x

    Les instructions 1 et 5 sont exécutées qu'une seule fois (Hors de la boucle).
    L'instruction 4 (x <- x + 5) est exécutée 5*n Fois (5 Fois pour chaque valeur de i, et i varie de 1 à N).
    En ignorant les tests des instruction 2 et 3 on a :
    T(n) = 1 + 5*n + 1

    La complexité est donc en O(k*n) , tel que k=5 soit O(n).

  11. #11
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 6
    Par défaut
    bonjour,

    merci et désolé mais j'ai recopier l'énoncé tel quel et il n'y avait pas les mont-clés "finpour".

    Je ne comprend pas en faits pourquoi "En ignorant les tests des instruction 2 et 3" ??

    Car en terme de pas, ces instructions compte et donc joue sur le
    temps d'éxécution!!

  12. #12
    Membre actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 15
    Par défaut Calcul de Complexité
    SVP, comment peut-on calculer la Complexité de cet Algorithme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Algo()
    {
     
        i=1
        while(i<n) do
            i=2*i;
            for j=1 to i do
                <operation>;
            end for
        end while
     
    }
    Merci d'avance.

  13. #13
    Membre émérite Avatar de b_reda31
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 899
    Par défaut
    Il ne faut pas hésiter à faire le déroulement de l'algorithme en prenant plusieurs valeurs pour n. De cette façon vous allez pouvoir y voir plus clair.

    Prenons l'exemple où n = 8 :

    Etant donnée qu'on cherche à calculer la complexité asymptotique, on se limitera au calcul du nombre de fois que l'instruction <Op> est exécutée.


    • i = 1<n
      • i = i * 2 = 2
        • j = 1 <operation>

        • j = 2 <operation>


    • i = 2<n
      • i = i * 2 = 4
        • j = 1 <operation>

        • j = 2 <operation>

        • j = 3 <operation>

        • j = 4 <operation>


    • i = 4<n
      • i = i * 2 = 8
        • j = 1 <operation>

        • j = 2 <operation>

        • j = 3 <operation>

        • j = 4 <operation>

        • j = 5 <operation>


        • j = 6 <operation>


        • j = 7 <operation>


        • j = 8 <operation>


    Dans notre exemple, l'opération est exécutée 2 + 4 + 8 fois. Et dans un cas général on a : 2 + 4 + 8 + 16 + . . . + m
    Tel que m est la plus petite puissance de 2 supérieure ou égale à n.
    Dans le meilleur des cas on a m = n :
    2 + 4 + 8 + ... + n.
    C'est donc la somme des terme d'une suite géométrique à raison égale à 2.


    le nombre de terme k représente le degré de puissance de n. soit k = log2(n).
    (dans notre exmple k = 3, si on avait n = 16 ==> k = 4...etc).
    En appliquant la formule de la suite, on obtient alors une complexité linéaire O(n).

  14. #14
    Membre actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 15
    Par défaut Calcul de Complexité
    Merci beaucoup pour votre gentil retour.
    Oui j'ai déroulé l'algorithme sauf que je me suis bloquée au niveau de la borne supérieure de la somme...

    D'après ce que j'ai compris, la formule finale de la somme est la suivante:
    ∑(2^k) tel que: k varie de 1 à Log2(n)

    N'est ce pas?

  15. #15
    Membre émérite Avatar de b_reda31
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 899
    Par défaut
    Citation Envoyé par lyess Voir le message
    D'après ce que j'ai compris, la formule finale de la somme est la suivante:
    ∑(2^k) tel que: k varie de 1 à Log2(n)

    N'est ce pas?
    Oui, dans le cas où "n" est une puissance de deux (n = 2^k). C'est d'ailleurs le meilleur des cas.
    Le pire des cas se produit lorsque "n" est de la forme (2^k) + 1... si je ne me trompe pas ...on aurait ici : ∑(2^k) tel que: k varie de 1 à Log2(m) où m est la plus petite puissance de 2 supérieure à n.
    Mais dans les deux cas l'algo est en O(n)... sauf erreur de ma part

  16. #16
    Membre actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 15
    Par défaut
    Merci beaucoup! Bonne journée.

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

Discussions similaires

  1. Algorithme récursif et calcul de complexité
    Par Lithrein dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 14/12/2011, 01h10
  2. Calcul de la complexité d'un algorithme
    Par abidineb dans le forum Algorithmes et structures de données
    Réponses: 17
    Dernier message: 06/07/2011, 20h52
  3. calcul de la complexité d'un algorithme de Djikstra
    Par asmaaya10 dans le forum Algorithmes et structures de données
    Réponses: 0
    Dernier message: 12/04/2010, 16h05
  4. complexité d'un algorithme par un...algorithme??
    Par afrikha dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 02/11/2005, 00h59

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