aprendiendo ( Erlang ).

jueves, 8 de marzo de 2012

Conjuntos ordenados (Ordsets)

| 0 comentarios |

Los conjuntos son colecciones de elementos que no tienen elementos duplicados como pudimos comprobar en el post sobre conjuntos. Un ordsets es una representación de un conjunto, en donde se utiliza una lista ordenada de almacenar los elementos del conjunto. Una lista ordenada es más eficiente que una lista no ordenada.

Este módulo proporciona exactamente la misma interfaz que el módulo sets de conjuntos. Una diferencia es que los conjuntos, mientras que considera dos elementos diferentes, si no son exactos (:), el conjunto ordenado considera dos elementos distintos si y sólo si no son iguales (==).

Como ya hemos comentado el interfaz es el mismo para los módulos sets y ordsets. Y estas son sus funciones:

  • add_element(Elemento, Conjunto1) -> Conjunto2: añade un elemento al conjunto.
  • del_element(Elemento, Conjunto1) -> Conjunto2: borra un elemento del conjunto.
  • filter(Predicado, Conjunto1) -> Conjunto2: realiza un filtro sobre el conjunto de elementos.
  • fold(Función, Acc0, Conjunto) -> Acc1: realiza un fold sobre el conjunto de elementos.
  • from_list(Lista) -> Conjunto: crea un conjunto con los elementos de la lista.
  • intersection(Lista_Conjuntos) -> Conjunto: realiza la intersección de los conjuntos de la lista.
  • intersection(Conjunto1, Conjunto2) -> Conjunto3: realiza la intersección de dos conjuntos.
  • is_element(Elemento, Conjunto) -> bool(): indica si el elemento pertenece al conjunto.
  • is_set(Conjunto) -> bool(): test de comprobación de tipo.
  • is_subset(Conjunto1, Conjunto2) -> bool(): comprueba si un conjunto es subconjunto de otro.
  • new() -> Conjunto: crea un conjunto vacío.
  • size(Conjunto) -> int(): devuelve el número de elementos del conjunto.
  • subtract(Conjunto1, Conjunto2) -> Conjunto3: realiza la diferencia de conjuntos.
  • to_list(Conjunto) -> Lista: convierte un conjunto a lista.
  • union(Lista_Conjuntos) -> Conjunto: realiza la unión de todos los conjuntos de la lista.
  • union(Conjunto1, Conjunto2) -> Conjunto3: realiza la unión de dos conjuntos.

Vamos a realizar el mismo ejemplo que cuando hablamos de conjuntos para que podamos observar a simple vista las diferencias. Como hicimos en su momento vamos a crear tres conjuntos numéricos A={1,2,3,5}, B={2,3,4}, y C={3,5,6} de la siguiente forma:

1> A = sets:from_list([1,2,3,5]).
[1,2,3,5]
2> B = ordsets:from_list([3,4,2]).
[2,3,4]
3> C = ordsets:from_list([3,5,6]).
[3,5,6]
4> sets:size(A). 
4

Lo primero que salta a la vista es que tenemos una representación clara y no tan emborronada como con el conjunto. En definitiva el conjunto ordenado es una lista. Sigamos realizando pruebas.

5> ordsets:union(A,B).
[1,2,3,4,5]
6> ordsets:union([A,B,C]).
[1,2,3,4,5,6]
7> ordsets:intersection(A,B).
[2,3]
8> ordsets:intersection(B,C).
[ 3 ]
9> ordsets:intersection([A,B,C]).
[ 3 ]
10> ordsets:subtract(A,B).
[1,5]
11> ordsets:subtract(B,A).
[ 4 ]
12> ordsets:subtract(A,C).
[1,2]
13> ordsets:add_element(7, B).
[2,3,4,7]
14> sets:add_element(7, C).
[3,5,6,7]
15> sets:add_element(3, C).
[3,5,6]
17> sets:del_element(3, C).
[5,6]
16> ordsets:is_element(3, C).
true

En conclusión, el TAD conjunto ordenado implementado por Erlang, no sólo es más eficiente, sino que proporciona al programador una herramienta más versátil que la implementación de conjunto. Además, podemos comprobar que el código que el programador final implementa es mucho más claro y legible.

Publicar un comentario en la entrada

0 comentarios:

 
Licencia Creative Commons
Aprendiendo Erlang por Verdi se encuentra bajo una Licencia Creative Commons Atribución-NoComercial-CompartirIgual 3.0 Unported.