0% ont trouvé ce document utile (0 vote)
152 vues3 pages

Probabilités et Hachage en Informatique

Ce document contient la correction d'exercices sur les tables de hachage. Il présente plusieurs exercices portant sur le calcul de probabilités de collision, l'implémentation de tables de hachage ouvertes avec sondage et la gestion de la réorganisation lorsque la table devient pleine.

Transféré par

degey
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Thèmes abordés

  • taille dynamique,
  • collisions,
  • modèle de données,
  • probabilité d'agrégation,
  • recherche de données,
  • gestion des ressources,
  • gestion de la mémoire,
  • algorithmes de tri,
  • chaînes de hachage,
  • complexité spatiale
0% ont trouvé ce document utile (0 vote)
152 vues3 pages

Probabilités et Hachage en Informatique

Ce document contient la correction d'exercices sur les tables de hachage. Il présente plusieurs exercices portant sur le calcul de probabilités de collision, l'implémentation de tables de hachage ouvertes avec sondage et la gestion de la réorganisation lorsque la table devient pleine.

Transféré par

degey
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Thèmes abordés

  • taille dynamique,
  • collisions,
  • modèle de données,
  • probabilité d'agrégation,
  • recherche de données,
  • gestion des ressources,
  • gestion de la mémoire,
  • algorithmes de tri,
  • chaînes de hachage,
  • complexité spatiale

option informatique

Chapitre 10
Correction des exercices


Exercice 1  La probabilité qu’il n’y ait pas de collision est égale à :

k−1
m × (m − 1) × · · · × (m − k + 1) Y i 
p= k
= 1− .
m m
i=1

k−1
Y  k(k − 1) 
−x
On utilise l’inégalité de convexité : e e−i/m = exp −
> 1 − x pour majorer : p 6 .
2m
i=1

1 k(k − 1) 2 1 + 1 + 8m ln 2
Ainsi, on a p 6 dès lors que > ln 2 ⇐⇒ k − k − 2m ln 2 > 0 ⇐⇒ k > .
2 2m 2


Exercice 2 
a) Les valeurs de hachage sont les suivantes :

c 5 28 19 15 20 33 12 17 10
c mod 9 5 1 1 6 2 6 3 8 1

Trois collisions ont lieu ; sachant que l’insertion se fait en queue de liste (en tout cas pour les primitives que
nous avons écrites en cours) on obtient la répartition suivante :

[17]
[]
[15; 33]
[5]
[]
[12]
[20]
[28; 19; 10]
[]

b) Si la répartition dans le tableau est uniforme, la valeur moyenne des longueurs des listes de chaque
k
emplacement est égale à . La recherche d’une clé non présente dans la table nécessite le parcours de la liste
m
k
 
dans son entier, ce qui conduit à une durée moyenne en Θ .
m
1 k/m(k/m + 1) k/m + 1
c) La durée moyenne de recherche de c est égale à × = . La recherche d’une clé
k/m  2 2
k
présente dans la table a donc une durée moyenne elle aussi en Θ .
m
d) lorsque k = O(m) la recherche d’une clé dans la table a un coût en moyenne en Θ(1), c’est à dire un coût
constant.

[Link]
10.2 option informatique


Exercice 3 
a) Les valeurs de hachage sont les suivantes :

c 5 28 19 15 20 33 12 17 10
c mod 9 5 1 1 6 2 6 3 8 1
2 3 7 4 0

(sous les collisions sont indiquées les résolutions après sondage).


La répartition des clés est donc la suivante :

10 28 19 20 12 5 15 33 17

b) On définit ainsi les fonctions demandées :

let find t c =
let rec sonde i = match [Link].(i) with
| Nil −> raise Not_found
| Data d when [Link] = c −> [Link]
| _ −> sonde (t.H (i+1))
in sonde (t.H c) ;;

let add t c v =
let rec sonde i = match [Link].(i) with
| Nil −> [Link].(i) <− Data {Key = c ; Value = v}
| _ −> sonde (t.H (i+1))
in sonde (t.H c) ;;

c) Si certaines clés sont supprimées de la table, un sondage risque de se terminer avant qu’une clé soit trouvée,
même si celle-ci figure dans la table. Pour remédier à ce problème, une solution possible consiste pour une
recherche à distinguer les cases vides (qui occasionnent la fin du sondage) des cases effacées (qui ne mettent pas
fin au sondage).
Concrètement, il faut redéfinir le type (’a, ’b) data de la façon suivante :

type (’a, ’b) item = Nil | Erased | Data of (’a, ’b) data ;;

La fonction find n’a pas besoin d’être redéfinie, et on lui ajoute :

let add t c v =
let rec sonde i = match [Link].(i) with
| Nil | Erased −> [Link].(i) <− Data {Key = c ; Value = v}
| _ −> sonde (t.H (i+1))
in sonde (t.H c) ;;

let remove t c =
let rec sonde i = match [Link].(i) with
| Nil | Erased −> ()
| Data d when [Link] = c −> [Link].(i) <− Erased
| _ −> sonde (i+1)
in sonde (t.H c) ;;

d) Si on suppose le hachage uniforme, la probabilité qu’une case précédée d’une case vide soit désignée pour
1
accueillir une clé donnée est égale à , tandis qu’une case précédée de k cases pleines a une probabilité égale à
m
k+1
, puisque la désignation de l’une quelconque des k cases précédentes affecte la clé à cette case.
m
Ceci a pour conséquence que plus la succession de cases pleines est longue, plus grande est la probabilité
d’agrandir encore cette chaîne, ce qui conduit à la formation d’agrégats. Or plus longue est la chaîne, plus long
est le sondage ; ce phénomène contribue donc à ralentir la lecture et l’ajout dans une table d’association.
Correction des exercices 10.3


Exercice 4 
a) Les deux fonctions demandées sont semblables à celles du cours :

let new m = {Size = 0 ; H = (function x −> x mod m) ; Tbl = make_vect m []} ;;

let find t c =
let rec aux = function
| [] −> raise Not_found
| d::_ when [Link] = c −> [Link]
| _::q −> aux q
in aux [Link].(t.H c) ;;

b) On double la taille de la table à l’aide de la fonction suivante :

let reorder t =
let old = [Link] in
let m = vect_length old in
[Link] <− make_vect (2*m) [] ;
t.H <− (function x −> x mod (2 * m)) ;
let rec aux = function
| [] −> ()
| d::q −> aux q ;
let i = t.H [Link] in
[Link].(i) <− d::[Link].(i)
in for k = 0 to m − 1 do aux old.(k) done ;;

La fonction d’ajout prend alors la forme suivante :

let add t c v =
let n = [Link] and m = vect_length [Link] in
if n >= 2 * m then reorder t ;
let i = t.H c in
[Link] <− [Link] + 1 ;
[Link].(i) <− {Key = c ; Value = v}::[Link].(i) ;;

c) Enfin, pour la fonction de suppression il faut tenir compte du fait pour maintenir le champ Size à jour que
l’élément qu’on cherche à supprimer peut éventuellement ne pas se trouver dans la table. On utilise pour cela
le mécanisme de déclenchement d’une exception.

let remove t c =
let i = t.H c in
let rec aux = function
| [] −> raise Not_found
| d::q when [Link] = c −> q
| d::q −> d::(aux q)
in try
[Link] <− [Link] − 1 ;
[Link].(i) <− aux [Link].(i)
with Not_found −> () ;;

 


[Link]

Vous aimerez peut-être aussi