|
Dans une table de hash, la suppression est sûrement l'opération la plus délicate. Comme pour la recherche, la façon de supprimer une clef de la table dépend de la méthode de résolution des collisions. Si on recours à la résolution chaînée, il suffit de fouiller la liste pointée par la valeur hashée pour déterminer si la clef que l'on cherche est dans la table ou non, et si elle s'y trouve, la retirer de la liste.
Il en va de même avec la résolution par buckets. Il suffit de retirer la clef du bucket qui la contient, possiblement de réorganiser le bucket voire de l'effacer si ce dernier est maintenant vide. Encore une fois, la résolution de collision par adressage ouvert est plus compliquée à gérer. Plutôt que de simplement détruire la clef et de laisser la case du tableau vide, il faut la marquer comme ne contenant pas de clef, mais n'étant pas vide. Pourquoi ? Nous nous souvenons qu'avec l'adressage ouvert, une séquence de fouille peut avoir croisé plusieurs cases occupées avant de trouver une case libre. Si on veut retrouver cette clef qui a été inséré plus tard que la clef que nous voulons supprimer, il faut s'assurer que sa séquence de fouille demeure inchangée! Et les séquences de fouille se terminent dès qu'une case vide est atteinte. Marquer la case comme tout simplement vide écourterait la séquence de fouille et nous empêcherait de trouver des clefs qui sont néanmoins encore dans la table. Pour empêcher la séquence de terminer prématurément, on ne fait que marquer la case comme étant sans clef. On peut le faire en réservant une clef spéciale qui indique que la case n'est pas occupée, soit en utilisant un tableau de bits auxiliaire qui marque quelles cases sont, ou ont été, en utilisation. L'une ou l'autre de ses méthodes permettra à la séquence de recherche de trouver toutes les clefs, même si des clefs ont été détruites entre temps. |