Vous êtes sur la page 1sur 19

Les structures de

donnes


Rajae El Ouazzani
Les techniques de recherche
de donnes dans un tableau
2
Les techniques de recherche
Recherche squentielle
Recherche dichotomique dans un tableau tri
3
Recherche squentielle
Parcourir les lments du tableau progressivement
du dbut la fin et les comparer avec llment
recherch x.
Si le tableau n'est pas tri, arriver la fin du
tableau signifie que l'lment n'existe pas,
Dans un tableau tri de manire croissante, le
premier lment trouv suprieur l'lment
recherch x, permet d'arrter la recherche. Aussi,
cette position correspond celle o il faudrait
insrer l'lment recherch pour garder un tableau
tri.
4
Recherche squentielle: complexit
Une recherche dans un tableau tri (de taille N)
ncessite en moyenne N/2 comparaisons.

Dans un tableau non tri, on se rapproche de N
comparaisons si on recherche un lment qui
nexiste pas dans le tableau.
5
Algorithme
0
compteur
N-1
Exercice
Ecrire la fonction de recherche squentielle en C. Elle
rend -1 si valeur_recherchee est non trouve et lindice
de la premire occurrence trouve sinon.

Utiliser le prototype suivant:

int rech_sequentielle (int T[], int N, int valeur_recherchee)

7
Recherche squentielle en C
int rech_sequentielle (int T[], int N, int valeur_recherchee)
/* rend -1 si valeur_recherchee est non trouve et lindice de
la premire occurrence trouve sinon */
{
int i;
for(i=0;i<N;i++)
if(T[i]==valeur_recherchee) return(i);
return(-1);
}
8
Recherche dichotomique
9
Recherche dichotomique
Principe: On compare la valeur cherche x avec l'lment
central du tableau, si ce n'est pas la bonne, un test permet de
trouver dans quelle moiti du tableau se trouve la valeur x.

On continue rcursivement jusqu' un sous-tableau de
taille 1.

Complexit: Dans le cas d'un tableau tri, le nombre de
comparaison est de lordre de log
2
(N). Ainsi, l'espace de
recherche est limit.
10
Algorithme de la recherche dichotomique
11
premier
compteur
dernier
milieu
12
premier
compteur
dernier
Milieu=
0 N-1
(premier+
dernier)/2
13
14
Exemple d'excution
Considrons le tableau T :

Si la valeur cherche est 20 alors les indices premier, dernier et milieu
vont voluer comme suit :



Si la valeur cherche est 10 alors les indices premier, dernier et milieu
vont voluer comme suit :
4 6 10 15 17 18 24 27 30
premier 0 5 5 6
dernier 8 8 5 5
milieu 4 6 5
premier 0 0 2
dernier 8 3 3
milieu 4 1 2
Exercice
Ecrire une fonction rech_dich qui ralise une
recherche dichotomique dans un tableau tri.

Ecrire le programme principal qui fait appel cette
fonction.

Rcrire la fonction de manire rcursive:
rech_dich_rec

Recrire le programme principal.
15
Solution
int rech_dich(int t[], int n, int val) {
int premier, dernier, milieu, pos=-1;
premier =0;
dernier =n-1;
while((dernier >= premier)&&(pos==-1)) {
milieu =(dernier + premier)/2;
if(val<t[milieu])
{dernier = milieu -1; }
else if(val>t[milieu])
{premier = milieu +1; }
else
pos= milieu;
}
return pos;
}

16
Appel de la fonction dans le main:
Pos=-1;
pos=rech_dich(t, n, val);
if(pos==-1) printf("la valeur ne se trouve pas dans le
tableau");
else printf("%d se trouve dans la position %d",val,pos);

17
La fonction Rech_dicho_recu
int rech_dich_recu(int t[], int n, int val, int premier, int dernier) {
int milieu;
if(premier>dernier) return -1;
milieu=(premier+ dernier)/2;
if (val==t[milieu]) return milieu;
else if(val<t[milieu])
{
return rech_dich_recu(t, n, val, premier, milieu-1); }
else if(val>t[milieu])
{
return rech_dich_recu(t, n, val, milieu+1, dernier); }
}
18
Appel de la fonction dans le main:
pos=-1, premier=0, dernier=n-1;
pos=rech_dich_recu(t, n, val, premier, dernier);

if(pos==-1) printf("la valeur ne se trouve pas dans le
tableau");
else printf("%d se trouve dans la position %d",val,pos);

19