# Partie 1 - Réaliser une fonction de hachage minimale parfaite
On travaillera sur `tp_2_miso_mphf.py`.
...
...
@@ -16,8 +14,58 @@ Vous devez
Ecrivez vos réponses et commentaires dans ce document.
# Explication de tableaux.append(tableau_principal)
Cette ligne permet d'ajouter le tableau principal (actuel) à la liste des tableaux.
On fait cela car on va réduire la taille de la table de hachage à plusieurs reprise, nous allons donc stocker dans cette liste les table au fur et à mesure.
# Explication de set_kmer_courant = collision.copy()
Après un niveau il se peut qu'il y ait des k-mers en collision ceux-ci sont enregistré dans 'collision'.
Ensuite set_kmer_courant est mis à jour pour qu'il contienne les k-mers qui ont subi une collison.
L'objectif est d'essayer d'insérer ces k-mer en collision pour les intégrer dans le prochain niveau de la table de hachage.
#Explication de collision = set()
Cette ligne permet de vider collision. En effet après avoir copié les valeurs de collision dans set_kmer_courant,
on va réinitialiser collision pour le prochain niveau de la table de hashage.
On recommence avec une liste collision qui contient les éléments à traiter.
# Explication de grand_tableau.extend(tableau)
Nous avons des tableaux crée à chaque niveau pour contenir les résultats intermédiaire du hachage.
Cette ligne permet d'ajouter tout les éléments stockée dans tableau dans seul grand_tableau. Ca sert à regrouper toute les tables intermédiaires dans un seul grand tableau.
On va pouvoir ainsi récupérer les indices des k-mers dans un seul tableau.
# Explication de:
for kmer in set_kmer_courant:
max_rang += 1
h = abs(hash(kmer))
mphf.append([h, max_rang])
Ce bloc permet de donner un rang aux k-mer qui sera donc unique pour les cas où par exemple des collisions persisterais après avoir terminé de diminuer la table.
On parcours tous les kmers et on leurs attribut un rang +1 par au precedent.
On recupère le hash du k-mer puis on l'ajoute avec le rang à la MPHF
# Explication de pourquoi ici on ne mesure pas juste la taille en mémoire du tableau ?
Cette ligne permet de calculer la taille de tableau qui contient les k-mers placé à la position de leurs hash respectif
additioné à la taille de la mphf qui contient la fonction pour bien placer ces k-mers.
Il nous faut donc pour avoir une bonne estimation de l'utilisation de la mémoire prendre le tableau et la mphf.
Nous pourrons ensuite comparer avec la taille des dictionnaire python.
Puis décommenter `compare_taille` à la fin et expliquer les résultats.
# Explication du graphique mphf.png
Ce graphique permet d'observer l'évolution de la taille mémoire utilisée par une table MPHF (en bleu) et un dictionnaire python en orange pour un nombre 'n' de k-mer.
On observe que la courbe MPHF augmente progressivement de manière linéaire tandis que la courbe 'dict' augmente en escalier.
La courbe augmente par palier brutalement vers 4100 k-mers.
Cela pourrait s'expliquer par le fait que les dictionnaire python vont doubler la taille de la mémoire pour éviter les phénomènes de collision.
Nous pouvons conclure que la MPHF consomme beaucoup moins de mémoire que le dictionnaire surtout pour les grandes valeurs.
Bonus : faites varier `nb_niveaux` et `gamma`, voyez quelle influence ils peuvent avoir.
# Partie 2 - Analyse de performance de dictionnaires en Python