Ciertos tipos de colecciones en .Net tienen un parámetro de constructor opcional "Capacidad inicial". Por ejemplo:Capacidad inicial de los tipos de colección, p. Dictionary, List
Dictionary<string, string> something = new Dictionary<string,string>(20);
List<string> anything = new List<string>(50);
Parece que no puedo encontrar cuál es la capacidad inicial predeterminada para estos objetos en MSDN.
Si sé que solo almacenaré aproximadamente 12 elementos en un diccionario, ¿no tiene sentido establecer la capacidad inicial en algo así como 20?
Mi razonamiento es, asumiendo que la capacidad crece como lo hace para un StringBuilder, que se duplica cada vez que se golpea la capacidad, y cada reasignación es costosa, ¿por qué no preestablecer el tamaño de algo que usted sabe que almacenará sus datos? , con un poco de espacio extra por si acaso? Si la capacidad inicial es 100, y sé que solo necesitaré una docena más o menos, parece que el resto de esa memoria está asignada para nada.
Es probable que el cálculo del número primo se ocupe de las colisiones hash y el sondeo de las ubicaciones de entrada. Dependiendo del mecanismo interno, si solo almacenan un valor en cada hash, entonces necesitan ubicaciones de almacenamiento secundarias. Si no usa un primo, entonces puede encontrar un hash que no puede insertar. – Matt
El diccionario usa el encadenamiento. El tamaño de la tabla de números primos compensa las pobres funciones hash. Las buenas funciones hash producen distribuciones aleatorias; la potencia de dos tamaños de tabla se usa en tablas hash modernas (la tabla hash .net se basaba en la tabla hash Java, que también usaba números primos, porque esa era una forma antigua de hacerlo, en los días de malas funciones hash). Debido a que Microsoft no proporcionó métodos integrados de combinación de hash, muchas funciones hash construidas en casa producen distribuciones pobres, por lo que la opción de número primo se compensa, a veces, hasta que la función hash produce múltiples números primos. –