Anda di halaman 1dari 9

Recherche d'un lment

Recherche par parcours squentiel : on parcourt le tableau


squentiellement jusqu' ce qu'on trouve l'lment

Exemple : recherche squentielle dans un tableau de chaines


// cette fonction renvoie vrai si x est prsente dans tab, faux sinon
fonction avec retour boolen rechercheElement1(chaine[] tab, chaine x)
entier i;
dbut
i <- 0;
tantque (i < tab.longueur) faire
si (tab[i] = x) alors
retourne VRAI;
sinon
i <- i + 1;
finsi
fintantque
retourne FAUX;
fin

Licence Informatique - Semestre 2 - Algorithmique et Programmation 1

Recherche dans un tableau tri


Si le tableau est tri par ordre croissant, on peut s'arrter ds que
la valeur rencontre est plus grande que la valeur cherche (ou
plus petite si le tableau est tri par ordre dcroissant)
// cette fonction renvoie vrai si x est prsente dans tab, faux sinon
// le tableau tab est suppos tri par ordre croissant
fonction avec retour boolen rechercheElement2(chaine[] tab, chaine x)
entier i;
dbut
i <- 0;
tantque (i < tab.longueur) faire
si (tab[i] = x) alors
retourne VRAI;
sinon
si (tab[i] > x) alors
retourne FAUX;
sinon
i <- i + 1;
finsi
finsi
fintantque
retourne FAUX;
fin

Licence Informatique - Semestre 2 - Algorithmique et Programmation 2


Recherche multidimensionnelle
Dans un tableau multidimensionnel, une double boucle est
ncessaire pour rechercher un lment

// cette fonction renvoie vrai si x est prsente dans tab, faux sinon
fonction avec retour boolen rechercheElement3(chaine[][] tab, chaine x)
entier i,j;
dbut
i <- 0;
tantque (i < tab.longueur) faire
j <- 0;
tantque (j < tab[i].longueur) faire
si (tab[i][j] = x) alors
retourne VRAI;
sinon
j <- j + 1;
finsi
fintantque
i <- i + 1;
fintantque
retourne FAUX;
fin

Licence Informatique - Semestre 2 - Algorithmique et Programmation 3

Recherche des occurences


Si on suppose que la valeur recherche peut apparatre plusieurs
fois dans le tableau, on peut vouloir retourner le nombre
d'occurences de la valeur

// cette fonction renvoie le nombre de fois o x est prsente dans tab


fonction avec retour entier rechercheElement4(chaine[] tab, chaine x)
entier i, nbOc;
dbut
i <- 0;
nbOc <- 0;
tantque (i < tab.longueur) faire
si (tab[i] == x) alors
nbOc <- nbOc + 1;
finsi
i <- i + 1;
fintantque
retourne nbOc;
fin

Licence Informatique - Semestre 2 - Algorithmique et Programmation 4


Tableau associatif (1/3)
Dans un tableau classique indic par des entiers, les indices n'ont
aucun rapport avec les valeurs des cases, il ne font qu'indiquer
une position

Mais si l'indice permet d'identifier la valeur de la case, la


recherche de la prsence de la valeur est facilite : il suffit de
vrifier que l'indice existe

Exemple :
les numros d'tudiant ne permettent pas de retrouver un tudiant dont on
connait le nom
un tableau d'tudiants indic par les noms des tudiants permettrait de
retrouver directement un tudiant dont on connait le nom

Il faut bien choisir l'lment qui identifie les valeurs : la cl

Licence Informatique - Semestre 2 - Algorithmique et Programmation 5

Tableau associatif (2/3)


Les tableaux associatifs sont des tableaux dont les indices sont
pris dans n'importe quel sous ensemble fini de valeurs d'un type
donn (compos ou non)
les indices sont appels les cls et chaque case est un couple cl-valeur

Exemple : tableau de valeurs du type Personne indic par des


chaines de caractres (les noms des personnes)

prnom : Robert prnom : Marcel prnom : Julie


nom : Toto nom...: Tutu nom : Titi
age : 29 age : 31 age : 28
mtier : informaticien mtier : boulanger mtier : professeur

case case case


Toto Tutu Titi

Licence Informatique - Semestre 2 - Algorithmique et Programmation 6


Tableau associatif (3/3)
Problmes poss par les tableaux associatifs :
il vaut mieux que les cls soient toutes diffrentes pour viter les ambiguits
travailler avec de gros indices n'est pas efficace par rapport aux indices
entiers

Comment choisir entre tableau indice entier et tableau


associatif?
travailler avec des indices entiers, qui occupent peu de place en mmoire,
mais obligent parcourir le tableau pour trouver un lment
solution trs efficace quant l'occupation mmoire, la pire quand au
temps de recherche
travailler avec des indices complexes (cls) qui identifient les valeurs des
cases et permettent de trouver un lment en un seul accs au tableau
solution optimum quant au temps de recherche, mais trs inefficace quant
l'occupation mmoire
problme d'ambiguits potentielles grer

Compromis entre les deux : le hachage


Licence Informatique - Semestre 2 - Algorithmique et Programmation 7

Table de hachage (1/2)


Principe d'une table de hachage :
les lments sont identifis par leurs cls mais placs dans un tableau indic
par des entiers
pour savoir dans quelle case placer un lment, on utilise une fonction de
hachage qui toute cl associe un entier
la place occupe en mmoire est faible compare un tableau associatif,
mais l'accs une case demande un petit calcul (moins gourmand
gnralement que la comparaison de grosses cls)

cl cl cl cl
"Toto" "Tutu" "Titi" "Tata"
Fonction de hachage

Table de hachage
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14

Personne Personne Personne Personne


Toto Tutu Titi Tata
Licence Informatique - Semestre 2 - Algorithmique et Programmation 8
Table de hachage (2/2)
Exemple : on doit ranger dans un tableau N enregistrements de
type Personne et on veut utiliser les noms des personnes comme
cls (en supposant qu'il n'y a pas d'homonyme)
une manire de hacher les noms consiste construire une reprsentation
numrique des noms l'aide des codes ASCII des caractres, puis prendre
pour indice ce nombre modulo N
pour chaque nom x, de longueur l, l'indice de l'enregistrement correspondant
sera :

h(x) = (i=1..l x[i] Bl-i) mod N

o B est un nombre choisi plus grand que N et premier gnralement


pour un tableau de 5 cases (N=5), on aura pour hachage des chaines "Toto"
"Titi" et "Tutu" les valeurs 2, 0 et 4

Licence Informatique - Semestre 2 - Algorithmique et Programmation 9

Fonction de hachage
L'idal est que la fonction de hachage soit injective :
deux cls diffrentes ont deux indices de hachage diffrents
il n'y a pas d'ambiguit lors d'un accs
en cryptographie, cette contrainte est forte (la fonction doit tre quasiment
injective)

Si la fonction de hachage n'est pas injective, il peut y avoir deux


cls diffrentes qui ont la mme valeur de hachage
on parle de collision : l'accs l'lment partir de sa cl peut conduire un
autre lment
c'est le cas de beaucoup de fonctions de hachage car le nombre de cls
possible est souvent plus grand que la quantit d'indices utiliss
le but tant d'acclrer l'accs aux lments, plutt que d'alourdir le calcul
pour avoir une fonction injective, on complexifie la structure de donnes pour
rsoudre les collisions

Licence Informatique - Semestre 2 - Algorithmique et Programmation 10


Rsolution des collisions
Chainage externe (ou spar ou ouvert) : chaque case du tableau
contient non pas un lment mais la liste des lments dont la cl
a pour valeur de hachage l'indice de la case
problme : la recherche se fait sur deux niveaux et n'est plus immdiate

0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14

toto | titi | tutu riri | fifi | loulou

Chainage ferm : on met les lments ayant mme valeur de


hachage dans d'autres cases disponibles. Plusieurs stratgies :
sondage linaire : on place les lments dans des cases contigues, et pour
les retrouver, on parcourt squentiellement les cases contigues
hachage double : une deuxime fonction de hachage dtermine la case o
sera placer l'lment, et permet de le retrouver
sondage quadratique : on place les lments dans des cases situes une
distance qui dpend quadratiquement de l'indice
....
Licence Informatique - Semestre 2 - Algorithmique et Programmation 11

Table de hachage en Java


EnJava, la classe Hashtable implmente une table de hachage.
// cration d'une table de hachage avec cls de type chaine et valeurs
// de type Personne
Hashtable<String,Personne> ht = new Hashtable<String,Personne>();

// ajout d'une valeur dans la table : cl "Toto", valeur : une Personne


Personne toto = new Personne("Toto", "Robert", 24);
ht.put("Toto",toto);

// rcuprer la valeur associe la cl "Toto"


Personne p = ht.get("Toto");

Les cls utilises doivent tre des objets ayant un code de


hachage. Ce code est retourn par la mthode hashCode()

Exemple : la classe String possde cette mthode


String totoName = new String("Toto");
totoName.hashCode(); // retourne 2612822
int index = totoName.hashCode()%5; // index vaut 2

Licence Informatique - Semestre 2 - Algorithmique et Programmation 12


Recherche par dichotomie (1/3)
La structure de donnes utilise influe sur l'efficacit de la
recherche d'un lment, mais la stratgie de recherche peut
galement jouer sur l'efficacit

Principe de la recherche par dichotomie (du grec dikhotomia,


division en deux parties gales) ou recherche binaire :
on spare en deux parties gales les donnes d'entre
on relance la recherche sur chacune des parties ou sur une seule

Dans le cas gnral, si on doit relancer la recherche sur les deux


parties, a n'apporte rien en terme d'efficacit

L'intrt apparait si on peut ne traiter qu'une des sous parties


dans la recherche d'un lment dans un tableau, si le tableau est tri, on peut
ne traiter qu'une des sous parties
Licence Informatique - Semestre 2 - Algorithmique et Programmation 14
Recherche par dichotomie (2/3)
On travaille sur les cases d'indices compris entre i et j. Cet
intervalle est divis par 2 chaque itration.
// cette fonction renvoie vrai si x est prsente dans tab, faux sinon
// le tableau tab est suppos tri par ordre croissant
fonction avec retour boolen rechercheElement3(chaine[] tab, chaine x)
entier i, j;
dbut
i <- 0;
j <- tab.longueur-1;
tantque (i <= j) faire
si (tab[(j+i)/2] = x) alors
retourne VRAI;
sinon
si (tab[(j+i)/2] > x) alors
j <- (j+i)/2 - 1;
sinon
i <- (j+i)/2 + 1;
finsi
finsi
fintantque
retourne FAUX;
fin

Licence Informatique - Semestre 2 - Algorithmique et Programmation 15

Recherche par dichotomie (3/3)


Exemple : on applique l'algorithme prcdent sur un tableau tri
d'entiers et on cherche si 490 est prsent dans le tableau.

4 | 17 | 25 | 26 | 45 | 45 | 87 | 102 | 234 | 237 | 490 | 1213 | 5681 | 5690 | 7012

234 | 237 | 490 | 1213 | 5681 | 5690 | 7012

234 | 237 | 490

490

Licence Informatique - Semestre 2 - Algorithmique et Programmation 16


Recherche par interpolation (1/2)
Remarque : si on cherche zbre dans le dictionnaire, on ouvre le
dictionnaire vers la fin, pas au milieu

Recherche par interpolation : on amliore la dichotomie en


cherchant couper le tableau non pas au milieu, mais un
endroit proche de la valeur cherche
cela ncessite de pouvoir valuer (par interpolation) la position probable de la
valeur cherche, et donc que la rpartition des valeurs suive peu prs une
fonction connue

Si on suppose une rpartition ordonne et linaire des valeurs


dans le tableau, on peut interpoler linairement la place de
l'lment recherch
si tab est le tableau et e l'lment cherch, l'indice de e est interpol par

(e tab[0]) * tab.longueur/(tab[tab.longueur 1] tab[0])

Licence Informatique - Semestre 2 - Algorithmique et Programmation 17

Recherche par interpolation (2/2)


Dans le tableau jaune, la formule d'interpolation linaire donne 1
comme indice probable de 490 (l'indice rel est 11)
Dans le tableau rouge, la formule d'interpolation linaire donne 8
comme indice probable de 71 (l'indice rel est 8)
4 | 17 | 25 | 26 | 45 | 45 | 87 | 102 | 234 | 237 | 490 | 1213 | 5681 | 5690 | 7012
8000 140

7000 120

6000 100

5000
80
4000
60
3000
40
2000
20
1000

0 0
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14

4 | 17 | 25 | 26 | 45 | 45 | 63 | 71 | 77 | 89 | 98 | 101 | 104 | 112 | 124


Licence Informatique - Semestre 2 - Algorithmique et Programmation 18

Anda mungkin juga menyukai