linguaggi/s03/alg_dei_tipi.md
... ...
@@ -133,4 +133,13 @@ Valore (Indice i) 0 1 2 3 4 5 6 7
133 133
Bit (1=Presente, 0=Assente) 0 1 0 0 0 0
134 134
135 135
Fare l'unione o l'intersezione tra due insiemi diventa una semplice operazione bit-a-bit (OR, AND) a livello di processore. È istantaneo.
136
-Il limite? Se il tipo base fosse "Tutti i numeri interi a 32 bit". L'array dovrebbe avere 2^{32} bit (circa 512 Megabyte di memoria) per un singolo insieme, anche se contiene solo tre numeri! Uno spreco enorme.
136
+I l limite? Se il tipo base fosse "Tutti i numeri interi a 32 bit". L'array dovrebbe avere 2^{32} bit (circa 512 Megabyte di memoria) per un singolo insieme, anche se contiene solo tre numeri! Uno spreco enorme.
137
+
138
+Esempio con tabelle Hash (Il workaround moderno)
139
+
140
+Quando il tipo base è grande (come stringhe, o numeri interi generici), i linguaggi moderni (come Python, Java, C#) abbandonano l'array di bit e usano le Tabelle Hash.
141
+
142
+Una piccola correzione al tuo ultimo appunto: Non è che hai un "hash come tipo base", ma usi una Tabella Hash come struttura dati sottostante.
143
+In pratica, passi il tuo valore (es. la stringa "Ciao") a una funzione di hash, che lo trasforma in un numero. Quel numero diventa l'indirizzo di memoria dove salvare il dato.
144
+
145
+ Il compromesso: Occupa un po' più di memoria rispetto all'array di bit puro ed è impercettibilmente più lenta nelle operazioni logiche, ma risolve il problema dello spreco di spazio, permettendoti di creare insiemi di qualsiasi tipo di dato senza far esplodere la RAM.