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

Caml Discussion :

[OCaml] Complexité et temps d'exécution


Sujet :

Caml

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2006
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 41
    Points : 31
    Points
    31
    Par défaut [OCaml] Complexité et temps d'exécution
    Salut à tous,
    comme à chaque fois que j'ai eu un problème il a été réglé en deux coups de cuillère à pot grace à vos réponses, je me tourne une nouvelle fois vers vous
    J'ai codé deux fonctions en Caml, et j'aimerais connaître leur complexité et temps d'exécution... Seulement voilà, je ne sais pas du tout comment faire...
    Voici les fonctions :
    - Calcul du n-ième terme de Fibonacci en récursif
    - Même chose en impératif
    Si vous pouviez m'expliquer la complexité (et comment calculer cette complexité...) ne serait-ce que d'une fonction, ça m'aiderait beaucoup pour la suite :-)
    Merci d'avance, bonne soirée à tous,
    bye

  2. #2
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Pourrais-tu nous donner le code de tes 2 fonctions afin que nous puissions répondre, stp?

    Ceci est un cas d'école: l'une des deux fonctions devrait normalement avoir une complexité en O(n) alors que l'autre (mal programmée) devrait avoir une complexité en O(n^2).
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  3. #3
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Il serait intéressant que tu consultes cette page http://www-id.imag.fr/Laboratoire/Me...urs/node6.html

    Tu voulais sans doute dire en "itératif" et non pas "impératif"
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  4. #4
    Membre expérimenté Avatar de alexrtz
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2003
    Messages
    639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2003
    Messages : 639
    Points : 1 359
    Points
    1 359
    Par défaut
    Salut,

    Complexité de Fibonacci en récursif : http://www.lirmm.fr/~bodini/CAA/coursCAAC4.pdf

    Pour l'itératif, c'est du o(n).

    Calcul de temps en Caml avec enregistrement dans un fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    let test fichier =
      let f = open_out fichier  and 
        n = ref 0 in
      while !n <= 50 do
          t1 = Unix.times () in
        fonction_a_tester n;
        let t2 = Unix.times () in
        Printf.fprintf f "%d %e\n" !n (t2.Unix.tms_utime -.
    				     t1.Unix.tms_utime);
        n := !n + 5
      done;
      close_out f;;
    où n est ce qui doit faire augmenter le temps (par exemple le rang dans Fibonacci).

    Chaque ligne du fichier de sortie est de la forme :
    n temps
    ce qui permet de tracer facilement des courbes avec xgraphic ou autre.
    "Je suis incapable d'expliquer ce qui se passa ensuite : je lâchai quelque chose, quelque chose à quoi je m'agrippais depuis toujours sans m'en rendre compte. Je m'enfonçais dans une obscurité chaude, moelleuse et protectrice, tandis qu'un loup montait la garde par mes propres yeux."

  5. #5
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    967
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 967
    Points : 1 410
    Points
    1 410
    Par défaut
    Citation Envoyé par pcaboche
    Ceci est un cas d'école: l'une des deux fonctions devrait normalement avoir une complexité en O(n) alors que l'autre (mal programmée) devrait avoir une complexité en O(n^2).
    Oui, mais j'espère qu'il djunityfr ne l'a pas codé comme ça. OCaml est beaucoup plus joli en récursif, et avoir une complexité linéaire en récursif est très simple. Pour peu que ce soit terminal, ce sera au moins aussi rapide que l'itératif.

    Si vous pouviez m'expliquer la complexité (et comment calculer cette complexité...) ne serait-ce que d'une fonction, ça m'aiderait beaucoup pour la suite :-)
    La question à se poser, c'est : combien de fois il faut "boucler" pour calculer fibo n ?


    Edit : j'avais pas vu la date. Je pensais que ce forum était plus vivant. ^^

  6. #6
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par LLB
    Edit : j'avais pas vu la date. Je pensais que ce forum était plus vivant. ^^
    En même temps, on ne reçoit pas énormément de questions concernant Caml...
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  7. #7
    Expert éminent
    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
    Points : 8 586
    Points
    8 586
    Par défaut
    C'est parce que le langage est tellement simple et puissant qu'aucun de ses utilisateurs n'a besoin de poser de questions !!
    Blague à part, c'est sans doute parce que les gens qui ont une question cherchent un forum OCaml et ne le trouve pas (la principale raison restant bien sûr la quantité fort restreinte de programmeurs OCaml, surtout passant sur Developpez.com qui est à vocation professionnelle, ce qui explique qu'on ait pas de forum OCaml... cercle vicieux).

    --
    Jedaï

  8. #8
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Citation Envoyé par rurouni alex
    Complexité de Fibonacci en récursif : http://www.lirmm.fr/~bodini/CAA/coursCAAC4.pdf

    Pour l'itératif, c'est du o(n).

    Désolé, le post est super vieux, mais je cherchais quelque chose et je suis tombé là dessus. Je comprend pas comment ils sortent cette complexité, ils parlent de taille d'instance, mais on dirait qu'ils ont oublié qu'un entier n en machine est de taille log_2 n. Ce qui fait que toutes les complexités sont fausses A moins de considèrer que la taille de l'instance est égale à l'instance... ce qui serait suspect. A moins que ce soit pour simplifier
    Je ne répondrai à aucune question technique en privé

  9. #9
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Ici, la complexité linéaire est en nombre de calcul. Plutôt de recalculer des termes déjà calculés, le calcul de fibo va se faire en calculant Fn et Fn+1 (ou Fn et Fn-1 suivant la méthode). Par ce fait on calcule Fn en n itérations.

  10. #10
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    En fait, j'avais craqué. Mais je peux plus revoir le lien, le serveur a l'air temporairement out.
    Je ne répondrai à aucune question technique en privé

  11. #11
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Citation Envoyé par millie
    En fait, j'avais craqué. Mais je peux plus revoir le lien, le serveur a l'air temporairement out.

    on a cru comprendre...


    en revanche, en lisant ce post, il semblerait qu'il y ait confusion entre itératif et impératif



    Citation Envoyé par wikipedia
    la programmation impérative est un paradigme de programmation qui décrit les opérations en termes d'états du programme et de séquences d'instructions exécutées par l'ordinateur pour modifier l'état du programme.
    http://fr.wikipedia.org/wiki/Program...mp%C3%A9rative

    on est donc sur la conception du programme...


    alors qu'itérative est plus proche de la forme sous laquelle il est codé...


    d'ailleurs, il est possible (avec les optimisations) d'avoir un code récursif plus performant et de même complexité que le code itératif traditionnel... en raison des tail-calls, ce qui ne serait pas forcemment possible sur le code itératif qui gère trop de détails lui-même

    nb: ceci est faux si les optimisations utilisent les pattern-matching, auquel cas il y aura substitution des deux codes, par un code "connu" du compilo et hyper-agressif
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  12. #12
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Citation Envoyé par gorgonite
    d'ailleurs, il est possible (avec les optimisations) d'avoir un code récursif plus performant et de même complexité que le code itératif traditionnel...

    Maple intègre des mécanismes de programmation dynamique permettant d'éviter ce genre de chose. C'est à dire que si f(x) a été calculé une fois pendant la récursion. Il ne sera pas récalculé une seconde fois. Ce qui permet de rivaliser niveau vitesse

    on a cru comprendre...
    En fait, pour me défendre.

    Si n est l'instance d'entrée, la complexité est en O(n).
    Mais de manière formelle, la fonction complexité prenant en entrée la taille d'une instance est : f : n ->R est en O(exp(n)) où n, n'est plus ici l'instance, mais la taille de l'instance.
    Je ne répondrai à aucune question technique en privé

  13. #13
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Citation Envoyé par millie
    Maple intègre des mécanismes de programmation dynamique permettant d'éviter ce genre de chose. C'est à dire que si f(x) a été calculé une fois pendant la récursion. Il ne sera pas récalculé une seconde fois. Ce qui permet de rivaliser niveau vitesse

    il stocke dans une table... procédé très coûteux en mémoire, sans grand intérêt si on compile
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

Discussions similaires

  1. Réponses: 1
    Dernier message: 24/02/2009, 21h31
  2. [Turbo Pascal] Mesure du temps d'exécution / Complexité
    Par egrand dans le forum Turbo Pascal
    Réponses: 6
    Dernier message: 21/02/2009, 12h17
  3. Réponses: 2
    Dernier message: 25/05/2004, 15h33
  4. Affichage du temps d'exécution d'une requête
    Par milka dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 22/03/2004, 17h48
  5. Temps d'exécution des instructions FPU
    Par ubi dans le forum Assembleur
    Réponses: 2
    Dernier message: 24/10/2003, 18h39

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