Algorithmie – TD 3 Chercher et Trouver 1 Méthodes de Recherche

Algorithmie TD 3
Chercher et Trouver
1 M´ethodes de Recherche
Nous allons chercher `a savoir si un ´el´ement particulier se trouve dans un
ensemble d’´el´ements. On verra que la performance de la recherche d´epend
de la structure utilis´ee pour stocker les ´el´ements. Il faut donc s’assurer que
la structure est conserv´ee lorsque l’on retire ou ajoute un ´el´ement.
1.1 Recherche s´equentielle
Ici, la structure pour stocker les ´el´ements est une liste. Tout nouvel ´el´ement
est plac´e en queue de liste. Quelle est la complexit´e de recherche d’un ´el´ement
dans une telle structure ? Et en moyenne ?
Solution :
Ici, pour trouver un ´el´ement, il faut parcourir la liste ´el´ement apr`es
´el´ement. Ainsi, en cas de recherche infructueuse, il faut comparer tous les
´el´ements de la liste `a l’´el´ement recherce : on a donc besoin de N compara-
isons.
Dans le cas d’une recherche fructueuse, l’´el´ement recherce peut ˆetre de
fa¸con ´equiprobable dans toutes les cases de la liste (il a 1/N chance d’ˆetre en
position i, pour tout 1 iN).
Ainsi, s’il est en position i, il y aura juste i comparaisons `a effectuer.
L’esp´erance du nombre d’op´eration est alors P1iN(1
Ni) = N+1
2
1.2 Recherche dichotomique
Ici, notre structure est une liste tri´ee. `
A chaque nouvel ´el´ement, on re-trie
la liste. Quel est la complexit´e d’un ajout ou d’une suppression d’´el´ement ?
Quel est le coˆut d’une recherche ?
Solution :
1
Il faut retrier `a chaque fois la liste. Comme on ne rajoute ou on ne
supprime qu’un ´el´ement, ceci revient `a trouver o`u l’´el´ement doit ˆetre plac´e
ou supprimer, puis `a d´ecaler tous les autres ´el´ements.
De l`a, le fait de d´ecaler les ´el´ements revient – au pire – `a tous les d´ecaler et
donc am`ene `a une complexit´e de N. En moyenne, comme l’´el´ement `a d´eplacer
peut ˆetre de fa¸con ´equiprobable `a toutes les positions de la liste, et comme
si le premier ´el´ement `a d´ecaler est en position i, il faut en d´ecaler Ni, le
nombre moyen de d´ecalage est : P1iN(1
N(Ni)) = N+1
2.
De fa¸con dichotomique, on coupe successivement la liste en 2 et on choisit
o`u regarder (puisque la liste est tri´ee, on sait a priori dans quelle partie de
la liste est l’´el´ement recherch´e s’il est pr´esent).
On a donc besoin de log2(N) op´eration. En effet, `a chaque ´etape on coupe
la liste en 2 jusqu’`a trouver le bon ´el´ement.
En effet, s’il y a 2 ´el´ements une ´etape suffit, s’il y a au plus 4 ´el´ements, 2
´etapes suffisent, et ainsi de suite. Par l`a, trouver un ´el´ement parmi 2kpeut
se faire en k´etapes.
1.3 Arbres binaires de recherche
On utilise ici des arbres binaires de recherche stocker nos donn´ees. Un arbre
binaire de recherche est un arbre tel que pour tout nœud, son sous arbre
gauche ne contienne que des valeurs strictement plus petites que sa propre
valeur, et que son sous-arbre droit ne contienne que des valeurs plus grande
ou ´egale `a sa valeur.
Proposez des algorithmes (avec complexit´es maximales et moyennes) pour :
cr´eation de la structure,
recherche d’un ´el´ement,
insertion d’un ´el´ement (qu’il soit vide ou pas),
suppression d’un ´el´ement.
Solution :
La figure 1 montre un Arbre binaire de recherche.
Nous ne d´etaillerons pas ici les algorithmes d’insertion et de suppression
mais leur complexit´e est la mˆeme :
2
5
1
3
20
9
14
15
12
19
Figure 1: Un arbre binaire de recherche
complexit´e maximale O(n),
complexit´e moyenne O(log(n)).
Effecuter une recherche se fait depuis la racine et on parcours les nœuds
(`a gauche si la valeur `a chercher est inf´erieure `a la valeur du nœud, `a droite
sinon) jusqu’`a arriver `a la solution. L’insertion peut se faire selon le mˆeme
principe, on parcours l’arbre pour rechercher la valeur et on rajoute la valeur
`a la derni`ere feuille visit´ee. Ainsi, si on veut rajouter la valeur 8 `a l’arbre de
la figure 1, on parcours l’arbre de la fa¸con suivante 5 20 9 et on ins`ere
8 `a gauche de 9.
Pour la suppression, c’est un petit peu plus technique. Certains nœuds
sont faciles `a supprimer : ceux qui n’ont qu’au plus 1 fils. Pour ceux qui
ont deux fils (comme la racine), il suffit de prendre la valeur qui lui est
strictement sup´erieure (ici 9). Ce nœud ne peut poss´eder qu’un seul fils `a
droite (car entre la racine et sa valeur strictmeent sup´erieure il n’y a personne
dans l’arbre). On peut alors ´echanger la valeur de la racine avec le nœud
trouv´e (ici 9) et de le supprimer. Le r´esultat est pr´esent´e en figure 2
La hauteur d’un arbre de recherche peut ˆetre ´egale au nombre de donn´ees
si l’arbre est mal construit (des donn´ees tri´ees par exemple), ainsi, au max-
imum la recherche, la suppression ou l’insertion d’une donn´ee peut prendre
un temps en O(n).
Le temps moyen est donc ´egal `a 1/N fois la longeur totale interne (la
somme de tous les chemins des nœuds qui ne sont pas des feuilles `a la racine)
moyenne d’un arbre binaire de recherche.
3
9
1
3
20
14
15
12
19
Figure 2: Un arbre binaire de recherche
La longeur totale moyenne d’un arbre binaire de recherche peut ˆetre
trouv´ee `a partir de la formule de r´ecurrence suivante :
C(N) = N1+1/N X
1iN
(C(i1) + C(Ni))
Et C(1)=1.
Le premier terme tient compte du fait que la racine contribue de 1 `a la
longueur des chemins des N-1 autres ´el´ements, et le deuxi`eme terme pr´ecise
la longueur des sous-arbres `a gauche et `a droite de la racine. La racine `a en
effet 1/N chance d’ˆetre la i i`eme plus petite valeurs et donc que son arbre
gauche contienne i ´el´ements et son arbre droit N-i ´el´ements.
Cette r´ecurrence est presque identique `a celle trouv´ee en PC2 pour le tri
rapide et peut ˆetre r´esolue de la mˆeme mani`ere. On a alors C(N) =O(nlog(n)).
On peut prouver que, de mˆeme que pour l’insertion ou la suppression, ce
temps moyen est en O(log(n)). Cette m´ethode est donc plus efficace que la
recherche dichotomique et s´equentielle.
2 Tas
Un tas (ou tas-max) est un arbre binaire tel que la valeur d’un nœud est
plus grande de les valeurs de ses nœuds fils (il existe aussi des tas-min) Cette
d´efinition implique en particulier que la clef de la racine soit la plus grande.
Nous allons nous ineresser ici `a l’impl´ementation la plus concise possible
d’un tas.
4
2.1 Algorithmes
Proposez des algorithmes (et donnez leurs complexit´es) permettant de :
cr´eer un tas,
ins´erer un ´el´ement dans un tas (qu’il soit vide ou pas),
changer la valeur d’un ´el´ement,
supprimer l’´el´ement le plus grand d’un tas.
Solution :
Algorithmes classiques r´ecursifs. Pour ins´erer un ´el´ement dans un tas
vide on place sa valeur. Pour un tas non vide on compare la valeur du nœud
`a la valeur `a ins´erer. Si la valeur `a ins´erer est strictement pus grande que
celle du nœud, on ´echange la valeur du nœud et la valeur `a ins´erer et on
recommence avec un des fils de la racine. Pour la suppression, on compare
les valeurs des deux fils de la racine et on recopie la valeur la plus grande
dans la racine. On supprime ensuite ce noeud.
2.2 Tas – Tableaux
Une liste lde n´el´ements est un tas si pour 1 in(les 1 viennent du
fait que les indices d’une liste commencent `a 0) :
l[i1] max{t[(2 ·i)1], t[(2 ·i+ 1) 1]
Montrer que cette d´efinition est ´equivalente `a l’“original”. Adaptez les
algorithmes de la section pr´ec´edente `a cette nouvelle d´efinition.
Solution :
La figure 3 montre 3 arbres binaires. L’arbre (c) est particulier, tous les
nœuds ont deux fils `a part peut-ˆetre ceux du dernier niveau, et le dernier
niveau est rassembl´e `a gauche. On dira que ce type d’arbre binaire est
complet.
Par la suite tas et tas complet seront consid´er´es comme ´equivalents.
On montre que l’on peut toujours transformer un tas pour qu’il soit com-
plet par r´ecurrence. On suppose la propri´et´e vrai pour n´el´ements (c’est vrai
si n= 1) et soit Tun tas `a n+ 1 ´el´ements. On consid`ere le nœud de plus
petite valeur. Ce nœud n’a pas de fils on peut donc le supprimer de Ten
5
1 / 9 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 !