Algorithmie
PC 4 : M´ethodes de recherche
corrig´e
1 Fonction d’adressage
Un fonction d’adressage, ou fonction de hashage est une fonction permettant
d’associer un entier de [0,N] `a un ensemble de donn´ees (des chaˆınes de caract`eres,
par exemple).
De fa¸con g´en´erale, comme toute donn´ee en informatique est d´enombrable
(i.e. toute donn´ee est repr´esenee par une suite de 0 et de 1), une fonction
d’adressage est une fonction de l’ensemble des entiers naturels dans un sous-
ensemble fini d’icelui (qui sera la plupart du temps les entiers de [0, N], avec N
entier).
1.1 Une fonction d’adressage particuli`ere
Une bonne fonction d’adressage doit avoir un caract`ere “al´eatoire” pour que les
donn´ees se r´epartissent bien entre tous les entiers de [0, N].
Une fonction tr`es utilis´ee est la fonction modulo. En prenant deux entiers k
et k’, k modulo k’ est ´egal au reste de la division enti`ere de k par k’.
1.1.1
Impl´ementez un algorithme permettant de calculer la fonction mod-
ulo. Quelle est sa complexit´e ?
L’algorithme 1 est une possibilit´e. Il y a k’/k it´erations, la complexit´e est
donc en O(k0/k).
1.1.2
On suppose que chaque lettre de l’alphabet est cod´ee de fa¸con binaire
sur 5 bits par sa position dans l’alphabet (00001 pour A, 00101 pour
E, etc.). Si l’on veut des entiers entre 0 et 100 (en notation d´ecimale),
quelle est l’adresse via la fonction modulo de la chaˆıne de caract`ere
CLE ?
1
Algorithme 1 Fonction modulo
Donn´ees
un entier k
un entier k’
ebut
i=1
tant que k*i <k’ faire
i=i+1
i=i-1
rendre k’-k*i
Fin
Comme C=00011, L=01100 et E=00101, le code de CLE est ´egal `a 000110110000101.
Ce nombre est ´egal `a 211 +210 +28+27+22+20= 2048+1024+256+128+4+1 =
3461.
Comme tout est cod´e sur 5 bits, on a ´egalement que le code de CLE est ´egal
`a 3 322+ 12 321+ 5 320.
Si l’on veut des entiers entre 0 et 100, on doit prendre comme diviseur 101.
L’adresse de CLE est alors ici ´egale `a 3461 modulo 101 = 27.
1.1.3
Que se serait-il pass´e si l’on avait voulu des entiers entre 0 et 31 ?
Le code utilis´e affecte un entier cod´e sur 5 bis. Ainsi, CLE = 3 322+ 12
321+5320. Le r´esultat du modulo 32 ne concerne alors que le dernier caract`ere
de la cl´e, le rendant non al´eatoire.
Un moyen simple d’enlever cette difficult´e est de ne consid´erer que des nom-
bres premiers pour l’op´eration modulo.
1.1.4
En utilisant la m´ethode de Horner (cf. premi`ere petite classe) pro-
posez un algorithme permettant de calculer l’adresse d’une chaˆıne de
caract`ere en utilisant le code pr´ec´edant (o`u le code de CLE est ´egal
`a 3322+ 12 321+ 5 320) et la fonction d’adressage ´egale au modulo.
On rappelle que la m´ethode de Horner consiste `a ´ecrire un polynˆome P(x) =
a0+P1inaixide la fa¸con suivante : P(x) = a0+x(a1+...x(an1+anx)...).
Pour notre codage, soit une chaˆıne de caract`ere c=c1c2. . . cm, et φla
fonction qui a chaque caract`ere rend sa position dans l’alphabet.
Le code associ´e `a la chaˆıne de caract`ere est alors PC(32) o`u
Pc(x) = X
0im1
φ(ci1)xi
2
En s’inspirant fortement de la PC1, on a alors l’algorithme 2 qui rend bien
l’adresse de toute chaˆıne de caract`ere. On peut remarquer que ceci permet
d’´echapper au d´epassements d’entiers qui r´esulterait du codage d’une tr`es longue
chaˆıne de caract`ere grˆace aux propri´et´es de la fonction modulo (a*b modulo k’
= (a modulo k’)*(b modulo k’) modulo k’.
Algorithme 2 Calcul d’adresse
Donn´ees
une chaine c=c1c2. . . cmde m caract`eres
un entier k’
ebut
res=0
pour i=1 a m faire
res=(32*res + φ(ci)) modulo k’
rendre res
Fin
1.2 Fonction d’adressage et dictionnaire
Les fonctions d’adressages sont utilis´ees dans les structures de donn´ees appel´ees
dictionnaires.
Un dictionnaire peut ˆetre vu comme un tableau auquel on acc`ede non pas
par des indices, mais par des chaˆınes de caract`eres.
1.2.1
En supposant qu’il existe une fonction d’adressage rendant une adresse
unique quelque soit la chaˆıne de caract`ere, proposez une impl´ementa-
tion d’un dictionnaire. Une telle fonction existe-t-elle ? La m´ethode
est-elle r´ealisable ?
Il suffit de consid´erer un tableau dont l’indice correspond `a l’adresse de la
chaˆıne de caract`ere. Une telle fonction d’adressage existe, il suffit de pren-
dre comme adresse le code associ´e `a chaque chaˆıne de caract`ere de la section
pr´ec´edente.
Une telle m´ethode est bien ´evidemment irr´ealisable en pratique puisque l’on
ne poss`ede pas de m´emoire infinie. Mettre en place un dictionnaire n´ecessite
donc de g´erer les chaˆınes de caract`eres ayant mˆeme adresse.
1.2.2
Comment g´erer les chaˆınes ayant mˆeme adresse ?
Le plus simple est qu’`a chaque adresse, on utilise une liste contenant les
diff´erentes chaˆınes de caract`eres. Ainsi, lorsque deux chaˆınes poss`edent la mˆeme
adresse, on peut grˆace `a la liste savoir si la chaˆıne est d´ej`a pr´esente. Si la fonction
3
d’adressage est bien “al´eatoire”, les listes associ´ees `a chaque adresse seront de
longueurs ´equivalentes.
1.2.3
Quel est l’inerˆet d’utiliser ce genre de structure ?
Tout d’abord, utiliser des structures index´ees par des chaˆınes de caract`eres
se r´ev`ele utile dans de nombreuses situations (g´erer un carnet d’adresse par
exemple), mais surtout, permet de diviser par le nombre d’adresses diff´erentes
le coˆut de la recherche d’une chaˆıne particuli`ere par rapport au coˆut que l’on
aurait si l’on avait utilis´e une unique liste pour stocker les dites chaˆınes.
2 Algorithme de Rabin-Karp
L’algorithme de Rabin-Karp pour la recherche d’un motif de longueur m dans
une chaˆıne de caract`eres c1revient `a consid´erer une fonction d’adressage et de
v´erifier, pour chaque paquet de m lettres de c1si l’adresse correspond `a celle du
motif.
On consid´erera ici que nombre associ´e `a chaque caract`ere est sa position
dans l’alphabet, cod´e en base d. Dans la partie pr´ec´edente, d´etait ´egal `a 32.
De mˆeme on consid`ere que la fonction d’adressage est la fonction modulo
appliqu´ee `a un grand nombre premier q.
2.1
On consid`ere que l’on a une fonction φrendant pour chaque caract`ere
sa position dans l’alphabet. Quelle est le code du mot de longueur m
pr´esent `a la position i de la chaˆıne c1?
En utilisant l’´ecriture sous forme de polynˆome vue dans la partie pr´ec´edente,
ce mot s’´ecrit :
x=φ(c1[i])dm1+φ(c1[i+ 1])dm2+. . . +φ(c1[i+m1])d0
2.2
En connaissant le code du mot de longueur m pr´esent `a la position i
de la chaˆıne c1, quelle est le code du mot de longueur m pr´esent `a la
position i+1 de la chaˆıne c1?
(xφ(c1[i])dm1)d+φ(c1[i+m])
2.3
En connaissant l’adresse du mot de longueur m pr´esent `a la position
i (c’est `a dire l’adresse du code du mot) de la chaˆıne c1, quelle est
4
l’adresse du mot de longueur m pr´esent `a la position i+1 de la chaˆıne
c1?
On utilise la mˆeme propri´et´e du modulo que dans la partie pr´ec´edente pour
r´esoudre cette question.
On note y=dm1modulo q, et xle code du mot de longueur mpr´esent `a
la position i de la chaˆıne c1. L’adresse de xest alors xmodulo q.
de l`a, l’adresse du mot de longueur mpr´esent `a la position i+1 est alors
´egale `a :
((((xmodulo q) + (dqφ(c1[i]) y)) modulo q)d+φ(c1[i+m])) modulo q
Une quantit´e d*q est ajout´ee pour garantir le fait que tout reste bien positif
dans le calcul des modulos.
2.4
En d´eduire un algorithme permettant de trouver dans une chaˆıne de
longueur n la premi`ere position i dont le mot de longueur m com-
men¸cant `a cette position `a la mˆeme adresse qu’un motif de longueur
m. Quel est sa complexit´e ?
La complexit´e de cette algorithme est clairement O(m+n) (une premi`ere
it´eration de longueur m pour calculer l’adresse du motif et du mot commen¸cant
en position 0, puis une it´eration de longueur n pour trouver l’appariement).
2.4.1
Que reste-t-il `a faire pour trouver un motif dans une chaˆıne de car-
act`ere ?
Il faut encore v´erifier que les deux mots sont identiques, puisque deux chaˆınes
diff´erentes peuvent avoir mˆeme adresse. Si l’on consid`ere un entier q tr`es grand
et premier, on va pouvoir limiter au maximum ce risque, rendant l’algorithme
complet presque sˆurement lin´eaire.
5
1 / 6 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 !