Partage
  • Partager sur Facebook
  • Partager sur Twitter

Tableau, élément le plus fréquent

    20 décembre 2009 à 10:53:36

    Bonjour,

    Je n'arrive pas à trouver de solution :

    Je veux à partir d'un tableau de 10 entiers trouver quel est l'entier qui a été rentré le plus souvent (ex : 6 2 3 6 5 4 2 6 8 9 c'est 6 ici )

    Merci d'avance.
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      20 décembre 2009 à 10:58:09

      Y'a un exercice similaire sur Prologin mais sauf que c'est avec des char* ^^
      D'ailleurs si la solution est trouvée ici, alors tu peux faire un challenge de Prologin :p
      • Partager sur Facebook
      • Partager sur Twitter
        20 décembre 2009 à 11:03:12

        Eh bien tu fais un tableau de 10 compteurs, un pour chaque entier, tu parcours ton tableau de chiffres, et tu incrémentes le compteur correspondant au chiffre actuel. C'est très simple, et aussi très optimisable. ;)
        • Partager sur Facebook
        • Partager sur Twitter
          20 décembre 2009 à 11:24:46

          Citation : Lunaro

          Eh bien tu fais un tableau de 10 compteurs, un pour chaque entier, tu parcours ton tableau de chiffres, et tu incrémentes le compteur correspondant au chiffre actuel. C'est très simple, et aussi très optimisable. ;)


          Cette méthode fonctionne bien, si on connait la valeur maximale présente dans le tableau et que cette valeur n'est pas trop grande.

          Une autre solution est de trier le tableau, et ensuite de le parcourir à la recherche de la plus grande séquence de valeurs identiques consécutives...
          • Partager sur Facebook
          • Partager sur Twitter
          Zeste de Savoir, le site qui en a dans le citron !
            20 décembre 2009 à 14:09:57

            Merci à vous.

            J'aimerais le faire avec plus de valeurs aussi, j'ai donc pris la deuxième option proposée, ça m'a pris la matinée pour faire ce satané tri de tableau. J'arrive pas à savoir comment vérifier quelle séquence est la plus longue et en tirer l'élément correspondant.

            Voila pour le tri :

            #include <stdio.h>
            #include <stdlib.h>
            
            int main ()
            {
                int N = 0, i = 0, j =0, k = 0;
                printf("Entrez le nombre de valeurs que vous souhaitez classer : ");
                scanf("%d", &N);
                int tableau[N];
            
                printf("\nEntrez vos valeurs :\n\n");
            
            for(i = 0; i<N ; i++)
            {
                    printf("tableau[%d] : ", i);
                    scanf("%d", &tableau[i]);
            }
            
            for(i = 0; i<N; i++)
            {
                for(j = i+1; j < N; j++)
                {
                    if(tableau[j] < tableau[i])
                    {
                        k = tableau[i];
                        tableau[i] = tableau[j];
                        tableau[j] = k;
                    }
                }
            }
            
            printf("\n");
            for(i = 0; i < N; i++)
            {
                printf("%d , ", tableau[i]);
            }
            
            return 0;
            }
            


            Merci de m'aider.
            • Partager sur Facebook
            • Partager sur Twitter
              20 décembre 2009 à 15:18:20

              Attention à ta déclaration de tableau, il me semble qu'en C il faut passer par une allocation dynamique pour allouer un tableau de taille non fixe ^^
              Ton tri semble bon à première vue mais il est quadratique. Ce n'est pas mauvais du tout pour un tableau petit, mais si tu veux, et si tu aimes le récursif, je peux te montrer comment l'améliorer un peu ;)
              Enfin, pour ta séquence, cela va t'obliger à parcourir tout ton tableau. En gros, initialise quelques variables : une pour stocker la valeur de la plus grande séquence trouvée, une autre pour stocker la taille de la séquence en question, et une autre qui va te servir à compter la taille de chaque nouvelle séquence. Tu compares à chaque fin de séquence et tu gardes la valeur la plus grande :)
              Cela améliore sans aucun doute la complexité spatiale de l'algorithme mais certainement pas la temporelle o_O
              Si tu es sur un pc, je pense que la première méthode est tout aussi efficace, et probablement plus rapide.
              Euh ce n'est pas très clair si tu veux plus d'explications tu peux demander je suis un peu pressé :p
              • Partager sur Facebook
              • Partager sur Twitter
                21 décembre 2009 à 0:20:23

                Tout d'abord merci a toi CokieForever mais j'ai vraiment du mal à traduire ce que tu m'expliques en langage c.

                J'ai passé cet exercice et je viens d'y revenir, je suis arrivé à ça :

                #include <stdio.h>
                #include <stdlib.h>
                
                int main ()
                {
                    int tableau[5], i = 0, j = 0, k = 0;
                    int compteur[5] = {0};
                
                    tableau[0] =  5;
                    tableau[1] =  2;
                    tableau[2] =  3;
                    tableau[3] =  5;
                    tableau[4] =  5;
                
                for(j = 0; j < 5; j++)
                {
                    for(i = 0; i < 5; i++)
                    {
                        if(tableau[j] == tableau[i])
                        {
                            compteur[j]++;
                        }
                    }
                }
                
                for(i = 0; i<5; i++)
                {
                    for(j = i+1; j < 5; j++)
                    {
                        if(compteur[j] < compteur[i])
                        {
                            k = compteur[i];
                            compteur[i] = compteur[j];
                            compteur[j] = k;
                        }
                    }
                }
                
                printf("%d", compteur[4]);
                
                
                return 0;
                }
                



                Comme vous le voyez ce prog affiche la frequence d'apparition du chiffre qui a été rentré le plus souvent.

                Je bloque! :D
                • Partager sur Facebook
                • Partager sur Twitter
                  21 décembre 2009 à 2:23:43

                  Vu l'heure, je poste juste pour un erratum... Je t'aiderais demain ;)
                  En fait, tous calculs faits, la première méthode et la deuxième se valent. La première a le désavantage de consommer beaucoup au niveau mémoire mais peut être incroyablement plus rapide que la seconde dans le cas de tableaux contenant des éléments peu différents les uns des autres. Un calcul rapide donne de toutes façons dans le pire des cas pour chaque algorithme : un quadratique plus un linéaire (je l'ai fait rapidement comme ça de tête désolé si je me trompe... encore xD).
                  Au vu de la tête de ton algo actuel, tu as un double quadratique o_O
                  Mais j'ai pas cherché à comprendre je suis fatigué là...
                  Il faudra que tu m'expliques ce que tu as voulu faire ;)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    21 décembre 2009 à 10:34:36

                    Si tu veux appliquer cette méthode, il faut au minimum un tri efficace.
                    La fonction qsort fera l'affaire.

                    Un fois ton tableau trié, un seul parcours de ton tableau suffit.
                    max = 0          /* Nombre d'occurrence maxi */
                    vmax = t[0]      /* Valeur du tableau la plus présente */
                    compteur = 1
                    i = 0
                    tant que i < taille tableau
                        si t[i] == t[i - 1]
                            compteur = compteur + 1
                        sinon
                            si compteur > max
                                max = compteur
                                vmax = t[i - 1]
                            compteur = 1
                       
                        i = i + 1


                    On se répète : si tes valeurs ne se trouve pas dans un intervalle trop grand, la première solution est plus adaptée.
                    La seconde tri + parcours linéaire fonctionne dans tous les cas.
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Zeste de Savoir, le site qui en a dans le citron !
                      21 décembre 2009 à 14:46:07

                      J'avoue que j'étais curieux, je l'ai donc faite :p
                      Je poste mon code ici si tu veux regarder tu peux mais rien ne t'y oblige, pour être franc, il vaudrait même mieux que tu codes tout toi-même ;)
                      Voici des explications plus détaillées si tu es largué et que tu ne sais vraiment pas comment t'y prendre !

                      La deuxième méthode est la plus simple à comprendre. C'est donc celle que j'explique ici.
                      En premier lieu, il s'agit de trier le tableau. Tu as trouvé l'algo quadratique, c'est très bien, c'était déjà assez dur comme ça. Si tes tableaux ne dépassent pas le million de valeurs je pense que ça ira :D
                      Ensuite, dans ton tableau trié, il faut que tu cherches le plus grande séquence de nombre identiques. Pour cela, il faut bien sûr le parcourir en entier (donc avant même de réfléchir tu colles ta boucle for, ça, c'est fait !). Il va te falloir plusieurs variables :
                      1) une qui va stocker la taille de la plus grande séquence trouvée, appelons-la max et initialisons-la à zéro bien sûr, aucune séquence ne pouvant avoir une taille inférieure à zéro.
                      2) une autre qui va stocker la valeur correspondant à cette plus grande séquence, appelons-la valeur, et laissons l'ordi l'initialiser !
                      3) enfin, une variable de comptage qui va servir à compter itérativement la taille de chaque séquence, appelons la tot et initialisons-la à 1 !
                      Parcourons alors notre tableau en commençant par la case n°1 (et pas 0 !).
                      A l'étape n, on compare la case n avec la case n-1 : si les valeurs sont identiques, on incrémente gentiment tot. Si elles sont différentes, c'est que l'on a une nouvelle séquence ! Donc on regarde la valeur de tot et on la compare à max, si max est plus petit, alors le maximum est maintenant tot, donc on affecte la valeur de tot à max. Et on n'oublie pas de remettre tot à 1 et de stocker la nouvelle valeur de valeur.
                      Et c'est reparti... jusqu'à atteindre la case après la dernière case du tableau. A ce moment-là, surtout ne pas chercher la valeur de la case (segfault assuré !) mais tout faire comme si les cases n-1 et n étaient différentes, càd comme s'il s'agissait d'une fin de séquence (et pour cause, c'en est une !).
                      Et on sort de la boucle, et hop ! c'est bon !

                      Pour plus de concret, regarde mon code plus bas (fonction Compteur2() ), les variables utilisées sont les mêmes ;)
                      Tu verras que la première méthode est aussi implémentée, et que tu as aussi droit à un nouvel algorithme de tri, utilisant la méthode dite de la division pour régner. En vérité, ce genre de truc n'est guère avantageux en C où une allocation est nécessaire. Mais dans certains cas (tableaux très grands !), ou dans d'autres langages, cela peut se révéler infiniment plus rapide, et en général ce n'est pas plus lent :)

                      Code
                      #include <stdio.h>
                      #include <stdlib.h>
                      
                      int TriIteratif(char tab[], int taille);
                      int TriRecursif(char tab[], int taille);
                      int TriFusion(char tab1[], int taille1, char tab2[], int taille2);  //ne pas utiliser directement, ce n'est pas une fonction de tri !
                      
                      int Compteur1(char tab[], int taille, int *valeurMax, int *tailleSeqMax);
                      int Compteur2(char tab[], int taille, int *valeurMax, int *tailleSeqMax);
                      
                      
                      int main()
                      {
                          int i, taille;
                          char *tab;
                      
                          do
                          {
                              system("cls");
                              printf("Quelle est la taille de votre tableau ? ");
                              scanf("%d", &taille);
                          } while (taille<=0);
                      
                          printf("\n");
                          tab = malloc(taille);
                      
                          for (i=0 ; i<taille ; i++)
                          {
                              printf("Case %d : ", i);
                              scanf("%d", tab+i);
                          }
                      
                          system("cls");
                          printf("Valeurs entrees, recapitulatif :\n");
                          for (i=0 ; i<taille ; i++)
                              printf("%d ", tab[i]);
                      
                          printf("\n\nComptage en cours...");
                          int valeur, max;
                          Compteur1(tab, taille, &valeur, &max);
                      
                          printf("\nTermine ! Bilan :\nLe chiffre le plus present est le %d.\nIl apparait %d fois.\n\n", valeur, max);
                          free(tab);
                      
                          return 0;
                      }
                      
                      
                      int TriIteratif(char tab[], int taille)
                      {
                          if (taille <= 0 || !tab)
                              return 0;
                      
                          int i,j,temp;
                          for (i=0 ; i<taille ; i++)
                          {
                              for (j=i+1 ; j<taille ; j++)
                              {
                                  if (tab[i]>tab[j])
                                  {
                                      temp = tab[i];
                                      tab[i]=tab[j];
                                      tab[j]=temp;
                                  }
                              }
                          }
                      
                          return 1;
                      }
                      
                      int TriRecursif(char tab[], int taille)
                      {
                          if (taille < 0 || !tab)
                              return 0;
                      
                          if (taille <= 1)
                              return 1;
                      
                          int nTaille1 = taille/2,
                              nTaille2 = taille-nTaille1;
                      
                          TriRecursif(tab, nTaille1);
                          TriRecursif(tab+nTaille1, nTaille2);
                      
                          TriFusion(tab, nTaille1, tab+nTaille1, nTaille2);
                          return 1;
                      }
                      
                      int TriFusion(char tab1[], int taille1, char tab2[], int taille2)
                      {
                          if (!tab1 || taille1<0 || !tab2 || taille2<0)
                              return 0;
                      
                          if (taille2==0)
                              return 1;
                          else if (taille1==0)
                          {
                              memcpy(tab1, tab2, taille2);
                              return 1;
                          }
                      
                          char *nTab = malloc(taille1+taille2);
                          if (!nTab)
                              return 0;
                      
                          int i,j=0,k=0;
                          for (i=0 ; i<taille1+taille2 ; i++)
                          {
                              if (j<taille1 && (k>=taille2 || tab1[j]<tab2[k]))
                              {
                                  nTab[i] = tab1[j];
                                  j++;
                              }
                              else
                              {
                                  nTab[i] = tab2[k];
                                  k++;
                              }
                          }
                      
                          memcpy(tab1, nTab, taille1+taille2);
                          free(nTab);
                      
                          return 1;
                      }
                      
                      int Compteur1(char tab[], int taille, int *valeurMax, int *tailleSeqMax)
                      {
                          if (!tab || taille<=0)
                              return 0;
                          if (!valeurMax && !tailleSeqMax)
                              return 0;
                      
                          char *tab2 = malloc(taille*2);
                          if (!tab2)
                              return 0;
                          memset(tab2, 0, taille*2);
                      
                          int i,j;
                          for (i=0 ; i<taille ; i++)
                          {
                              j=0;
                              while (tab2[2*j+1] && tab2[2*j] != tab[i])
                                  j++;
                      
                              tab2[2*j+1]++;
                              tab2[2*j] = tab[i];
                          }
                      
                          int max = tab2[1],
                              valeur = tab[0];
                          for (i=1 ; i<taille ; i++)
                          {
                              if (max<tab2[2*i+1])
                              {
                                  max = tab2[2*i+1];
                                  valeur = tab2[2*i];
                              }
                          }
                      
                          if (tailleSeqMax)
                              *tailleSeqMax = max;
                          if (valeurMax)
                              *valeurMax = valeur;
                      
                          free(tab2);
                          return 1;
                      }
                      
                      int Compteur2(char tab[], int taille, int *valeurMax, int *tailleSeqMax)
                      {
                          if (!tab || taille<=0)
                              return 0;
                          if (!valeurMax && !tailleSeqMax)
                              return 0;
                      
                          TriIteratif(tab, taille);
                      
                          int i,tot=1,max=0,valeur;
                          for (i=1 ; i<=taille ; i++)
                          {
                              if (i==taille || tab[i] != tab[i-1])
                              {
                                  if (max<tot)
                                  {
                                      max = tot;
                                      valeur = tab[i-1];
                                  }
                                  tot = 1;
                              }
                              else tot++;
                          }
                      
                          if (valeurMax)
                              *valeurMax = valeur;
                          if (tailleSeqMax)
                              *tailleSeqMax = max;
                      
                          return 1;
                      }
                      

                      • Partager sur Facebook
                      • Partager sur Twitter
                        21 décembre 2009 à 15:01:08

                        Très pédagogue, CokieForever ;)
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Zeste de Savoir, le site qui en a dans le citron !
                          21 décembre 2009 à 21:06:01

                          Waaw excellente explication CokieForever, merci beaucoup, je vais essayer de faire le prog juste avec tes explications, sans voir le code, je pense y arriver.
                          Merci encore!
                          • Partager sur Facebook
                          • Partager sur Twitter
                            21 décembre 2009 à 22:44:33

                            Citation : Jokerplz

                            Bonjour,

                            Je n'arrive pas à trouver de solution :

                            Je veux à partir d'un tableau de 10 entiers trouver quel est l'entier qui a été rentré le plus souvent (ex : 6 2 3 6 5 4 2 6 8 9 c'est 6 ici )

                            Merci d'avance.



                            Tout le monde a quand même oublié de te dire qu'il existe une solution plus ou moins évidente basée sur deux boucles imbriquées et ne nécessitant pas de trier le tableau. Ça s'écrit tout compris en moins de trente lignes.

                            CokieForever : ta contribution est fort sympathique mais je ne suis pas certain que le PO ait besoin d'autant de complexité pour un problème aussi simple. Par ailleurs, ton code contient un Warning assez embêtant que je te laisse le soin de corriger.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              22 décembre 2009 à 3:04:26

                              Euh pour ton algo de trente lignes moi il m'intéresse ! Et à mon avis le PO aussi :D
                              Pourquoi tu ne l'as pas posté ?
                              Par contre si tu pouvais éviter de mettre des mots comme "solution évidente" ça peut blesser des gens... moi par exemple ! ^^"


                              Citation : Jokerplz

                              Waaw excellente explication CokieForever, merci beaucoup, je vais essayer de faire le prog juste avec tes explications, sans voir le code, je pense y arriver.
                              Merci encore!


                              Mais de rien ! :)
                              Et surtout bonne chance ! ;)
                              • Partager sur Facebook
                              • Partager sur Twitter
                                22 décembre 2009 à 4:39:54

                                Citation : candide


                                Tout le monde a quand même oublié de te dire qu'il existe une solution plus ou moins évidente basée sur deux boucles imbriquées et ne nécessitant pas de trier le tableau. Ça s'écrit tout compris en moins de trente lignes.



                                Tu penses à cette solution ?
                                #include <stdio.h>
                                
                                #define N   10
                                int main(void)
                                {
                                    int t[N] = {6, 2, 3, 6, 5, 4, 2, 6, 8, 9};
                                
                                    int i, j;
                                    /* Valeur la plus présente */
                                    int vmax = t[0];
                                    /* Nombre d'occurrences de la valeur la plus présente */
                                    int max = 0;
                                    
                                    for(i = 0; i < N - 1; ++i)
                                    {
                                        int cpt = 1;
                                        for(j = i + 1; j < N ; ++j)
                                        {
                                            if(t[j] == t[i])
                                                cpt++;
                                        }
                                        if(cpt > max)
                                        {
                                            max =  cpt;
                                            vmax = t[i];
                                        }
                                    }
                                
                                    printf("%d %d", max, vmax);
                                
                                    return 0;
                                }
                                

                                • Partager sur Facebook
                                • Partager sur Twitter
                                Zeste de Savoir, le site qui en a dans le citron !
                                  22 décembre 2009 à 9:40:47

                                  Instructif ce post, ainsi que les diverses réponses donnees.
                                  Pour ma part je vais étudier les codes proposes
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    22 décembre 2009 à 10:10:35

                                    Citation : GurneyH



                                    Tu penses à cette solution ?



                                    Absolument.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      22 décembre 2009 à 11:44:12

                                      Citation : candide

                                      Citation : GurneyH



                                      Tu penses à cette solution ?



                                      Absolument.


                                      J'avoue que je n'y avais pas pensé avant que tu ne parles des 2 boucles imbriquées... :-°
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Zeste de Savoir, le site qui en a dans le citron !
                                        22 décembre 2009 à 11:55:51

                                        Après, ça dépend de la complexité qu'on veut. Cet algorithme est en O(n^2) alors qu'un tri puis une "recherche séquentielle" peut être en O(n * log2(n)) (la recherche séquentielle s'écrase par rapport au tri).
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          22 décembre 2009 à 12:11:06

                                          Hmm je suis pas d'accord la recherche séquentielle tu parcoures N fois ton tableau donc la complexité est en O(N) pas O(N2)
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            22 décembre 2009 à 12:53:02

                                            @Pouet_Forever : C'est bien ce que dit Alienore, non ? o_O
                                            Pour le O(n^2), je pense qu'il parle de la solution avec 2 boucles imbriquées.

                                            Sinon, du coup j'ai continué à chercher, et sur la base d'un tableau trié, on peut faire le parcours suivant

                                            #include <stdio.h>
                                            #include <stdlib.h>
                                            int cmp(void const *a, void const *b)
                                            {
                                                const int pa = *(const int*)a;
                                                const int pb = *(const int*)b;
                                                if (pa < pb) return -1;
                                                if (pa > pb) return 1;
                                                return 0;
                                            }
                                            int main(void)
                                            {
                                                int t[] = {6, 2, 3, 6, 5, 4, 2, 6, 8, 9};
                                                size_t n = sizeof t / sizeof *t;
                                                size_t i;
                                                /* Valeur la plus présente */
                                                int vmax;
                                                /* Nombre d'occurrences de la valeur la plus présente */
                                                int max = 1;
                                            
                                                qsort(t, n ,sizeof *t, cmp);
                                            
                                                vmax = t[0];
                                                for (i = 1; i < n; i++)
                                                    if (t[i] == t[i - max])
                                                    {
                                                        max++;
                                                        vmax = t[i];
                                                    }
                                            
                                                printf("%d %d", max, vmax);
                                            
                                                return 0;
                                            }
                                            


                                            Le parcours linéaire suivant est plus élégant que ce que j'avais proposé en pseudo-code.

                                            edit: correction de l'erreur signalée par Alienore.
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                            Zeste de Savoir, le site qui en a dans le citron !
                                              22 décembre 2009 à 13:28:54

                                              Ah j'ai dû mal comprendre alors ^^
                                              Autant pour moi ^^
                                              Et désolé :D
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                23 décembre 2009 à 16:39:54

                                                (l'expression, c'est "au temps pour moi" :P)
                                                Sinon, ce que j'ai dit est que "n * log2(n) + n" équivaut à "n * log2(n)" quand n tend vers l'infini.

                                                Sinon, pourquoi ne pas affecter la variable vmax d'une valeur du tableau après le tri ? (et pourquoi ne pas l'initialiser à la première case ?)
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  23 décembre 2009 à 21:13:04

                                                  :p « Au temps pour moi » est une locution exprimant la reconnaissance d'une erreur de la part du locuteur. On rencontre couramment la graphie « autant pour moi », que, selon l'Académie française, « rien ne justifie[1] », mais qui est défendue par certains hommes de lettres[2] et certains grammairiens[3]. (wikipedia)
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    24 décembre 2009 à 3:48:43

                                                    Citation : Alienore


                                                    Sinon, pourquoi ne pas affecter la variable vmax d'une valeur du tableau après le tri ? (et pourquoi ne pas l'initialiser à la première case ?)


                                                    :-°
                                                    Effectivement, c'est bien plus logique(et juste...).
                                                    J'édites.
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                    Zeste de Savoir, le site qui en a dans le citron !
                                                      24 décembre 2009 à 19:09:09

                                                      Citation : GurneyH


                                                      Effectivement, c'est bien plus logique(et juste...).
                                                      J'édites.



                                                      Puisqu'on en est aux rectificatifs, dans ton code ci-dessous

                                                      Citation : GurneyH

                                                      #include <stdio.h>
                                                      
                                                      #define N   10
                                                      int main(void)
                                                      {
                                                          int t[N] = {6, 2, 3, 6, 5, 4, 2, 6, 8, 9};
                                                      
                                                          int i, j;
                                                          /* Valeur la plus présente */
                                                          int vmax = t[0];
                                                          /* Nombre d'occurrences de la valeur la plus présente */
                                                          int max = 0;
                                                          
                                                          for(i = 0; i < N - 1; ++i)
                                                          {
                                                              int cpt = 1;
                                                              for(j = i + 1; j < N ; ++j)
                                                              {
                                                                  if(t[j] == t[i])
                                                                      cpt++;
                                                              }
                                                              if(cpt > max)
                                                              {
                                                                  max =  cpt;
                                                                  vmax = t[i];
                                                              }
                                                          }
                                                      
                                                          printf("%d %d", max, vmax);
                                                      
                                                          return 0;
                                                      }
                                                      




                                                      il est plus efficace de déplacer le if qui se trouve aux lignes 22-26 et de le mettre tout au fond de la 2ème boucle comme ceci (au passage j'ai changé la place de la variable j) :


                                                      <citation rid="4479154"><code type="c">#include <stdio.h>
                                                      
                                                      #define N   10
                                                      int main(void)
                                                      {
                                                          int t[N] = {6, 2, 3, 6, 5, 4, 2, 6, 8, 9};
                                                      
                                                          int i;
                                                          /* Valeur la plus présente */
                                                          int vmax = t[0];
                                                          /* Nombre d'occurrences de la valeur la plus présente */
                                                          int max = 0;
                                                      
                                                          for (i = 0; i < N - 1; ++i)
                                                          {
                                                              int cpt = 1;
                                                              int  j;
                                                              for (j = i + 1; j < N ; ++j)
                                                              {
                                                                  if (t[j] == t[i])
                                                                  {
                                                                      cpt++;
                                                                      if (cpt > max)
                                                                      {
                                                                          max =  cpt;
                                                                          vmax = t[i];
                                                                      }
                                                                  }
                                                              }
                                                      
                                                          }
                                                      
                                                          printf("%d %d", max, vmax);
                                                      
                                                          return 0;
                                                      }
                                                      </code>
                                                      



                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        25 décembre 2009 à 11:20:25

                                                        Citation : candide


                                                        il est plus efficace de déplacer le if qui se trouve aux lignes 22-26 et de le mettre tout au fond de la 2ème boucle comme ceci (au passage j'ai changé la place de la variable j) :



                                                        Tu es certain, que c'est plus efficace de mettre ce test dans la seconde boucle ? Je n'ai pas encore testé...
                                                        Pour la déclaration de la variable j, d'accord, c'est mieux de la rapprocher de sa définition, mais je suis devenu méfiant avec les déclarations dans les boucles! Il y a quelques temps, j'avais un programme(c++), qui utilisait un objet string que je déclarais à l'intérieur d'une boucle. En sortant la déclaration de la boucle, les perfs étaient bien meilleures!
                                                        Par contre c'est vrai, avec un type de base, le compilateur doit se débrouiller pour optimiser.

                                                        a+
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                        Zeste de Savoir, le site qui en a dans le citron !
                                                          25 décembre 2009 à 11:57:24

                                                          Dans une boucle for, la variable sera créée n fois (sauf si elle est en "static"). En dehors de la boucle for, elle sera créée une fois.
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            25 décembre 2009 à 20:26:35

                                                            Citation : GurneyH


                                                            Tu es certain, que c'est plus efficace de mettre ce test dans la seconde boucle ?



                                                            Tu as raison, ta version initiale est préférable.
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              25 décembre 2009 à 22:43:41

                                                              Citation : candide


                                                              Tu as raison, ta version initiale est préférable.


                                                              C'est ce qu'il me semblait. ;) Toujours pas testé :p
                                                              Dans les 2 cas, de toutes manières, c'est lent.
                                                              Pour résumer, je n'ai pas trouvé mieux que tri + parcours linéaire...
                                                              Un algorithme efficace à proposer?
                                                              • Partager sur Facebook
                                                              • Partager sur Twitter
                                                              Zeste de Savoir, le site qui en a dans le citron !

                                                              Tableau, élément le plus fréquent

                                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                              • Editeur
                                                              • Markdown