Universit´e de Nice-Sophia Antipolis Jeudi 16 mars 2017
POLYTECH Peip2 Dur´ee: 2h
Algorithmique et Programmation
Travaux Pratiques – S´eance no4
Recherches lin´eaire et dichotomique
Dans ce TD, vous allez programmer des algorithmes de recherche. Le premier est
une simple recherche lin´eaire. Le second, plus efficace, suit la m´ethode dichotomique.
Dans ce qui suit vous utiliserez des listes d’´el´ements. Un ´el´ement, repr´esent´e par la
classe ´
El´ement, sera form´e d’une cl´e et d’une valeur. Les algorithmes consisteront `a
rechercher un ´el´ement dans la liste `a partir de sa cl´e. Si la cl´e est pr´esente dans la
liste, l’algorithme retourne l’´el´ement trouv´e. Si la cl´e n’est pas pr´esente, la recherche
´echouera et une exception Cl´eNonTrouv´ee sera ´emise.
1) D´efinissez une classe g´en´erique ´
El´ement<C,V>, munie des deux attributs valeur et
cl´e, de constructeurs et de m´ethodes pour les manipuler.
2) ´
Ecrivez, compilez et ex´ecutez le programme suivant :
p u b l i c c l a s s Test {
p u b l i c s t a t i c vo id ma in ( Str in g [] arg s ) {
Lis t < I nte ger > l1 = new Ar ray List < Integer > ();
Lis t < S tri ng > l2 = new Li nk edL is t < St rin g > ();
´
El´ement < Integer , String > e =
new ´
El´ement < Integer , String >(3 , " tot o " );
//e est un ´el´ement de cl´e 3 et valeur "toto"
S ys te m . ou t . p ri nt l n ( e );
}
}
3) Compl´etez ce programme afin d’ajouter des valeurs aux listes l1 et l2, puis affichez
les deux listes.
4) D´eclarez une liste l3 dont les valeurs sont de type ´
El´ement<Integer,String>, ajoutez
des valeurs et affichez la liste l3. Le premier type de ´
El´ement d´esigne le type de sa cl´e
et le second le type de sa valeur.
1 Recherche lin´eaire
La recherche lin´eaire consiste `a rechercher s´equentiellement, c’est-`a-dire, en parcou-
rant les ´el´ements de la liste un `a un en partant du premier. L’algorithme est donn´e
1
ci-dessous.
algorithme r ec he r ch er (l , c )
{ R^ole : re cher cher dans la lis te l l’ ´e l´ement de cl´e c }
{ Con s´eq uent : r eto urne l ’ ´el´ement e de cl´e c
∀k , 16k6l o ng ue ur ( l ) , c l´e ( i `e me ( l , k ))6=c}
i←1
r ´e p ´e t e r
x←i`e me ( l , i)
s i c l´e ( x )= c alors
rendre x
s i n o n i←i +1
finsi
{i6lon gu eu r ( l )+1 et ∀k , 16k <i , c l´e ( i `em e (l , k ))6=c}
jusqu’`a i = long ueur (l )
{∀k , 16k6l o ng ue ur ( l ) , c l´e ( i `e me ( l , k ))6=c}
exception Cl´e NonT rouv´ee
5) Dans une classe Test, programmez cet algorithme en Java dans une m´ethode sta-
tique. Dans la m´ethode main, construisez une liste d’´el´ements avec un ArrayList et
testez votre m´ethode de recherche.
6) Quelle est la complexit´e de cet algorithme ?
7) ´
Ecrivez une seconde version de la m´ethode de recherche lin´eaire qui tient compte du
fait que les ´el´ements dans la liste sont ordonn´es de fa¸con croissante sur les cl´es.
8) Construisez une liste ordonn´ee d’´el´ements et testez votre seconde m´ethode de re-
cherche.
9) Quelle est la complexit´e de ce second algorithme ? Est-il plus efficace ?
2 Recherche dichotomique
La recherche dichotomique est une m´ethode tr`es efficace. Le principe de l’algo-
rithme est de diviser l’espace de recherche de l’´el´ement en deux espaces de mˆeme taille.
L’´el´ement recherch´e est dans l’un des deux espaces. La recherche se poursuit dans l’es-
pace qui contient l’´el´ement recherch´e selon la mˆeme m´ethode.
Cette m´ethode impose que les ´el´ements soient ordonn´es, et que l’acc`es aux ´el´ements
soit direct (sinon la m´ethode perd toute son efficacit´e).
Une premi`ere version de l’algorithme de recherche dichotomique est donn´ee ci-
dessous :
algorithme r ec he r ch er ( l , c )
{ R^ole : r eche rche r dans la liste l o rdo nn´ee l ’ ´el ´eme nt de cl´e c}
{ Con s´equ en t : si la cl´e e st pr´es ente dans la liste , reto urne }
{ l ’ ´el´eme nt x tel que cl´e(x) = c}
variables gauche , droite , mili eu type [0 , l o ng ue ur ( l ) +1 ]
trouv´e type bool´een
xtype ´
El´ement
2