Devoir 2 - uOttawa

publicité
CSI 2510 – Automne 2010 - Devoir de programmation 2
Comme la dernière fois, soumettez vos fichiers au correcteur francophone:
David Lareau ([email protected])
Implémentation d'une table de hachage
Vous devez implémenter une table de hachage qui enregistre des objets de type String. Comme
contrainte spéciale, nous vous demandons d'utiliser une table à deux dimensions (String table[r][c]).
Votre implémentation sera donc différente d'une implémentation classique. De plus, votre tableau sera
de taille statique, et ne grossira donc jamais.
Vous êtes libre dans la façon dont vous générez les indices "r" et "c" pour une String. Par exemple,
vous pouvez diviser la String en deux, et appeler une fonction de hachage sur les deux parties
séparément.
Exemple: "Bonjour"
r = h("Bonj") % n_r;
c = h("our") % n_c;
Votre structure de donnée ne doit pas permettre de doublon. Si on essaie d'ajouter une valeur qui est
déjà dans le tableau, le programme doit simplement ignorer silencieusement l'ajout.
Nous vous demandons d'implémenter deux stratégies différentes en cas de collision. Le Sondage
Linéaire, et Hachage Double.
Le squelette du code a déjà été préparé pour vous. Le code utilise des valeurs sentinelles spéciales qui
sont utilisé lors du traitement des collisions. Elles sont:
final static String EMPTY = ".";
final static String AVAILABLE = "A";
Ces deux valeurs sont réservés et ne peuvent pas être utilisé par l'usager. Vous êtes responsable de
lancer une exception si l'utilisateur essaie de les utilisés.
Différemment du premier devoir, ce devoir a été préparé par la section anglaise. Par conséquent, le
code a un style différent. Pour compiler et exécuter le programme de test, faite:
javac -sourcepath src src/csi2110/assignment2/Test.java
java -cp src csi2110.assignment2.Test
Le programme Test.java utilise un fichier externe, list.txt, pour faire son test. Le programme
Test2.java teste plus sérieusement votre implémentation, mais sachez qu'il est normal que la stratégie
de Hachage Double déclare un tableau plein même s'il reste un peu d'espace. Nous vous encourageons
à écrire votre propre programme test pour tester différent scénario.
Des commentaires et suggestions additionnelles sont fournis dans le code. Les méthodes insert, delete
et search doivent avoir une performance approximative de O(1). Par contre, dans le cas extrême ou l'on
ajoute une nouvelle valeur dans un tableau qui n'a plus vraiment de place, il est correct que la détection
que le tableau est plein soit O(n).
Vous devez implémenter le corps des fonctions suivantes:
[5 points]
HashTable.java: boolean insert(String key)
Le but de cette fonction est d'insérer "key" dans le tableau si "key" n'est pas déjà dans le tableau.
Dans le cas de collision avec une autre valeur, le tout doit être géré de façon appropriée. Si il est
impossible de trouver un endroit, lancer l'exception HashFullException. Si l'ajout à été fait avec succès,
retourner "true". Vous êtes responsable de mettre à jour la variable "sumCollision" dans cette fonction.
Cette variable compte le nombre de collision, et doit seulement être incrémentée une fois par appel à
insert().
[5 points]
HashTable.java: boolean delete(String key)
Le but de cette fonction est de retirer un élément du tableau s'il est présent.
Le tableau doit rester intègre après le retrait. Retourner "true" si l'élément a été retiré.
[5 points]
HashTable.java: boolean search(String key)
Cette fonction retourne "true" si et seulement si "key" est dans le tableau.
[5 points]
LinearProbingFunction.java:
Position hash(String key, int j, int nRows, int nCols)
Cette fonction doit hacher "key" pour trouver les indices du tableau. Les indices sont retourné sous la
forme d'un objet de type Position, et sont situé entre [0,nRows) et [0,nCols].
La stratégie de sondage linéaire doit être utilisé pour ajouter une valeur de décalage à la position
lorsque le paramètre "j" est plus grand que 0.
[5 points]
DoubleHashingFunction.java:
Position hash(String key, int j, int nRows, int nCols)
Semblable à la fonction du même nom dans le fichier LinearProbingFunction.java, cette fonction doit
hacher "key" pour trouver les indices du tableau. Par contre, la stratégie de hachage double doit être
utilisé pour trouver la valeur de décalage, qui est ensuite multiplié par "j".
[5 points]
LinearProbingFunction.java:
int h(String s)
DoubleHashingFunction.java:
int h1(String s)
int h2(String s)
Le but de ces fonctions est de générer un nombre identificateur pour "s". Nous vous permettons
d'utiliser la fonction java.lang.Object.hashCode(), mais attention, cette fonction peut retourner une
valeur négative, et utiliser l'opérateur modulo sur une valeur négative n'est pas intuitif. Vous ne serez
pas jugé sur la qualité de votre fonction de hachage, en autant qu'elle fonctionne (mais vous devez
quand même faire plus que retourner une constante). Faites attention à h2(), cette fonction ne doit
jamais retourner 0 puisqu'elle est utilisée dans la formule d'une valeur de décalage.
Téléchargement