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

C Discussion :

Gné ?!? cherche explications


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 6
    Par défaut Gné ?!? cherche explications
    Voilà, je me demande vraiment pourquoi avec le code source ci dessous j'optiens des résultats aussi incohérents :

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    const int N= 50000;
    int i,j;
    void tri_bulle(int *tab/*,const int A*/){
    	int aux,a,b;
    	a=clock();
    	b=0;
    	for (i=N-1;i>0;i--){
    		for (j=1;j<=i;j++){
    			if (tab[j-1]>tab[j]){
    				aux=tab[j-1];tab[j-1]=tab[j];tab[j]=aux;
    				//b=1;
    			}
    		}
    		//if (b==0) i=0;
    	}
    	b=clock();
    	a=b - a;
    	printf("par bulle : %d\n",a);
    	fflush(stdout);
    }
     
    void inversion(int tab[N]){
    	for (i=0;i<N;i++){
    		j=tab[N-i];tab[N-i]=tab[i];tab[i]=j;
    	}
     
    int main(){
    	int tab[N];
    	srand(time(NULL));
    	rand();
    	saisie(tab);
    	tri_bulle(tab); inversion(tab); tri_bulle(tab); tri_bulle(tab);
    	return 0;
    }
    j'obtiens les temps suivant :
    par bulle : 18750
    par bulle : 7625
    par bulle : 7703


    le truc c'est pourquoi le programme met moins de temps à inverser un tableau qu'à seulement le parcourir ?

  2. #2
    Membre chevronné Avatar de straasha
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2004
    Messages : 149
    Par défaut
    t'es sur que ton prog marche bien deja ?
    parce dans inversion pour i==0 tu accede a tab[N] qui est hors tableau...
    en plus c'est pas jusqu'a N que i doit aller mais jusqu'a N/2 sinon tu inverse 2 fois et tu te retrouve avec le meme tableau

  3. #3
    Membre chevronné Avatar de straasha
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2004
    Messages : 149
    Par défaut
    et quand tu inverse juste le tableau, tu ne calcule pas le temps donc comment tu fais pour savoir que c'est plus lent ?
    [edit]
    je viens de comprendre, le 2e tri_bulle fait l'inversion, et le 3e ne doit rien faire puisque c'est deja trie
    donc voir mon post precedent pour ton erreur
    [/edit]

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 6
    Par défaut
    Nan je suis certain du code : c'est pour des TP qu'on fait ça et même le prof bloque sur l'explication du phénomène.

  5. #5
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    1/ le code que tu montres n'effectue pas d'inversion, donc tu fais deux fois rien du tout
    2/ as-tu verifie quel etait l'increment minimal de clock sur ta machine?
    3/ et le prof apprecie comment les variables globales n'ayant qu'un usage local?

  6. #6
    Membre chevronné Avatar de straasha
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2004
    Messages : 149
    Par défaut
    je persiste a dire que inverser tab[i] et tab[N-1-i] c'est la meme chose qu'inverser tab[N-1-i] et tab[i]
    donc si tu parcours le tableau pour i de 0 a N-1 tu inversera 2 x chaque case donc ton tableau final sera le meme qu'au debut.

  7. #7
    Membre Expert
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 013
    Par défaut
    Citation Envoyé par Hezoq
    Nan je suis certain du code : c'est pour des TP qu'on fait ça et même le prof bloque sur l'explication du phénomène.
    Les profs sont loin d'être des bibles de la programmation la plupart du temps ... (pardon aux profs compétents qui me liront)

  8. #8
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Par défaut
    Citation Envoyé par Hezoq
    Nan je suis certain du code : c'est pour des TP qu'on fait ça et même le prof bloque sur l'explication du phénomène.
    Je parle d'expérience: le prof n'est pas dieu et ne peut pas trouver automatiquement les erreurs

    Autre chose, en informatique, tu ne peux être certain du code.
    Et si ça ne marche pas, c'est que ton code n'est pas bon

    Finalement... ta question, « pourquoi le programme met moins de temps à inverser un tableau qu'à seulement le parcourir ? » n'est pas assez précise.
    Veux tu dire pourquoi il met moins de temps à inverser plutôt qu'à trier ?
    Tu ne calcules pas le temps de l'inversion. Sur quoi te bases tu ?

    Mais bon si c'est ça, tu as une simple boucle pour l'inversion (complexité linéaire) et une double pour le tri (complexité quadratique). Il est donc normal que l'inversion soit plus rapide que le tri.

  9. #9
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par Hezoq
    Nan je suis certain du code : c'est pour des TP qu'on fait ça et même le prof bloque sur l'explication du phénomène.
    Hmm. Un prof qui enseigne le tri à bulle (bubble sort), c'est un peu inquiétant. Les auteurs des Numerical Recipes sont très clairs au sujet de cet algorithme:
    Citation Envoyé par Numerical Recipes Section 8.0
    If you know what bubble sort is, wipe it from your mind; if you don't, make a point of never finding out!

  10. #10
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 6
    Par défaut
    je vous remercie tous grandement de vos réponses, mais j'ai plusieurs remarques à faire sur celle-ci :

    1er : effectivement si mon algo d'inversion n'inversait pas, j'obtenait logiquement des résultats incohérents (ça m'apprendra à pas vérifier chacun de mes algos)
    2nd : le prof n'est effectivement pas une bible ni dieu, mais il est un jeune enseignant qui sort tout juste de mon école (le programme scolaire est donc encore frais dans sa tete).
    3me : c'est pas qu'on aprends le bubble sort en particulier, c'est qu'on le vois parmis d'autre afin d'étudier parallèlement la complexité des algos. (personnellemet, des algos de tri qu'on a vu mon préféré est le merge sort)

  11. #11
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Hezoq
    Voilà, je me demande vraiment pourquoi avec le code source ci dessous j'optiens des résultats aussi incohérents :
    <...>
    le truc c'est pourquoi le programme met moins de temps à inverser un tableau qu'à seulement le parcourir ?
    Dejà, il faudrait travailler sur du code lisible et un algorithme correct. Ensuite, il suffit de poser quelques traces pour comprendre ce qui se passe :
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    swap_i (int *a, int *b)
    {
       int t = *a;
       *a = *b;
       *b = t;
    }
     
    /* http://en.wikipedia.org/wiki/Bubble_sort */
    void tri_bulle (int *tab, int n)
    {
       int a = clock ();
       int swapped;
       unsigned long count = 0;
       printf ("tri en cours ...");
       fflush (stdout);
       do
       {
          int i;
          swapped = 0;
          n--;
          for (i = 0; i < n; i++)
          {
             if (tab[i] > tab[i + 1])
             {
                swap_i (tab + i, tab + i + 1);
                swapped = 1;
                count++;
             }
          }
       }
       while (swapped);
     
       printf ("\rtri bulle : %ld (%lu swap%s)\n", clock () - a, count,
               count > 1 ? "s" : "");
    }
     
    void inversion (int tab[], int n)
    {
       int i;
       for (i = 0; i < n - 1; i++)
       {
          swap_i (tab + i, tab + i + 1);
       }
    }
     
    void init (int tab[], int n)
    {
       int i;
       for (i = 0; i < n; i++)
       {
          tab[i] = (rand () / (double) RAND_MAX) * 100;
       }
    }
     
    void aff (int const tab[], int n)
    {
       int i;
       for (i = 0; i < n; i++)
       {
          printf ("%4d", tab[i]);
       }
    }
     
    int main (void)
    {
    #define N 50000
     
       static int tab[N];
       srand (time (NULL));
       rand ();
       init (tab, N);
       aff (tab, 20);
       tri_bulle (tab, N);
       aff (tab, 20);
       inversion (tab, N);
       aff (tab, 20);
       tri_bulle (tab, N);
       aff (tab, 20);
       tri_bulle (tab, N);
       aff (tab, 20);
       return 0;
    }

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

Discussions similaires

  1. [Toutes versions] cherche explication sur declaration
    Par patricktoulon dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 15/09/2010, 15h36
  2. [multisampling] cherche explication simple
    Par jcloupgarou dans le forum OpenGL
    Réponses: 55
    Dernier message: 21/12/2006, 15h57
  3. Débutant : cherche explications environnement delphi 2005
    Par tremeur53 dans le forum Débuter
    Réponses: 3
    Dernier message: 22/10/2006, 18h03
  4. cherche explication sur du code
    Par abdoulzak dans le forum Langage
    Réponses: 1
    Dernier message: 06/07/2006, 10h23

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