lunes, 6 de noviembre de 2017

Listas, Colas, Pilas y Conjuntos en C# - Parte 6/6: HashSet(T) y SortedSet(T)

Índice

1. Introducción
2. Palabras Clave
3. Clase Genérica HashSet<T>
4. Clase Genérica SortedSet<T>
5. Conclusiones
6. Literatura & Enlaces

1. Introducción

Cada nueva versión mayor de .NET Framework trae consigo cambios sobresalientes: entre ellos se puede contar la adición de dos elementos de programa: HastSet<T> y SortedSet<T>. Estas dos clases genéricas son colecciones que resaltan por métodos de búsqueda basado en hash, no permiten la agregación de elementos duplicados, y no cuenta con acceso basado en índice o posición. Este último artículo de la serie Listas, Colas, Pilas y Conjuntos en C# describe, grosso modo, estas dos interesantes clases, exponiendos sus características importantes.

2. Palabras Clave

  • .NET Framework
  • Clase
  • Colección
  • Genéricos
  • Hash

3. Clase Genérica HashSet<T>

La clase genérica HashSet<T> almacena los elementos sin un orden particular, y su implementación consiste en llaves almacenadas en una estructura hashtable (o tabla de hash); estas llaves representan el identificador unívoco para acceder a los de la tabla.

Cuenta con la implementación de la interfaz genérica ICollection<T>: en consecuencia, posee con métodos de acceso y mutación como Contains, Add y Remove.

¿Pero qué hace interesante esta clase? De acuerdo con "HashSet(T) Class" (2017), esta clase cuenta con operaciones de conjuntos de alto rendimiento. Por ejemplo, se pueden mencionar los métodos:
  • UnionWith(IEnumerable<T>): lleva a cabo la operación de conjuntos unión de elementos de dos colecciones.
  • InsersectWith(IEnumerable<T>): realiza la operación de conjuntos intersección para generar el conjunto de elementos comunes a dos colecciones.
  • ExceptWith(IEnumerable<T>): ejecuta la operación de substracción.
Estos métodos y otros son de naturaleza destructiva (Albahari, 2012); esto quiere decir que, por ejemplo, la operación de IntersectWith modifica la estructura removiendo los elementos que no son comunes entre ambos conjuntos.

Veamos este ejemplo de uso:

El resultado de ejecución de este programa es:


Contenido conjunto números pares:
2 4 6 8 10 
Contenido conjunto números impares:
1 3 5 7 9 
Conjunto resultante de la unión de pares e impares:
2 4 6 8 10 1 3 5 7 9 
En ideone.com se puede probar online la ejecución del código: https://ideone.com/nvubPq

4. Clase Genérica SortedSet<T>

Esta es otra clase alto desempeño orientada a almacenar información como un conjunto: donde los elementos no se repiten. A diferencia de HashSet<T>, SortedSet<T> almacena los elementos de forma ordenada.

Internamente esta clase está implementada usando un árbol rojo-negro ("Árbol rojo-negro", 2017)Al igual que HashSet<T>, SortedSet>T> implementa la interfaz genérica IEnumerable<T> para la enumeración de elementos de la colección (Enumeración e Interfaces IEnumerator(T) e IEnumerable(T) en C# (2017)).

Supongamos que creamos el siguiente código de ejemplo:

SortedSet<char> dostoevsky = new SortedSet<char>("dostoevsky");

Al iterar este objeto 

foreach(char c in dostoevsky)
{
    Console.Write(c);
}

se obtienen los siguientes caracteres ordenados alfabéticamente:

dekostvy

El constructor de esta clase acepta como argumento un objeto IComparar<T> que sirva como especificador de método de comparación (Albahari, 2012).

5. Conclusiones

Se exploraron dos clases nuevas para el almacenamiento y manipulación de elementos de teoría de conjuntos. El uso apropiado de estas clases para proyectos de software que requieran tratar datos con operaciones de teoría de conjuntos puede eventualmente dar como resultado software eficiente gracias al alto rendimiento de estas estructuras.

La siguiente serie de artículos  tratará acerca de estructuras de datos basadas en diccionarios.

6. Literatura & Enlaces

Albahari, J., Albahari, B. (2012). C# 5.0 in a Nutshell. United States: O'Reilly Media.
HashSet(T) Class (System.Collections.Generic) (2017). Recuperado desde: https://msdn.microsoft.com/en-us/library/bb359438%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396
SortedSet(T) Class (System.Collections.Generic) (2017). Recuperado desde: https://msdn.microsoft.com/en-us/library/dd412070%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396
Árbol rojo-negro - Wikipedia, la enciclopedia libre (2017). Recuperado desde: https://es.wikipedia.org/wiki/%C3%81rbol_rojo-negro
Enumeración e Interfaces IEnumerator(T) e IEnumerable(T) en C# (2017). Recuperado desde: https://ortizol.blogspot.com.co/2017/08/enumeracion-e-interfaces-ienumerator-t-e-ienumerable-t-en-csharp.html


O

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.