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}
i1
r ´e p ´e t e r
xi`e me ( l , i)
s i c l´e ( x )= c alors
rendre x
s i n o n ii +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
gauche 1
droite lon gueu r (l )
trouv´e f a u x
{l es pac e de r eche rche est au d´e par t t oute la liste }
r ´e p ´e t e r
{gauche6droite et}
{k , 16k<g auc he , c l´e ( i `e me ( l ,k ) )<c e t }
{k, droite<k6l o ng ue ur ( l ) , c l´e ( i `em e (l , k ))>c }
milieu (gauche+droite) div 2
xi`e me ( l , m il ie u )
s i c= c l´e ( x) alors trouv´e v r a i
sinon
s i c < cl ´e ( x) alors droite milieu -1
s i n o n {c > c l´e (x ) } gauche milieu+1
finsi
finsi
jusqu`a trouv´e ou gauche > dro ite
{ cl ´e ( i `eme ( l , mi li eu ) )= c o u k , 16k6l on g ue ur ( l ), c l´e ( i `em e (l , k )) 6=c}
s i trouv´e a l o r s r e n d r e x
s i n o n e x c e p t i o n Cl´e NonT r ouv´e e
finsi
10) Quelle la complexit´e de cet algorithme ?
11) Programmez en Java et testez l’algorithme de recherche dichotomique.
12) Cette recherche effectue quatre tests `a chaque it´eration. Modifiez cet algorithme
pour ´eliminer un test, en supprimant la variable trouv´e dans la boucle.
13) On peut encore faire mieux en regroupant le test d’´egalit´e strict avec un test
d’in´egalit´e. Dans ce cas, cet algorithme ne peut s’arrˆeter d`es qu’il a trouv´e l’´el´ement
recherce ! Au contraire, il parcourt l’arbre de d´ecision jusqu’`a son terme, de la mˆeme
fa¸con que s’il recherchait un ´el´ement n’appartenant pas `a la table. ´ecrivez cette nouvelle
version de la recherche dichotomique. `a quel indice se trouve l’´el´ement recherch´e ? Si
l’´el´ement recherch´e apparaˆıt plusieurs fois dans la table, quel est celui trouv´e par cette
ethode ? Est-elle plus int´eressante que les pr´ec´edentes ?
14) Est-ce que le choix d’une liste chaˆın´ee (LinkedList) aurait ´et´e judicieux pour la
mise en œuvre des algorithmes de recherche pr´ec´edents ? Expliquez.
3
1 / 2 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !