2010-12-29 17 views
362

HashSet La estructura de datos C# HashSet se introdujo en .NET Framework 3.5. Se puede encontrar una lista completa de los miembros implementados en la página HashSet MSDN.Definir: ¿Qué es un HashSet?

  1. ¿Dónde se usa?
  2. ¿Por qué le gustaría usarlo?
+3

http://en.wikipedia.org/wiki/Set_(computer_science) –

+2

posible duplicado de [¿Cuándo debo utilizar el tipo de HashSet ?] (Http://stackoverflow.com/questions/1247442/when-should -i-use-the-hashsett-type) – nawfal

+0

Utiliza un hashtable internamente. si tiene una buena implementación de hashtable (por ejemplo, Dictionary ) puede implementar HashSet usted mismo fácilmente. –

Respuesta

532
    1. Un HashSet sostiene un conjunto de objetos, pero de una manera que le permite determinar fácil y rápidamente si un objeto que ya están en el juego o no lo es. Lo hace administrando internamente una matriz y almacenando el objeto usando un índice que se calcula a partir del código hash del objeto. Take a look here

    2. HashSet es 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). (En oposición a la lista, por ejemplo, que es O (n) para Contiene y quitar.) HashSet también proporciona operaciones de conjuntos estándar tales como unión, intersección, y diferencia simétrica. Take a look here

  1. Existen diferentes implementaciones de conjuntos. Algunos hacen que las operaciones de inserción y búsqueda sean muy rápidas al mezclar elementos. Sin embargo, eso significa que el orden en el que se agregaron los elementos se pierde. Otras implementaciones conservan el orden agregado a costa de tiempos de ejecución más lentos.

La clase HashSet en C# ocurre con el primer enfoque, por lo tanto no preservar el orden de los elementos. Es mucho más rápido que un List normal. 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 de HashSet es que no hay acceso por índices. Para acceder a los elementos, puede usar un enumerador o utilizar la función incorporada para convertir el HashSet en List y repetirlo. Take a look here

+12

Dos cosas, hashset y similares son .NET, no C# 's. Además, HashSet no conserva el orden. Intente agregar y eliminar elementos de un conjunto de hash, sabrá si itera más adelante .. – nawfal

+0

gran explicación simple & comparación – Kings

8

A HashSet tiene una estructura interna (hash), donde los elementos se pueden buscar e identificar rápidamente. La desventaja es que iterar a través de HashSet (u obtener un elemento por índice) es bastante lento.

Entonces, ¿por qué alguien querría saber si una entrada ya existe en un conjunto?

Una situación en la que un HashSet es útil es para obtener valores distintos de una lista donde pueden existir duplicados. Una vez que se agrega un artículo al HashSet, es rápido determinar si el artículo existe (operador Contains).

Otras ventajas de la HashSet son las operaciones Set: IntersectWith, IsSubsetOf, IsSupersetOf, Overlaps, SymmetricExceptWith, UnionWith.

Si está familiarizado con el object constraint language, entonces identificará estas operaciones de conjunto. También verá que está un paso más cerca de una implementación de UML ejecutable.

+14

Re: downside. No, iterar a través de un HashSet es perfectamente rápido. En segundo lugar, no es posible obtener un artículo por índice. De hecho, los elementos se almacenan desordenados. –

+0

@Nigel Touch. La iteración es rápida si no le importa el índice (orden en el que se agregaron). Sin embargo, si está preocupado por el índice, entonces el índice debe almacenarse con cada clave hash y, por lo tanto, puede ser bastante lento porque la lista debe buscarse exhaustivamente para recuperar el elemento correcto. Este comportamiento es muy diferente de una lista en la que los elementos se indexan según el orden en que se agregan. –

+0

Tiene sentido por qué sería rápido, porque no hay dos hash iguales. Permitir que la consulta aproveche un enfoque de "corto circuito", descartando rápidamente ciertos criterios. –

1

Desde la perspectiva de la aplicación, si solo necesita evitar duplicados, entonces HashSet es lo que está buscando, ya que es Buscar, Insertar y Eliminar complexities are O(1) - constant. Lo que significa que no importa cuántos elementos tenga HashSet llevará la misma cantidad de tiempo para comprobar si hay tal elemento o no, además, puesto que está insertando elementos en O (1) también lo hace perfecto para este tipo de cosas.

5

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 son en ningún orden en particular. Por lo tanto, A HashSet<T> es similar a un List<T> genérico, pero está optimizado para búsquedas rápidas (a través de hashtables, como su nombre lo indica) a costa de perder el orden.

Cuestiones relacionadas