• Aucun résultat trouvé

Structures de données et algorithmes

N/A
N/A
Protected

Academic year: 2022

Partager "Structures de données et algorithmes"

Copied!
54
0
0

Texte intégral

(1)

Structures de données et algorithmes

Chapitre 5

Algorithmes de

recherche

(2)

5 Algorithmes de recherche

l

On présente dans ce chapitre, les différentes méthodes de recherche.

l

Nous avons déjà vu sommairement les méthodes de recherche pour les différents types de liste et les arbres de recherche binaire.

l

Un bref rappel nous amènera vers un nouveau TDA, la table.

l

Avec une conception appropriée, les tables permettent de réaliser les recherches (aussi bien que les insertions et les suppressions) en O(1).

l

Cette performance remarquable est due spécialement à une

technique bien adaptée aux tables: le hachage.

(3)

3

5 Algorithmes de recherche

5.1 Méthode de recherche

l

La forme générale d’une forme de recherche est : Search(Item, Found)

On suppose que la collection de données qu’on traite est un ensemble d’éléments.

S’il existe un élément dans cette collection qui est égal à Item, alors celui-ci est copié dans Item et Found prend la valeur de true.

Sinon, Item reste inchangé et Found prend la valeur false.

Dans un tel algorithme on doit estimer les temps de recherche

l TimesN est le temps moyen de recherche réussie sur une collection de N éléments

l TimeuN est le temps moyen de recherche échouée sur une collection de N éléments

(4)

5 Algorithmes de recherche

5.1 Méthode de recherche

l

Dans le cas des TDA ordonné, la méthode de recherche possède un troisième paramètre en plus des paramètres Item et Found.

Search(Item, Found, Position)

Après une recherche réussie, Position contient la position dans la liste de l’élément égal à Item (il peut avoir aussi plus d’un élément qui lui sont égaux).

Après une recherche échouée dans une liste ordonnée, Position contient la position où doit appartenir Item dans la liste.

l

Soit la liste suivante : [1, 4, 7, 9]

Search(5, &Found, &Position)

(5)

5

5 Algorithmes de recherche

5.1 Méthode de recherche

l

On appel la clé le champ (ou les champs) qui permet l’identification des éléments d’une manière unique.

l

Prenons l’exemple d’une liste d’employés, on utilisera un numéro d’identification qui permettra d’identifier de façon unique chaque employé. Comme, par exemple, un numéro d’employé.

Si on recherche l’employé dont l’ID est 24096 on devra procéder comme suit :

l Si les données sont organisées : Employe.ID = 24096;

Search(&Employe, &Found, &Position);

l Si les données ne sont pas organisées : Employe.ID = 24096;

Search(&Employe, &Found);

(6)

5 Algorithmes de recherche

5.1.1 Recherche séquentielle

l Dans une recherche séquentielle on accède du premier au dernier élément jusqu’à ce que l’élément désiré soit trouvé ou qu’on soit certain que cet élément n’appartienne pas à la collection de données.

l Puisque la méthode de recherche est linéaire, celle-ci est généralement appliquée aux listes.

l Pour une recherche réussie, le nombre moyen d’itérations est approximativement N/2. C’est-à-dire Times(N) = O(N).

l Dans le cas des listes ordonnées, la recherche échoue une fois qu’on accède à un élément qui est plus grand que l’élément recherché. Ainsi, nous avons un nombre moyen d’itération de N. Ce qui donne encore Timeu(N) = O(N).

l Dans le cas des listes non ordonnées, on doit accéder à tous les éléments avant de conclure que l’élément recherché n’est pas dans la liste. Ainsi, Timeu(N) = O(N).

(7)

7

5 Algorithmes de recherche

5.1.2 Recherche binaire ou dichotomique

l Cette technique a été développée conjointement avec une conception contiguë du TDA liste ordonnée.

l Le nombre d’itérations (ou d’appels récursifs) dans une recherche est approximativement O(logN).

l Pour une recherche échouée, l’exécution de la boucle d’itération (ou des appels récursifs) continue jusqu’à ce qu’on découvre que l’élément

recherché n’est pas égal à l’élément de la liste de taille 1. Nous avons donc Timeu(N) = O(log2N) puisque le nombre d’itération correspond, pour chaque itération, à N/2.

l Il est à noter que le temps moyen pour une recherche échouée est quasiment similaire à celui d’une recherche réussie.

(8)

5 Algorithmes de recherche

5.1.3 Arbre de recherche binaire

l

Comme nous avons vu au chapitre précédent, le temps pour une recherche réussie ou échouée dépend de la forme de l’arbre.

l

Dans le cas d’un arbre de recherche binaire parfaitement équilibré, l’analyse est la même que celle de la recherche binaire d’une liste contiguë.

l

En général, le meilleur cas se produit quand l’arbre est parfaitement équilibré, à l’exception possible du dernier niveau de l’arbre.

l

Ainsi, la hauteur de l’arbre est log

2

N et Time

s

(N) = Time

u

(N) = O(log

2

N).

l

Dans le pire des cas, l’arbre de recherche binaire est une chaîne et la recherche est séquentielle. Time

s

(N) = Time

u

(N) = O(N).

l

Par contre, la hauteur moyenne d’un arbre de recherche binaire est

logN ainsi Time (N) = Time (N) = O(logN).

(9)

9

5 Algorithmes de recherche

5.2 Le TDA table

l Nous avons défini le concept de clé, c’est-à-dire la collection d’un champ ou plus permettant d’identifier un élément de façon unique.

l Ainsi, puisque deux éléments ne peuvent avoir la même clé, on utilise la clé comme référence et non l’élément pris dans son entier.

l L’importance de la clé augmente avec l’augmentation du rapport:

Te/Tc (où Te est la taille en octets de l’élément et Tc est la taille de la clé).

l Le TDA table permet de bénéficier de l’efficacité des clés et de l’avantage de leurs utilisations par rapport aux éléments pris en entier.

l Voici un exemple où les éléments sont des étudiants ayant un champ nom, un champ GPA (pour la moyenne cumulative) et un champ clé.

3.91 80019

Colleen Dayton

3.89 35183

Vikram Bedi

3.77 51597

Raju Meyappan

GPA ID

Nom

(10)

5 Algorithmes de recherche

5.2 Le TDA table

l La table est spécifiquement une fonction, un ensemble de paires ordonnées de la forme (clé, élément). Parce que l’ensemble est non ordonné, la table ne possède aucun ordre implicite.

l Par exemple, la représentation logique suivante est équivalente à celle présentée précédemment.

3.89 35183

Vikram Bedi

3.77 51597

Raju Meyappan

3.91 80019

Colleen Dayton

GPA ID

Nom

(11)

11

5 Algorithmes de recherche

5.2 Le TDA table

l Bien sur, si les clés sont ordonnées, on peut penser que la table le soit également. Mais cet ordre est dans nos têtes et non dans la table.

l De la même manière, on peut imaginer la table comme une matrice, mais une table est une construction logique alors qu’une matrice est une

conception ou une implantation.

l Par conséquent, il serait sage de faire abstraction du quoi et du comment.

(12)

5 Algorithmes de recherche

5.2 Le TDA table

l Que doit apporter la TDA Table à ses utilisateurs?

mettre à vide une table;

tester si une table est vide;

déterminer la taille d’une table;

copier une table dans une autre;

parcourir une table (peu importe l’ordre d’accès des éléments, il apparaissent de façon aléatoire);

chercher un élément dans la table;

insérer un élément dans la table;

(13)

13

5 Algorithmes de recherche

5.2 Le TDA table

l

Définition du TDA table :

Nous supposons qu’un utilisateur du TDA table demande :

l Un élément Item avec une méthode KeyOf qui retourne la clé de cet élément

l MaxTableSize, le maximum d’éléments permis dans la table.

Deux fonctions clés qui sont reliées

l KeyNumber(Key) qui retourne un entier non négatif correspondant à la clé

l EqualKeys(Key1, Key2) qui retourne false ou true suivant que Key1 et Key2 sont égaux ou non.

(14)

5 Algorithmes de recherche

5.2 Le TDA table

l

Définition du TDA table :

Il y a huit méthodes pour le TDA table :

1. Initialize

Postcondition: La table est vide

2. IsEmpty

Postcondition: True est retourné si la table est vide, sinon false est retourné.

3. Size

Postcondition: Le nombre d’élément dans la table est retourné

(15)

15

5 Algorithmes de recherche

5.2 Le TDA table

4. Search(Item, Found)

Postcondition: S’il y a un élément dans la table de même clé que celle de Item, alors cet élément est copié dans Item et Found

possède la valeur de true. Sinon Item reste inchangé et Found est mis à false.

5. Insert(Item)

Précondition: Le nombre d’élément dans la table est inférieur à MaxTableSize. Il n’y a aucun élément de la table possédant la même clé que Item.

Postcondition: Item est inséré dans la table, c’est-à-dire la paire Item et sa clé sont rajouté au nombre de paires ordonnées dans la fonction.

(16)

5 Algorithmes de recherche

5.2 Le TDA table

6. Delete(Item)

Précondition: Il y a un élément dans la table qui possède la même clé que Item.

Postcondition: L’élément de même clé est supprimé de la table.

7. CopyTo(NewTable)

Postcondition: NewTable est une copie distincte de la table.

8. Traverse(Visit)

Postcondition: La table est parcourue; l’action appliquée à chaque élément visité est décrite par le sous-algorithme utilisateur Visit.

(17)

17

5 Algorithmes de recherche

5.2 Le TDA table

l

Implantation du TDA table

On peut utiliser les conceptions chaînées, multi-chaînées ou contiguës déjà vues dans les chapitres précédents. Cependant, si les éléments sont non ordonnés, on aura besoin de la recherche séquentielle qui nécessite un temps 0(N). Même si les éléments sont ordonnés, le meilleur temps qu’on peut avoir est 0(log N) dans la recherche. À ce point, il n’y a pas de raison qu’une amélioration soit possible.

Le reste de ce chapitre est de montrer qu’à travers la technique du hachage, on peut accomplir la recherche (insertions et suppressions) dans la table en un temps virtuel 0(1). Une fois qu’on a défini ce qu’est le hachage et comment il fonctionne, les conceptions des méthodes de la table vont être relativement simples.

(18)

5 Algorithmes de recherche

5.3 Hachage

l

Exemple :

On a MaxTableSize à 1000

Chaque élément consiste en un champ nom et un champ clé de 3 chiffres représentant un ID. Après initialisation on a la table suivante.

? ? False

ID IsOccupied Name

0

? ? False

1

? ? False

2

? ? False

3

... ... ...

...

? ? False

999

0 N

(19)

19

5 Algorithmes de recherche

5.3 Hachage

l

Suivant le dernier exemple, à quel indice devrons-nous stocker l’élément ayant comme clé 251? Un choix trivial est l’indice 251.

Les avantages sont nombreux.

L’élément peut être posté directement dans la matrice sans accéder à aucun autre élément.

La recherche de l’élément en question ne nécessite que l’accès à la cellule 251.

L’élément peut être supprimé directement sans accéder à d’autres éléments.

(20)

5 Algorithmes de recherche

5.3 Hachage

l

La figure suivante montre à quoi ressemble la table après l’insertion de trois éléments possédant comme clés 251, 118 et 335.

? ? False

ID IsOccupied Name

0

? ? False

1

? ? False

2

... ... ...

...

3 N

Chu, Sung-Chi 118 True

118

... ... ...

...

Schivar, James 251 True

251

... ... ...

...

Long, Douglas 335 True

335

... ... ...

...

(21)

21

5 Algorithmes de recherche

5.3 Hachage

l

Jusqu’à présent, ce n’est pas grand chose. Maintenant, supposer que MaxTableSize vaut toujours 1000, mais que chaque élément possède un champ nom et un champ Numéro d’Assurance Sociale qui sert de champ clé.

l

Afin de permettre un accès rapide, on peut utiliser les trois chiffres

les plus à droite du NAS comme clé.

(22)

5 Algorithmes de recherche

5.3 Hachage

l Nous obtenons la table de hachage suivante après deux insertions.

l On remarque qu’il y a un problème avec ce schéma. Deux clés différentes peuvent avoir les trois mêmes chiffres les plus à droite (exemple : 214-30-3261 et 814-02- 9261). De telles clés en collision s’appellent des synonymes. Pour palier à ce

Clemens, Roger 033-51-8000 True ID IsOccupied Name

0

? ? False

1

? ? False

2

... ... ...

...

? ? False

999

2 N

Chu, Sung-Chi 214-30-3261 True 261

... ... ...

...

(23)

23

5 Algorithmes de recherche

5.3 Hachage

l Le hachage est le processus de transformation de la clé en une adresse. La

transformation inclut des calculs rapides sur la clé et le procédé qui permet de régler le cas de collision. Ce procédé est présenté dans la prochaine section.

l Pour le moment, on insiste sur les opérations de calcul effectuées sur la clé. Pour une clé de type entier, l’opération peut être: Key mod TableSize; c’est-à-dire, le reste de la division de la clé sur la taille de la table.

l Ainsi, dans une table avec taille maximale de 1000, l’opération modulo implique les trois chiffres les plus à droite. Les trois chiffres les plus à droite dans le NAS sont distribués d’une manière équitable sur la population. La probabilité qu’un NAS d’un individu choisi aléatoirement doit avoir 251 comme 3 chiffres les plus à droite et à peu près 1 sur 1000.

(24)

5 Algorithmes de recherche

5.3 Hachage

l Qu’est-ce qui se passe si on a choisi comme indice les 3 chiffres les plus à gauche?

Ces chiffres sont utilisés pour coder la région d’enregistrement des individus pour la carte NAS. Si la plupart des individus sont de la même région, on aura alors

beaucoup de collisions. Comme on va le voir, le hachage fonctionne bien quand la transformation minimise le nombre de collisions.

l Selon la nature des informations, les chiffres les plus à droite ne donnent pas toujours satisfaction. Par exemple, supposer qu’une application d’un magasin dans une

corporation utilise comme clé les 4 chiffres les plus à droite dans une matrice de 10000 éléments. Si les 4 chiffres les plus à droite désignent le nombre associé du magasin, alors chaque clé correspond au même indice.

(25)

25

5 Algorithmes de recherche

5.3 Hachage

l Clés de type non entier

Comment se fera le calcul d’une adresse si les clés sont des chaînes de caractéres? Pour ce faire on applique l’algorithme suivant :

KeyNumber(Key) {

HashTotal = 0;

for(i = 0; I < Length(Key); i++) {

HashTotal = HashTotal * 3 + Ord(Key[i]);

}

return HashTotal;

}

(26)

5 Algorithmes de recherche

5.3 Hachage

l Voici un exemple du hachage pour la clé "TOP" :

Charactère Valeur ordinale HashTotal 0

T 84 0*3 + 84 = 84

O 111 84*3 + 111 = 363

P 112 363*3 + 112 = 1201

Le facteur de multiplication 3 dans les calculs des totaux partiels sert comme degré de dispersion.

(27)

27

5 Algorithmes de recherche

5.3 Hachage

l Il est à noter que le hachage de la chaîne de caractères “RUP” donne aussi 1201. Donc deux clés différentes peuvent posséder la même valeur et provoquer une collision.

l On doit considérer le problème de collision comme une partie intégrante de la fonction de hachage. Nous allons investiguer deux approches :

l’adressage ouvert et le chaînage.

(28)

5 Algorithmes de recherche

5.3 Hachage

l L’adressage ouvert

L’adressage ouvert règle le problème des collisions comme suit :

À l’apparition d’une collision, la recherche d’une adresse libre est déclenchée selon une certaine stratégie.

L’idée simple serait d’ajouter 1 à l’adresse jusqu’à trouver une cellule libre.

(29)

29

5 Algorithmes de recherche

5.3 Hachage

l Voici l’algorithme correspondant :

Hash(Key) {

Adresse = KeyNumber(Key) % TableSize;

Probe = 0; Done = False;

while (Probes < TableSize && !Done) { if (!A[Adresse].IsOccupied)

Done = True;

else

if (EqualKeys(Key, A[Adresse].Item.KeyOf) Done = True;

else {

Adresse = (Adresse + 1) % TableSize;

Probes++;

} }

return (Adresse);

} /*Fin de Hash*/

(30)

5 Algorithmes de recherche

5.3 Hachage

l Reprenons l’exemple de 1000 éléments avec le NAS comme clé pour chaque élément. Supposer que les clés des éléments à stocker sont :

214-30-3261 033-51-8000 214-19-9528 819-02-9261 033-30-8262 215-09-1766

(31)

31

5 Algorithmes de recherche

5.3 Hachage

l Les 3 premiers appels,

retournent les adresses 261,000 et 528, respectivement et les éléments correspondants vont être stockés dans ces adresses.

l Quand 819-02-9261 est haché, l’adresse retournée est 262 puisque A[261] est occupé.

l Quand 033-30-8262 est haché, l’adresse retournée est 263.

l Quand 214-17-1261 est haché, c’est l’adresse 264 qui est

retourné.

l Le dernier élément est posté dans les cellules 766.

- 033-51-8000 True

ID IsOccupied Name

0

? ? False

1

? ? False

2

... ... ...

...

? ? False

999

7 N

- 214-30-3261 True

261

... ... ...

...

- 819-02-9261 True

262

- 033-30-8262 True

263

- 214-17-1261 True

264

... ... ...

...

- 214-19-9528 True

528

... ... ...

...

- 215-09-1766 True

766

(32)

5 Algorithmes de recherche

5.3 Hachage

l Supposer qu’on veuille supprimer l’élément ayant pour clé 214-30-261; le champ IsOccupied à l’adresse est mis à False.

l Mais, qu’est-ce qui se passe si on cherche l’élément ayant comme clé 819-02-9261?

Étant donné que l’adresse 261 est inoccupée, on va incorrectement conclure qu’il n’y a aucun élément dans la table dont la clé est 819-02-9261.

l Pour résoudre ce problème, on va rajouter un autre champ, WasDeleted pour chaque composante dans la matrice A. Initialement, chaque champ WasDeleted prend la valeur False. Cette valeur est mise à False durant une insertion et à True durant une suppression. La figure suivante illustre l’effet de la suppression de l’élément dont la clé est 214-30-3261, à partir de la table précédemment montrée. Le résultat

du hachage de 819-02-3261, retourne correctement l’adresse 262, cependant, la recherche de l’élément associée est faite avec succès.

(33)

33

5 Algorithmes de recherche

5.3 Hachage

- 033-51-8000 True

ID IsOccupied Name

0

? ? False

1

? ? False

2

... ... ...

...

? ? False

999

6 N

- 214-30-3261 False

261

... ... ...

...

- 819-02-9261 True

262

- 033-30-8262 True

263

- 214-17-1261 True

264

... ... ...

...

- 214-19-9528 True

528

... ... ...

...

- 215-09-1766 True

766

False WasDeleted

False False

...

False True

...

False False False

...

False

...

False

(34)

5 Algorithmes de recherche

5.3 Hachage

l Voici la version correcte de l’algorithme de hash :

Hash(Key) {

KeyNum = KeyNumber(Key);

Adresse = KeyNum % TableSize;

Probes = 0; Done = False;

while (Probes < TableSize && !Done) {

if (A[Adresse].IsOccupied || EqualKeys(Key, A[Adresse].ItemKeyOf)) Done = True;

else

if (!A[Adresse].IsOccupied && !A[Adresse].WasDeleted) Done = True;

else {

Adresse = (Adresse + 1) % TableSize;

Probes++;

} }

(35)

35

5 Algorithmes de recherche

5.3 Hachage

l

Regroupement « Clustering »

Comme nous l’avons déjà mentionné, si nous avions choisi à la place, les 3 chiffres les plus à gauche, on aurait plusieurs regroupements (dans l’exemple précédent,

commençant à l’indice 214).

Ce phénomène est connu comme regroupement primaire, à la condition d’avoir un nombre considérable de clés donnant la même adresse.

Par contre, la fonction que nous avons utilisée dans la section précédente crée un regroupement secondaire.

Par exemple, si on commence avec la table définie précédemment, une nouvelle clé qui hache 261, 262, 263 ou 264, doit visiter la cellule 265 pour en trouver une de libre.

Ainsi, toute méthode de hachage qui occasionne un regroupement secondaire est inefficace car elle induit une recherche séquentielle.

(36)

5 Algorithmes de recherche

5.3 Hachage

l

« Quotient offsets »

Le regroupement secondaire peut être résolu en utilisant « l’offset de quotient » dans l’adressage ouvert. Pour une clé donnée, l’adresse initiale est égale au reste de la division de la clé par la taille de la table, et l’offset est égal au résultat (entier) de la division de la clé par la taille de la table.

Étant donné que le quotient est indépendant du reste de la division, deux clés avec le même reste doivent avoir vraisemblablement deux quotients différents ou deux offsets différents. Ainsi, la fonction de Hash est changée pour la version suivante.

(37)

37

5 Algorithmes de recherche

5.3 Hachage

Hash(Key) {

KeyNum = KeyNumber(Key);

Adresse = KeyNum % TableSize;

Offset = KeyNum / TableSize;

Probes = 0;

if (!(Offset % TableSize)) Offset = 1;

while (Probes < TableSize && !Done) {

if (A[Adresse].IsOccupied && EqualKeys(Key, A[Adresse].Item.KeyOf) Done = True;

else

if (!A[Adresse].IsOccupied && !A[Adresse].WasDeleted) Done = True;

else {

Adresse = (Adresse + Offset) % TableSize;

Probes++;

} } return

(38)

5 Algorithmes de recherche

5.3 Hachage

l

« Quotient offsets »

Il faut faire attention aux boucles infinies. C’est pourquoi Offset est remis à 1 s’il est multiple de TableSize.

Exemple : Si Key = 157-00-0425 Adresse = 425

Offset = 157000

Si on utilise 157000 comme valeur de offset et que la cellule 425 est occupée par un élément de clé différente, le calcul :

Adresse = (Adresse + Offset) % TableSize

= (425 + 157000) % 1000

= 425

En d’autre terme l’adresse reste inchangée. C’est pourquoi dans ces cas on utilise 1 comme Offset.

(39)

39

5 Algorithmes de recherche

5.3 Hachage

l

« Quotient offsets »

Pour illustrer l’effet de l’adressage ouvert avec offset de quotient, supposer qu’on veut poster dans une table vide les éléments avec les clés suivantes :

Key Adresse initiale Offset

214-30-3261 261 214303

191-24-4261 261 191244

530-56-4261 261 530564

Le premier élément est posté à l’adresse 261.

Pour la seconde clé, la boucle while dans la fonction Hash est exécutée deux fois.

À la fin de l’itération l’élément sera posté à l’adresse 505 : Adresse = (Adresse + Offset) % TableSize

= (261 + 191244) % 1000

= 505

(40)

5 Algorithmes de recherche

5.3 Hachage

l

« Quotient offsets »

Pour la troisième clé, à la fin de la première itération de la boucle while : Adresse = (Adresse + Offset) % TableSize

= (261 + 530564) % 1000

= 825

Ainsi, cet élément sera posté à l’adresse 825.

On remarque qu’avec cette approche Offset-quotient que le regroupement secondaire est évité.

(41)

41

5 Algorithmes de recherche

5.3 Hachage

l Choix de la taille de la table

Nous avons vu dans l’approche “offsets-quotient ” que le problème apparaît quand l’offset est un multiple de la taille de la table.

Exemple: Supposer que la TableSize = 10 et que la clé est décrite par 2 chiffres. Si les deux premiers éléments possèdent les clés 23 et 98, ces éléments vont être postés dans les cellules 3 et 8 respectivement. Si l’élément suivant possède la clé 53, la fonction Hash() devrait assigner :

Adresse = 53 % 10 = 3 Offset = 53 / 10 = 5

(42)

5 Algorithmes de recherche

5.3 Hachage

l

Choix de la taille de la table

Étant donné que la cellule 3 est occupée par l’élément 23, la nouvelle adresse calculée est :

Adresse = (Adresse + Offset) % TableSize Offset = (3 + 5) % 10 = 8

Cependant, la cellule 8 est aussi occupé par l’élément 98, alors une nouvelle adresse est calculée :

Adresse = (Adresse + Offset) % TableSize Offset = (8 + 5) % 10 = 3

(43)

43

5 Algorithmes de recherche

5.3 Hachage

l

Choix de la taille de la table

Maintenant, la cellule 3 est occupée et a déjà été essayée. Ainsi, peu importe le nombre de fois que l’on boucle, seules les cellules 3 et 8 seront sondées.

Ce problème peut être évité en étant certain que la taille de la table et l’offset ne possèdent pas de facteurs communs.

Ceci devient possible en fixant la taille de la table égale à un nombre

premier. Par définition, un nombre premier est un nombre positif qui ne peut se diviser que par 1 et par lui-même. Par exemple : 2, 3, 5, 7, 11, 13, 17, ...

Ainsi, en ayant la taille de la table égale à un nombre premier on est certain qu’il n’y aura pas de facteurs communs avec l’offset.

(44)

5 Algorithmes de recherche

5.3 Hachage

l

Conception du TDA table avec la méthode de hachage par adressage ouvert

1. Initialize

for (i = 0; i < TableSize; i++) { A[i].IsOccupied = False;

A[i].WasDeleted = False;

}

2. IsEmpty

return (N == 0);

3. Size

return N;

(45)

45

5 Algorithmes de recherche

5.3 Hachage

l

Conception du TDA table avec la méthode de hachage par adressage ouvert

4. Search(Item, Found)

Address = Hash(Item.KeyOf);

if (A[Address].IsOccupied &&

EqualKeys(Item.KeyOf, A[Address].Item.KeyOf)) { Item = A[Address].Item

Found = True;

} else {

Found = False;

}

5. Insert(Item)

Address = Hash(Item.KeyOf);

A[Address].Item = Item;

A[Address].IsOccupied = True;

A[Address].WasDeleted = False;

(46)

5 Algorithmes de recherche

5.3 Hachage

l

Conception du TDA table avec la méthode de hachage par adressage ouvert

6. Delete(Item)

Address = Hash(Item.KeyOf);

A[Address].IsOccupied = False;

A[Address].WasDeleted = True;

N--;

7. CopyTo(NewTable)

Initialize(NewTable);

for (i = 0; i < TableSize; i++) if (A[i].IsOccupied)

NewTable.A[i] = A[i];

else if (A[i].WasDeleted)

NewTable.A[i].WasDeleted = True;

(47)

47

5 Algorithmes de recherche

5.3 Hachage

l

Conception du TDA table avec la méthode de hachage par adressage ouvert

8. Traverse(Visit)

for (i = 0; i < TableSize; i++) if (A[i].IsOccupied)

Visit(A[i].Item);

(48)

5 Algorithmes de recherche

5.3 Hachage

l

Méthode par chaînage

Comme on l’a mentionné dans les sections précédentes,

l’adressage ouvert avec la technique « offset de quotient » et la taille de la table comme nombre premier permettent de résoudre le problème des collisions

Une autre manière consiste à stocker dans chaque cellule une liste de tous les éléments ayant comme clés l’adresse de cette cellule. La conception de la table serait, alors:

ListType A[TableSize];

En pratique, ListType est chaînée, c’est pourquoi le nom de la

méthode est dite de chaînage.

(49)

49

5 Algorithmes de recherche

5.3 Hachage

l

Méthode par chaînage

Afin d’illustrer le mécanisme du hachage chaîné, considérer le stockage jusqu’à 1000 éléments en utilisant le NAS comme clé.

La fonction de hachage est Key mod 1000. Avec la technique du chaînage on n’a pas besoin de considérer que la taille de la table doit être un nombre premier.

Chaque cellule contient initialement une liste vide.

Pour le hachage chaîné, la fonction Hash retourne simplement

l’adresse associée à la clé.

(50)

5 Algorithmes de recherche

5.3 Hachage

l

Méthode par chaînage

La figure suivante illustre le résultat de la table chaînée suite à l’insertion de 8 éléments.

A

0 033-51-8000

1 2 ...

261 262 ...

528 ...

766 ...

214-30-3261 033-30-8262 214-19-9528 215-09-1766

019-02-9261 214-17-0261

819-02-9528

8 N

(51)

51

5 Algorithmes de recherche

5.3 Hachage

l

Méthode par chaînage

La conception de certaines méthodes associées au TDA table sont alors simplifiées simplement parce que le vrai travail est transféré à la conception au TDA liste.

Par exemple, la méthode Search du TDA table appelle la méthode Search du TDA liste.

Search(Item, Found) {

Address = Hash(Item.KeyOf);

A[Address].Search(Item, Found, Position);

}

(52)

5 Algorithmes de recherche

5.3 Hachage

l

Méthode par chaînage

Il y a plusieurs avantages de l’adressage par chaînage sur l’adressage ouvert.

1. Les collisions sont facilement (mais séquentiellement ) traitées.

2. Le regroupement secondaire est évité, étant donné que chaque adresse possède sa liste chaînée.

3. On peut poster dans la table plus de TableSize éléments

(53)

53

5 Algorithmes de recherche

5.3 Hachage

l

Méthode par chaînage

Exercice : Laquelle des deux techniques de hachage utilise le plus d’espace, l’adressage ouvert ou le chaînage?

Supposer que chaque élément possède trois entiers, deux

chaînes de 50 caractères et un double. De plus, TableSize est égale à 1000.

Faites les calculs pour l’insertion de 0, 500 et 1000 éléments.

(54)

5 Algorithmes de recherche

5.3 Hachage

l

Estimation de temps pour les méthodes de hachage

Pour une table de N éléments, le facteur de chargement L est défini par : N/(M + 1) où M = TableSize. Ce facteur représente la proportion remplie de la table

Adressage ouvert:

Time

s

(N, M) ≈ 1/L*(1/(1-L)) Time

u

(N, M) ≈ 1/(1-L)

Chaînage:

Time

s

(N, M) ≈ 1 + ½*L

Time

u

(N, M) ≈ L

Références

Documents relatifs

Représenter A∆B sur une figure et déterminer

– Après une recherche réussie, Position contient la position dans la liste de l’élément égal à Item (il peut avoir aussi plus d’un élément qui lui sont égaux).. –

donne les premières valeurs de la fonction de Landau et offre une

Fonctionnement d'une pile La structure de pile permet de retrouver les éléments dans l'ordre inverse de 1 Une structure de file permet de retrouver les éléments dans l'ordre où

b) Sur un tas binaire, écrivez l'algorithme d'un traitement récursif propMax(i) permettant d'assurer qu'à partir de l'indice i chaque élément du tableau est

Pendant la durée des vacances, ou éventuellement d’un week-end (sur demande), nous vous confierons le cahier d’activités de votre enfant pour consultation.. Son

* Il est plus simple d'avertir l'utilisateur qu'il doit entrer les informations dans un fichier texte, dont il assumera la responsabilité. Contenu

Presque tous les amateurs rencontrés, y compris parmi des étudiants avancés faisant leur mémoire de DEA sur ces courants, sont souvent l’illustration d’un mode de vie de