HashSet<T> t = new HashSet<T>();
// add 10 million items
Dictionary<K, V> t = new Dictionary<K, V>();
// add 10 million items.
¿ .Contains
Qué método volverá más rápido?
Solo para aclarar, mi requisito es tener 10 millones de objetos (bueno, cadenas en realidad) que necesito verificar si existen en la estructura de datos. NUNCA iteraré.
.net
performance
dictionary
hashset
Halivingston
fuente
fuente
Respuestas:
Prueba de rendimiento HashSet vs List vs Dictionary, tomada de aquí .
Agregue 1000000 objetos (sin verificar los duplicados)
Contiene cheque por la mitad de los objetos de una colección de 10000
Elimina la mitad de los objetos de una colección de 10000
fuente
¿Supongo que te refieres
Dictionary<TKey, TValue>
al segundo caso?HashTable
es una clase no genérica.Debe elegir la colección adecuada para el trabajo según sus requisitos reales. ¿Realmente desea asignar cada clave a un valor? Si es así, utilice
Dictionary<,>
. Si solo te importa como conjunto, úsaloHashSet<>
.Yo esperaría que
HashSet<T>.Contains
yDictionary<TKey, TValue>.ContainsKey
(que son las operaciones comparables, asumiendo que está usando su diccionario con sensatez) para realizar básicamente lo mismo: están usando el mismo algoritmo, fundamentalmente. Supongo que con las entradasDictionary<,>
más grandes terminas con una mayor probabilidad de volar el caché conDictionary<,>
que conHashSet<>
, pero esperaría que eso sea insignificante en comparación con el dolor de elegir el tipo de datos incorrecto simplemente en términos de lo que estás tratando de lograr.fuente
Dictionary
por otras razones, debería usarlo.De la documentación de MSDN para Dictionary <TKey, TValue>
Con una nota:
Sé que su pregunta / publicación es antigua, pero mientras buscaba una respuesta a una pregunta similar me encontré con esto.
Espero que esto ayude. Desplácese hacia abajo hasta la sección Comentarios para obtener más detalles. https://msdn.microsoft.com/en-us/library/xfhwa508(v=vs.110).aspx
fuente
Estas son diferentes estructuras de datos. Además, no existe una versión genérica de
HashTable
.HashSet
contiene valores de tipo T queHashTable
(oDictionary
) contiene pares clave-valor. Por lo tanto, debe elegir la recopilación de los datos que necesita almacenar.fuente
¡La respuesta aceptada a esta pregunta NO responde válidamente a la pregunta! Da la respuesta correcta, pero esa respuesta no se muestra en la evidencia que proporcionaron.
Lo que muestra esa respuesta es que las búsquedas clave en un
Dictionary
oHashSet
son mucho más rápidas que buscar en unList
. Lo cual es cierto, pero no interesante, ni sorprendente, ni prueba de que tengan el mismo velocidad.Ejecuté el siguiente código para comparar los tiempos de búsqueda y mi conclusión es que, de hecho, SON a la misma velocidad. (O al menos, si hay alguna diferencia, entonces la diferencia está dentro de la desviación estándar de esa velocidad)
Específicamente, 100.000.000 de búsquedas tardaron entre 10 y 11,5 segundos para ambos, para mí, en esta prueba.
Código de prueba:
fuente