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 :

Recherche dichotomique en C pour insertion


Sujet :

C

  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 139
    Par défaut Recherche dichotomique en C pour insertion
    Bonjour je cherche une solution pour mon programme c:
    je n'arrive pas à trouver la position d'insertion d'un chiffre dans un tableau rangé dans un ordre croissant à l aide d une recherche dichotomique.

    voici mon code:
    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
    #include <stdio.h>
     
     
    int rech(int n,int x[10]){
    	int g=0,pos=0;
    	int d=10;
    	int trouve=0;
     
     
    	while(g<d && trouve==0)
    	{	
    		if(n>=x[((g+d)/2)])
    		{
    			g=((g+d)/2)+1;
     
    			printf("gauche %d \n",g);
    		}else if(n<x[((g+d)/2)]){
    			d=((g+d)/2)-1;	
    			printf("droit %d \n",d);
     
    		}
     
    		printf("milieu %d\n",(g+d)/2);
    	}
    	return(pos);
    }
     
     
    int main(){
     
    int tab[10] = {1, 3, 6, 15, 18, 19, 22, 24, 24, 25}	;
     
    int n,x;
     
    printf("entrez votre nombre \n");
    scanf("%d",&n);
    x=rech(n,tab);
    printf("les resultat est :%d \n",x);
     
     
    }

    si vous pouviez me donner quelques pistes car je suis un peu perdu dans mon si petit algo :'(


    Merci

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par défaut
    À vue de nez :

    Citation Envoyé par G4uthier Voir le message
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdio.h>
    
    		if(n>=x[((g+d)/2)])
    		{
    			g=((g+d)/2)+1;
    			
    			printf("gauche %d \n",g);
    		}else if(n<x[((g+d)/2)]){
    			d=((g+d)/2)-1;	
    			printf("droit %d \n",d);
    			
    		}
    Ton nombre est toujours soit supérieur ou égal, soit inférieur. Il faut partir d'un côté ou de l'autre, seulement si ton nombre est supérieur ou inférieur, puisque le cas qui t'intéresse et doit provoquer l'arrêt de la boucle est précisément celui où il est égal.

    D'autre part, tu utilises une variable « trouve », mais tu la passes jamais à un.

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    D'un autre côté, si une recherche dichotomique est utile en consultation, il ne faut pas oublier qu'elle ne suffira pas à réduire l'ordre de complexité de ton insertion: À cause du décalage causé par une insertion dans un tableau, ton insertion sera toujours en O(n).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 139
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    D'un autre côté, si une recherche dichotomique est utile en consultation, il ne faut pas oublier qu'elle ne suffira pas à réduire l'ordre de complexité de ton insertion: À cause du décalage causé par une insertion dans un tableau, ton insertion sera toujours en O(n).
    oui je sais mais le but de mon exercice est de privilégier la recherche à l'insertion .

    Merci pour ta réponse j'essaie ta solution en rentrant

  5. #5
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Par défaut
    Salut,

    Une fois j'avais un truc comme :
    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
     
     
     size_t dicosearch( int * T , size_t size  ,  int v  )
     { 
         if ( size == 0 ) return (size_t)  -1 ;
         size_t  hi = size -1 ;
         size_t  lo = 0 ;
         size_t  mid ;
         while( lo <= hi )
          { mid = ( hi + lo ) / 2 ;
    	if( v  <  T [mid] ) hi = mid-1 ;
    	else
    	if( v >  T [mid] ) lo = mid+1 ;
    	else
    	return mid ;
          }
         return (size_t) -1   ;
     }
    Ca ne marche que sur des données déjà triées.

  6. #6
    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 dj.motte Voir le message
    Une fois j'avais un truc comme :
    Ne passe pas ce test (comportement indéfini)
    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
     
    #include <stddef.h>
     
    size_t dicosearch (int *T, size_t size, int v)
    {
       if (size == 0)
          return (size_t) - 1;
       size_t hi = size - 1;
       size_t lo = 0;
       size_t mid;
       while (lo <= hi)
       {
          mid = (hi + lo) / 2;
          if (v < T[mid])
             hi = mid - 1;
          else if (v > T[mid])
             lo = mid + 1;
          else
             return mid;
       }
       return (size_t) - 1;
    }
     
    #ifdef TEST
    #include <stdio.h>
    #include <assert.h>
     
    int main (void)
    {
    #define N(a) (sizeof(a)/sizeof*(a))
       {
          int a[] = { 1 };
          assert (dicosearch (a, N (a), 1) == 0);
          assert (dicosearch (a, N (a), 0) == (size_t) - 1);
       }
     
     
       puts("P A S S E D");
       return 0;
    }
    #endif
    Un instrumentation basique du code montre qu'il y a débordement du tableau :
    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
     
    #include <stddef.h>
    #include <assert.h>
     
    size_t dicosearch (int *T, size_t size, int v)
    {
       if (size == 0)
          return (size_t) - 1;
       size_t hi = size - 1;
       size_t lo = 0;
       size_t mid;
       while (lo <= hi)
       {
          mid = (hi + lo) / 2;
          assert (mid < size);
          if (v < T[mid])
             hi = mid - 1;
          else if (v > T[mid])
             lo = mid + 1;
          else
             return mid;
       }
       return (size_t) - 1;
    }
    Valeurs de 'mid' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    mid          = 0
    mid          = 0
    mid          = 2147483647
    Assertion failed: mid < size, file C:\dev\hello\main.c, line 17
     
    This application has requested the Runtime to terminate it in an unusual way.
    Please contact the application's support team for more information.
     
    Process returned 3 (0x3)   execution time : 4.538 s
    Press any key to continue.
    Ceci fonctionne :
    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
     
    #include "ed/inc/prt.h"
     
    #include <assert.h>
    #include <stddef.h>
     
    size_t dicosearch (int *T, size_t size, int v)
    {
       if (T == NULL || size == 0)
          return (size_t) - 1;
       size_t hi = size - 1;
       size_t lo = 0;
       size_t mid = (hi + lo) / 2;
       while (mid < size && lo <= hi)
       {
          assert (mid < size);
          if (v < T[mid])
             hi = mid - 1;
          else if (v > T[mid])
             lo = mid + 1;
          else
             return mid;
          mid = (hi + lo) / 2;
       }
     
       return (size_t) - 1;
    }
     
    #ifdef TEST
    #include <stdio.h>
    #include <assert.h>
     
    int main (void)
    {
       assert (dicosearch (NULL, 1, 1) == (size_t) - 1);
       assert (dicosearch (1, 0, 1) == (size_t) - 1);
    #define N(a) (sizeof(a)/sizeof*(a))
       {
          int a[] = { 1 };
          assert (dicosearch (a, N (a), 1) == 0);
          assert (dicosearch (a, N (a), 0) == (size_t) - 1);
          assert (dicosearch (a, N (a), -1) == (size_t) - 1);
       }
     
       {
          int a[] = { 1, 2 };
          assert (dicosearch (a, N (a), 1) == 0);
          assert (dicosearch (a, N (a), 2) == 1);
          assert (dicosearch (a, N (a), 0) == (size_t) - 1);
          assert (dicosearch (a, N (a), -1) == (size_t) - 1);
       }
     
       {
          int a[] = { 1, 2, 3 };
          assert (dicosearch (a, N (a), 1) == 0);
          assert (dicosearch (a, N (a), 2) == 1);
          assert (dicosearch (a, N (a), 3) == 2);
          assert (dicosearch (a, N (a), 0) == (size_t) - 1);
          assert (dicosearch (a, N (a), -1) == (size_t) - 1);
       }
     
       puts ("P A S S E D");
       return 0;
    }
    #endif

Discussions similaires

  1. Réponses: 14
    Dernier message: 18/03/2012, 17h18
  2. recherche pour insertion de données
    Par Homer091 dans le forum Conception
    Réponses: 1
    Dernier message: 09/01/2011, 11h41
  3. Recherche dichotomique pour la puissance de 2 supérieure
    Par fearyourself dans le forum Télécharger
    Réponses: 0
    Dernier message: 30/11/2010, 17h15
  4. Recherche un framework RAD pour Eclipse
    Par Almex dans le forum Eclipse Java
    Réponses: 10
    Dernier message: 08/10/2003, 12h24
  5. [windows] recherche outils coloration syntax. pour -> htm
    Par hpfx dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 02/10/2003, 01h52

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