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 :

Prouver la complexité d'un algorithme


Sujet :

Algorithmes et structures de données

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 9
    Points : 9
    Points
    9
    Par défaut Prouver la complexité d'un algorithme
    Bonjour j'ai un problème de complexité :


    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    int count (int *T, int n)
    {
       int j;
       if (n == 0)
          return 0;
       j = 1;
       while ((n-1-j >= 0) && (T[n-1-j] != T[n-1]))
          j = 2*j;
       if (n-1-j >= 0)
          return count(T, n-1);
    return (count(T, n-1)+1);
    }



    Donc dans le pire des cas la boucle while sera effectué (n-1)*(n-2) fois. n-1 fois pour l'itération et n-1-j fois pour l'itération de while ? D'ou en minorant j par 1.

    D'ou T(n) = n*T(n-1) D'ou une complexité polynomiale.

  2. #2
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    C'est de l'algorithmique plus que du C.

    Quelle est ta question exacte ? Qu'est sensée faire cette fonction ? Pré- et post-conditions, description, commentaires, tout ça...

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 9
    Points : 9
    Points
    9
    Par défaut
    Lorsque je parle de complexité je parle de complexité de temps dans le pire des cas, donc du nombre d'operation dans le pire des cas.

    Je cherche a calculé le nombre de fois que sera effectué la boucle while dans le pire des cas. Et l’équation récursive qui décrit
    le nombre d’opération élémentaire T(n) effectuée par la fonction count() dans le pire des cas.

    Soit si j'ai bien compris la fonction count recherche tous les éléments qui qui sont égaux à la dernière case du tableau.
    Et elle se déplace de 2^i allant de i allant de 1 a n. Et renvoie +1 lorsque lors la dernière itération avant de sortir de la boucle, n-1-j est négatif.

    Cette fonction est plus une suite d'opération que d'un programme avec un but précis.

    Et donc dans le pire des cas T(n) = n*T(n-1) d'ou la complexité polynomiale mais c'est assez compliqué habituellement d'établir la complexité et la l'exercice semble à porter.

    Je vous remercie

  4. #4
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Citation Envoyé par tipi_11 Voir le message
    Donc dans le pire des cas la boucle while sera effectué (n-1)*(n-2) fois.
    Je n'y comprends pas grand chose en algorithmique, ce que je vois:
    Pour un N donné, le test de sortie est N-1-J>=0 avec J qui double à chaque itération.
    Les valeurs successives du test sont donc : N-1-1, N-1-2, N-1-4, .., .., N-1-2(x+1) , avec x nb d'itération du while.
    Elle s'arrête pour x tel que : N-1-2(x+1) >= 0, qui devrait se résoudre.

    Quant à la fonction, à chaque itération on passe de n à n-1, donc elle est appelée n+1 fois.

    Je vois donc un algorithme en au plus n*log(n)

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 9
    Points : 9
    Points
    9
    Par défaut
    Merci

    D'ou T(n) = C1 + log(n-1) + T(n-1) donc on peut penser a une complexité o(nlog(n)) ou C1 est le temps de l'operation n == 0;

    Si quelqu'un a la demonstration rigoureuse =-)

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    ta boucle s'arrêtera au maximum grâce à la condition (n-1-j >= 0)

    avec un indice croissant en 2j

    J'aurais donc tendance à dire que cette fonction est en log(n)...


    Exemple :

    • n = 100

      j = 1, 2, 4, 8, 16, 32, 64, 128 => FINI

      8 tours

    • n = 1000

      j = 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024 => FINI

      12 tours

    • n = 10000

      j = 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024 , 2048, 4096, 8192, 16384 => FINI

      16 tours


    donc entre 100 et 10000 on a élevé n au carré et on a fait juste 2 fois plus de boucles..
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

Discussions similaires

  1. Complexité de l'algorithme de multiplication matricielle de strassen
    Par judge06 dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 09/07/2007, 07h27
  2. Complexité de l'algorithme de multiplication de Karatsuba
    Par judge06 dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 27/03/2007, 12h02
  3. Complexité de l'algorithme de Tri Fusion
    Par judge06 dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 26/03/2007, 22h04
  4. [Complexité d'un algorithme] Triangle de Sierpinski
    Par Opérateur dans le forum Algorithmes et structures de données
    Réponses: 18
    Dernier message: 18/12/2006, 15h25
  5. 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