HashSet La estructura de datos C # HashSet se introdujo en .NET Framework 3.5. Puede encontrar una lista completa de los miembros implementados en la página HashSet MSDN .
- Donde se usa
- ¿Por qué querrías usarlo?
HashSet La estructura de datos C # HashSet se introdujo en .NET Framework 3.5. Puede encontrar una lista completa de los miembros implementados en la página HashSet MSDN .
Respuestas:
A
HashSetcontiene un conjunto de objetos, pero de una manera que le permite determinar fácil y rápidamente si un objeto ya está en el conjunto o no. Lo hace administrando internamente una matriz y almacenando el objeto utilizando un índice que se calcula a partir del código hash del objeto. Mira aquíHashSetes una colección desordenada que contiene elementos únicos. Tiene las operaciones de recopilación estándar Agregar, Eliminar, Contiene, pero dado que utiliza una implementación basada en hash, estas operaciones son O (1). (A diferencia de List, por ejemplo, que es O (n) para Contiene y Eliminar.)HashSetTambién proporciona operaciones de conjuntos estándar como unión , intersección y diferencia simétrica . Mira aquíHay diferentes implementaciones de conjuntos. Algunos hacen que las operaciones de inserción y búsqueda sean súper rápidas mediante elementos hash. Sin embargo, eso significa que se pierde el orden en que se agregaron los elementos. Otras implementaciones preservan el orden agregado a costa de tiempos de ejecución más lentos.
La
HashSetclase en C # va para el primer enfoque, por lo tanto no conserva el orden de los elementos. Es mucho más rápido que un regularList. Algunos puntos de referencia básicos mostraron que HashSet es decentemente más rápido cuando se trata de tipos primarios (int, double, bool, etc.). Es mucho más rápido cuando se trabaja con objetos de clase. Entonces ese punto es que HashSet es rápido.El único inconveniente
HashSetes que no hay acceso por índices. Para acceder a los elementos, puede usar un enumerador o la función incorporada para convertirloHashSetenListay iterar a través de eso. Mira aquífuente
A
HashSettiene una estructura interna (hash), donde los elementos se pueden buscar e identificar rápidamente. La desventaja es que iterar a través deHashSet(u obtener un elemento por índice) es bastante lento.Entonces, ¿por qué alguien querría saber si ya existe una entrada en un conjunto?
Una situación en la que a
HashSetes útil es obtener valores distintos de una lista donde pueden existir duplicados. Una vez que se agrega un elementoHashSet, es rápido determinar si existe (Containsoperador).Otras ventajas de la
HashSetson las operaciones Set:IntersectWith,IsSubsetOf,IsSupersetOf,Overlaps,SymmetricExceptWith,UnionWith.Si está familiarizado con el lenguaje de restricción de objetos , identificará estas operaciones de conjunto. También verá que está un paso más cerca de una implementación de UML ejecutable.
fuente
Simplemente dicho y sin revelar los secretos de la cocina: un conjunto en general, es una colección que no contiene elementos duplicados, y cuyos elementos no están en ningún orden en particular. Entonces, A
HashSet<T>es similar a un genéricoList<T>, pero está optimizado para búsquedas rápidas (a través de tablas hash, como su nombre lo indica) a costa de perder el orden.fuente
Desde la perspectiva de la aplicación, si uno solo necesita evitar duplicados, entonces
HashSetes lo que está buscando, ya que las complejidades de Buscar, Insertar y Eliminar son O (1): constante . Lo que esto significa es que no importa cuántos elementosHashSettenga, llevará la misma cantidad de tiempo verificar si existe ese elemento o no, además, dado que también está insertando elementos en O (1), lo hace perfecto para este tipo de cosas.fuente