From 2512b8d8c86056f4afd7b178d5ed1671151c45ab Mon Sep 17 00:00:00 2001
From: Clara Moreno <clara.moreno.etu@univ-lille.fr>
Date: Mon, 10 Mar 2025 18:40:01 +0100
Subject: [PATCH] Edit tp_2_miso_dict.py finito pipo

---
 tp_2_miso_dict.py | 164 ++++++++++++++++++++++++++++++++++------------
 1 file changed, 122 insertions(+), 42 deletions(-)

diff --git a/tp_2_miso_dict.py b/tp_2_miso_dict.py
index 04a2312..ea73569 100644
--- a/tp_2_miso_dict.py
+++ b/tp_2_miso_dict.py
@@ -1,59 +1,139 @@
+
 import matplotlib.pyplot as plt
 import numpy as np
 import time
 import sys
 
 
-
 ###### PARTIE 2 ######
 
+
 def experiment_load_factor(load_factors):
-	"""
-	Étude du facteur de charge
-	"""
-	return [],[],[]
+    """
+    Measures insertion time, memory reallocations, and final dictionary size
+    for different load factors.
+
+    Args:
+        load_factors (list): List of load factors to test.
+
+    Returns:
+        tuple: Three lists containing insertion times, number of memory reallocations, and final sizes.
+    """
+    insertion_times = []
+    num_resizes = []
+    sizes = []
+
+    for load_factor in load_factors:
+        my_dict = {}
+        num_elements = int(load_factor * 10_000)  #element qu'on insere (on a pris nombre au hasard)
+        start_time = time.time()
+        num_resize = 0
+        last_size = sys.getsizeof(my_dict)  # Taille memoire initiale
+
+        for i in range(num_elements):
+            my_dict[i] = i  # Insertion d'une clé-valeur
+            current_size = sys.getsizeof(my_dict)  # Taille actuelle du dictionnaire
+
+            if current_size > last_size:  # Détection d'une réallocation mémoire
+                num_resize += 1
+                last_size = current_size
+
+        insertion_time = time.time() - start_time  # Temps d'insertion total
+        insertion_times.append(insertion_time)
+        num_resizes.append(num_resize)
+        sizes.append(last_size)
+
+    return insertion_times, num_resizes, sizes
+
+
 
 def experiment_longest():
-	"""
-	TODO: que fait cette fonction
-	"""
-	d = {}
-	insertion_times = []
-
-	for i in range(10000):
-		key = str(i)
-		value = i
-		start_time = time.time()
-		d[key] = value
-		insertion_time = time.time() - start_time
-		insertion_times.append(insertion_time)
-	frequencies = np.histogram(insertion_times)[0]
-	return frequencies
+    """
+    elle calcul le temps que prend une insertion de valeurs dans le dictionnaire en soustrayant la créeation de clefs
+    renvoie un tableau contenant le nombre d'observations (fréquences) dans chaque intervalle de temps.
+    """
+    d = {}
+    insertion_times = []
+    count = 0
+    for i in range(10000):
+        count += 1
+        key = str(i)
+        value = i
+        start_time = time.time()
+        d[key] = value
+        insertion_time = time.time() - start_time #temps insertion d'une valeur dans un dict
+        insertion_times.append(insertion_time)
+    frequencies = np.histogram(insertion_times)[0]
+    return frequencies
+
 
 def visualisation(load_factors, insertion_times, num_resizes, sizes, frequencies):
-	"""
-	Visualisation des résultats
-	"""
-	# Temps d'insertion en fonction du facteur de charge
-
-	# Nombre de réallocations de mémoire en fonction du facteur de charge
-	
-	# Taille de mémoire occupée en fonction du nombre d'éléments
-	
-	# Deuxième étude
-	f = list()
-	plt.figure(figsize=(10, 6))
-	plt.bar(range(len(f)), f)
-	plt.xlabel('Temps d\'insertion (s)')
-	plt.ylabel('Fréquence')
-	plt.title('Histogramme des fréquences des temps d\'insertions')
-	plt.yscale('log')
-	xticks = np.logspace(-6, 1, 3)  
-	xtick_labels = [f'{x:.1e}' for x in xticks]  
-	plt.xticks(xticks, xtick_labels)    
-	plt.savefig('histogramme.png')
+    """
+    Visualisation des résultats
+    """
+    # Temps d'insertion en fonction du facteur de charge
+
+    # Nombre de réallocations de mémoire en fonction du facteur de charge
+
+    # Taille de mémoire occupée en fonction du nombre d'éléments
+
+    # Deuxième étude
+    f = list()
+    plt.figure(figsize=(10, 6))
+    plt.bar(range(len(f)), f)
+    plt.plot(load_factors, insertion_times,  label="insertion times")
+    plt.xlabel('facteur de charge')
+    plt.ylabel("temps d'insertion")
+    plt.title('Evolution des temps d insertion (s) en fonction des facteurs de charge')
+    plt.savefig("temps_insertion.png")
+    plt.close()
+
+    f = list()
+    plt.figure(figsize=(10, 6))
+    plt.bar(range(len(f)), f)
+    plt.plot(load_factors, num_resizes, label="num_resizes")
+    plt.xlabel('facteur de charge')
+    plt.ylabel('nombre de réallocations')
+    plt.title('Evolution du nombre de réallocations en fonction des facteurs de charge')
+    plt.savefig("réallocations.png")
+    plt.close()
+
+    f = list()
+    plt.figure(figsize=(10, 6))
+    plt.bar(range(len(f)), f)
+    plt.plot(load_factors, sizes, label="sizes")
+    plt.xlabel('facteurs de charge')
+    plt.ylabel('taille de la table')
+    plt.title('Evolution de la taille de la table en fonction des facteurs de charge')
+    plt.savefig("taille de table.png")
+    plt.close()
+
+    f = list()
+    plt.figure(figsize=(10, 6))
+    plt.bar(range(len(f)), f)
+    plt.hist(frequencies, label="Fréquences")
+    plt.xlabel('facteurs de charge')
+    plt.ylabel('fréquences')
+    plt.title('Histogramme des fréquences d\'insertion dans le dictionnaire')
+    plt.yscale('log')
+    plt.savefig("fréquences.png")
+    plt.close()
+
+
+
+    xticks = np.logspace(-6, 1, 3)
+    xtick_labels = [f'{x:.1e}' for x in xticks]
+    plt.xticks(xticks, xtick_labels)
+    plt.savefig('histogramme.png')
 
 load_factors = [0.01, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]
 insertion_times, num_resizes, sizes = experiment_load_factor(load_factors)
 frequencies = experiment_longest()
-visualisation(load_factors, insertion_times, num_resizes, sizes, frequencies)
\ No newline at end of file
+visualisation(load_factors, insertion_times, num_resizes, sizes, frequencies)
+
+# Commentaires des résultats
+# Le temps d'insertion est linéaire au cours du temps, donc ne dépend pas des facteurs de charge
+# Le nombre de réallocations est croissant par palliers, c'est cohérent étant donné le comportement d'une liste
+# La taille de la table augmente graduellement par palliers, plus on a de facteurs de charge, plus les collisions sont fréquentes. Le plateau correspond au maximum de collisions théoriquement possibles.
+# Il semble qu'il y ait une corrélation entre la taille de la table et les réallocations : quand la taille de la table est importante on diminue le risque de collisions.
+# 99% du temps est utilisé pour insérer la première valeur, à la création de la table. C'est donc la création du dictionnaire qui prend le plus de temps
\ No newline at end of file
-- 
GitLab