Interface Set#
La interfaz Set es parte del framework de colecciones de Java (paquete java.util) y representa una colección de elementos únicos, es decir:
No permite elementos duplicados — si intentas agregar un elemento que ya existe no se duplica.
No define orden por índice; no puedes obtener elementos por posición como en una List.
Está diseñada para modelar matemáticamente la idea de un conjunto.
La interfaz Set extiende Collection, por lo que hereda métodos como add, remove, contains, size, isEmpty y iterator. Las colecciones que implementan la interfaz Set en Java permiten almacenar elementos sin duplicados, pero varían significativamente en su comportamiento interno y eficiencia. La siguiente tabla compara tres implementaciones comunes —HashSet, LinkedHashSet y TreeSet— destacando sus principales características y diferencias para facilitar su elección según el caso de uso.
Características |
HashSet |
LinkedHashSet |
TreeSet |
|---|---|---|---|
Permite duplicados |
No |
No |
No |
Ordena los elementos |
No |
Orden de inserción |
Orden alfabético |
Complejidad |
O(1) |
O(1) |
O(log(n)) |
Permite (null) |
Sí, 1 valor |
Sí, 1 valor |
No |
Estructura |
Tabla Hash |
Tabla Hash + Lista enlazada |
Árbol Rojo-Negro |
Algunos métodos clave que verás en la interfaz:#
boolean add(E e)– Agrega un elemento si no está presente.boolean remove(Object o)– Elimina un elemento del conjunto.boolean contains(Object o)– Comprueba si el elemento está presente.int size()– Retorna el número de elementos (cardinalidad).boolean isEmpty()– Indica si el conjunto está vacío.Iterator<E> iterator()– Permite recorrer los elementos.
Además puedes usar métodos que operan con conjuntos completos, como:
addAll(Collection<? extends E>)— uniónretainAll(Collection<?>)— intersecciónremoveAll(Collection<?>)— diferencia
Ejemplo#
Estructuras base#
Árbol Rojo-Negro#
Comparación con de arbol Rojo-Negro con un arbol de busqueda binaria.
Características |
BST |
Árbol Rojo-Negro |
|---|---|---|
Orden |
I < R < D |
I < R < D |
Balanceo automático |
No |
Sí |
Complejidad |
O(N) en el peor caso (desbalanceado) |
O(log(n)) |
Coloración de nodos |
No usa |
Nodo Rojo-Negro |
Uso en Java |
|
|
¿Qué es un Árbol Rojo-Negro? Es un árbol binario de búsqueda (BST) balanceado, donde cada nodo tiene un color rojo o negro y sigue estas reglas:
Cada nodo es rojo o negro.
La raíz siempre es negra.
Un nodo rojo no puede tener un hijo rojo (no hay nodos rojos consecutivos).
Cada camino desde la raíz hasta una hoja tiene el mismo número de nodos negros (propiedad de balanceo).
Si un nodo es rojo, sus hijos deben ser negros.
Un nodo negro puede tener hijos negros.
Estas reglas garantizan que el árbol esté siempre balanceado, manteniendo la altura en O(log N), lo que lo hace más eficiente que un BST simple.
¿Cuándo usar un Árbol Rojo-Negro?
Cuando necesitas búsquedas, inserciones y eliminaciones rápidas (O(log N)).
Cuando el orden es importante (como en
TreeSetyTreeMap).Cuando quieres evitar que un BST se desbalancee.
Conclusión#
Permitir que un nodo negro tenga hijos negros ayuda a:
Mantener la propiedad de balanceo del árbol rojo-negro.
Evitar que la altura crezca demasiado, garantizando O(log N).
Reducir la necesidad de demasiadas rotaciones y recoloreos.
En resumen, un nodo negro puede tener hijos negros porque es una estrategia clave para el balanceo del árbol y su eficiencia.