@@ -19,6 +19,7 @@ Ecrivez vos réponses et commentaires dans ce document.
...
@@ -19,6 +19,7 @@ Ecrivez vos réponses et commentaires dans ce document.
Puis décommenter `compare_taille` à la fin et expliquer les résultats.
Puis décommenter `compare_taille` à la fin et expliquer les résultats.
Bonus : faites varier `nb_niveaux` et `gamma`, voyez quelle influence ils peuvent avoir.
Bonus : faites varier `nb_niveaux` et `gamma`, voyez quelle influence ils peuvent avoir.
Lorsqu'on augmente ces deux paramètres, la taille de la table avec MPHF n'évolue pas (ce qui est normal puisque la taille de la table ne dépend que de la taille de l'entrée).
Lorsqu'on augmente ces deux paramètres, la taille de la table avec MPHF n'évolue pas (ce qui est normal puisque la taille de la table ne dépend que de la taille de l'entrée).
Cependant, on remarque un allongement du temps d'exécution de la fonction lorsque les paramètres ont de grandes valeurs.
Cependant, on remarque un allongement du temps d'exécution de la fonction lorsque les paramètres ont de grandes valeurs.
...
@@ -67,3 +68,12 @@ Initialiser dans la fonction `experiment_load_factor` des listes `insertion_time
...
@@ -67,3 +68,12 @@ Initialiser dans la fonction `experiment_load_factor` des listes `insertion_time
- Un histogramme des fréquences des temps d'insertions discrétisés (code fourni, remplacer la liste vide par la bonne entrée)
- Un histogramme des fréquences des temps d'insertions discrétisés (code fourni, remplacer la liste vide par la bonne entrée)
10. Commentez vos résultats.
10. Commentez vos résultats.
Le temps d'insertion de n éléments est proportionnel à n, comme le montre le Plot1. Cela signifie que l'insertion d'un élément dans un dictionnaire prend quasiment toujours le même temps, peu importe le nombre d'élements déjà présents dans un dictionnaire.
Ceci est dû à la manière dont la mémoire est allouée lors de la création du dictionnaire. En effet, lors de la création d'un dictionnaire, 8 cellules de mémoire vides et contigües sont allouées, ce qui permet un enregistrement des informations uniforme tant que suffisamment d'espace reste vide, l'adresse de stockage à l'intérieur de cette zone de mémoire étant déduite du hachage de la clé. Cependant, lorsqu'un seuil de remplissage de cet espace alloué est atteint, l'ensemble des informations contenues dans cette zone de mémoire sont dupliquées dans un espace deux fois plus grand, ce qui permet de continuer d'agrandir le dictionnaire. Cette opération est coûteuse en temps mais est de plus en plus rare au fur et à mesure de l'agrandissement du dictionnaire, ce qui permet de conserver une complexité en temps linéaire.
Le nombre de réallocations de mémoire augmente de moins en moins vite au fur et à mesure de l'agrandissement de la taille de l'entrée, comme le montre le Plot2. En effet, comme à chaque agrandissement d'espace alloué celui-ci est doublé, à chaque agrandissement de plus en plus d'éléments peuvent être enregistrés, rendant le besoin de resizing moins fréquent.
Ceci a pour conséquence une taille de mémoire allouée qui évolue "en escaliers", comme le montre le Plot3. En effet, chaque doublement d'espacé alloué se traduit par une "marche" deux fois plus haute sur le graphique, mais le besoin de resizing étant de moins en moins fréquent au fur et à mesure de l'agrandissement du dictionnaire, ces "marches" sont de plus en plus longues.
Enfin, l'histogramme montre que le temps d'insertion est quasiment toujours identique pour toutes des valeurs du dictionnaire, comme ce qu'on avait déduit du Plot1, excepté dans de rares cas où le temps d'insertion est plus long, ce qui peut correspondre à un moment où l'insertion de valeur est précédée d'un doublement d'allocation d'espace mémoire.