Cours Asd Prepa1
Cours Asd Prepa1
Cours Asd Prepa1
Représentation informelle :
Soit un tableau a et une information à rechercher dans ce
tableau. L’algorithme de recherche séquentielle (ou linéaire)
consiste à regarder successivement en partant du 1er élément
de a, est ce que cet élément coïncide avec info ?
Réalisation en C :
Soit un annuaire téléphonique formé de pairs<nom.tel> on
souhaite connaitre le numéro de téléphone d’un abonné
donné.
Remarque :
Pour l’expression qui gouverne while l’ordre des opérandes
est significatif ceci permet une évaluation connue.
Dans l’hypothèse où info n’appartient pas au tableau nom,
on soit avec (i>=n) et on n’évalue pas la 2eme opérande
(strcmp(nom[i],info) !=0)
Critique :
Le schéma while comporte une expression composé (avec
évaluation courte, l’ordre est significatif) on cherche à
simplifier un tel schéma.
122 125 12 23 2 78 -1
Exemple
0 1 2 3 4
Ali Aliou Baba Laila Zina
char* info=’Zina’ ;
La taille initiale est 4 on prévoit un élément de plus (4+1=5),
on commence par mettre la valeur de info dans nom [4] et
puis on engage un recherche séquentielle dans le tableau.
L’expression actuelle :
((i<n)&&strcmp(info,nom[i]) !=0)
Le premier opérande (i<n) on peut l’écarter on obtient alors
strcmp (info,nom[i]) !=0
GRAIET & HAMEL 2020 131
#include<stdio.h>
#define n 100
Char* nom[n] ;
int tel [n] ;
int recherche_seq (char * info) /*rend (-1) si info n’appartient pas à nom
sinon elle retourne le téléphone correspondant*/
{unsigned i ; /*pour parcourir*/
char* nom[n-1]=(char*) malloc(strlen(info)*sizeof(char)+1);
strcpy(nom[n-1], info) ;
tel [n-1]=-1 ;
i=0 ;
while(strcmp (nom[i], info) !=0)
i++ ;
return tel[i] ;
}
Testing
Tester un algorithme réalisé dans un langage de
programmation.
Un test signifie : on connait le jeu de donnée, mettre un
sous-programme qui réalise l’algorithme.
Egalement, on connait les résultats attendus sur le jeu de
donnée soumis.
On compare les résultats attendues par rapport au celui
fourni par le sous-programme. En cas de coïncidence, on
dit sue l’algorithme est correct par rapport à ce test sinon il
est incorrect !
Les tests confirment la présence des erreurs, mais jamais
que le sous-programme est exacte !
info=nom[n-1]
Quelque part au milieu
15 18 20 30 32 33 56 80 100 112
0 3 9
10
int recherche_dic (char * info) /*rend (-1) si info n’appartient pas à tel sinon elle
retourne le numéro correspondant*/
/*initialisation*/
g=0 ;
d=n-1 ;
do {m=(g+d)/2 ;
cmp=strcmp(info,nom[m]) ;
if (cmp==0) return tel[m] ;
if (cmp<0) { d=m-1 ;
else g=m+1 ;}
while (g<=d ); } return -1 ; }
GRAIET & HAMEL 2020 139
• Au min : 1 seule comparaison
• Cas max : Cn le nombre de comparaison
pour N element :
• Cn = CN/2+ 1