From 7c8c78d5441154920da6b59657bfb8ac39ac15e4 Mon Sep 17 00:00:00 2001 From: Orestis <orestis.malaspinas@pm.me> Date: Tue, 11 Jan 2022 12:49:16 +0100 Subject: [PATCH] added beginning of collisisons --- slides/cours_13.md | 111 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) diff --git a/slides/cours_13.md b/slides/cours_13.md index 48b9498..d0a6720 100644 --- a/slides/cours_13.md +++ b/slides/cours_13.md @@ -353,3 +353,114 @@ h(key) = key % N. Oui comme vous le pensiez au moins `N`. +# Traitement des collisions + +## La collision + +``` +key1 != key2, h(key1) == h(key2) +``` + +## Traitement (une idée?) + +. . . + +* La première clé occupe la place prévue dans le tableau. +* La deuxième (troisième, etc.) est placée ailleurs de façon **déterministe**. + +Dans ce qui suit la taille de la table est `table_size`. + +# La méthode séquentielle + +* Quand l'index est déjà occupé on regarde sur la position suivante, jusqu'à en + trouver une libre. + +```C +index = h(key); +while (table[index].state == OCCUPIED && table[index].key != key) { + index = (index + 1) % table_size; // attention à pas dépasser +} +table[index].key = key; +table[index].state = OCCUPIED; +``` + +## Problème? + +. . . + +* Regroupement d'éléments (clustering). + +# Méthode linéaire + +* Comme la méthode séquentielle mais on "saute" de `k`. + +```C +index = h(key); +while (table[index].state == OCCUPIED && table[index].key != key) { + index = (index + k) % table_size; // attention à pas dépasser +} +table[index].key = key; +table[index].state = OCCUPIED; +``` + +## Quelle valeur de `k` éviter? + +. . . + +* Une valeur où `table_size` est multiple de `k`. + +Cette méthode répartit mieux les regroupements au travers de la table. + +# Méthode du double hashing + +* Comme la méthode linéaire, mais `k = h2(key)` (variable). + +```C +index = h(key); +while (table[index].state == OCCUPIED && table[index].key != key) { + index = (index + h2(k)) % table_size; // attention à pas dépasser +} +table[index].key = key; +table[index].state = OCCUPIED; +``` + +## Quelle propriété doit avoir `h2`? + +## Exemple + +```C +h2(key) = (table_size - 2) - key % (table_size -2) +``` + +# Méthode pseudo-aléatoire + +* Comme la méthode linéaire mais on génère `k` pseudo-aléatoirement. + +```C +index = h(key); +while (table[index].state == OCCUPIED && table[index].key != key) { + index = (index + random_number) % table_size; // attention à pas dépasser +} +table[index].key = key; +table[index].state = OCCUPIED; +``` + +## Comment s'assurer qu'on va bien retrouver la bonne clé? + +. . . + +* Le germe (seed) de la séquence pseudo-aléatoire doit être le même. +* Le germe à choisir est l'index retourné par `h(key)`. + + ```C + srand(h(key)); + while { + random_number = rand(); + } + ``` + +# Méthode quadratique + + + +# Méthode de chaînage -- GitLab