Está en la página 1de 15

ESTRUCTURA DE DATOS

SEMANA 7

1
| ESTE DOCUMENTO CONTIENE LA SEMANA 7
ÍNDICE

Introducción .................................................................................................................................. 3
Aprendizaje Esperado ................................................................................................................... 3
Conjuntos y Estructuras de Datos ................................................................................................. 4
Implementación mediante Arreglos ............................................................................................. 5
Notas a esta implementación ................................................................................................... 5
Definición del Tipo de Datos ..................................................................................................... 6
Definición del Conjunto Vacío ................................................................................................... 6
Pertenencia a un Conjunto........................................................................................................ 6
Unión de Conjuntos................................................................................................................... 7
Intersección de Conjuntos......................................................................................................... 7
Diferencia de Conjuntos ............................................................................................................ 8
Subconjuntos............................................................................................................................. 8
Igualdad de Conjuntos .............................................................................................................. 9
Conclusiones de esta Implementación ..................................................................................... 9
Implementación mediante Lista Enlazada .................................................................................... 9
Notas a esta implementación ................................................................................................. 10
Definición del Tipo de Datos ................................................................................................... 11
Definición del Conjunto Vacío ................................................................................................. 11
Pertenencia a un Conjunto...................................................................................................... 12
Intersección de Conjuntos....................................................................................................... 12
Subconjuntos........................................................................................................................... 13
Igualdad de Conjuntos ............................................................................................................ 13
Conclusiones de esta Implementación ................................................................................... 14
Bibliografía .................................................................................................................................. 15

2
| ESTE DOCUMENTO CONTIENE LA SEMANA 7
INTRODUCCIÓN
En este capítulo se trabajará en función de la aplicación de estructuras de datos particulares al
trabajo con un área más tangible de las matemáticas, como lo es la Teoría de Conjuntos. A
través de dicha aplicación, se relacionarán algunas de las estructuras quizás más importantes
de dominar, de aquellas hasta ahora vistas el Arreglo y las Listas Enlazadas, con dicha teoría.

Para esto se aplicarán sencillas rutinas en C, a través de las cuales quedará clara la relación
entre ambas áreas de trabajo, a saber: las Matemáticas y la Computación.

Se implementarán, de esta manera, rutinas para definir diversas operaciones con conjuntos,
tales como: conjuntos vacíos, pertenencia a un conjunto, unión e intersección de conjuntos,
diferencia, subconjuntos e igualdad de conjuntos. Terminaremos este capítulo con algunas
conclusiones importantes respecto del trabajo realizado.

APRENDIZAJE ESPERADO
Se espera que al final de esta clase el alumno sea capaz de interpretar las operaciones básicas
con conjuntos e identificar asimismo sus propiedades fundamentales mediante la
representación de estructuras de datos a través de su implementación en un lenguaje de
programación.

3
| ESTE DOCUMENTO CONTIENE LA SEMANA 7
CONJUNTOS Y ESTRUCTURAS DE DATOS
Este apartado trata en su esencia de aquel concepto fundamental de las matemáticas básicas
que todos conocemos, los Conjuntos. Por agregación, los conjuntos también son una de las
estructuras básicas de la informática.

Así por ejemplo, las estructuras de datos vistas hasta el momento son algo más que elementos
de un mismo tipo agrupados de manera aleatoria, son elementos entre los cuales existe una
determinada relación. El ejemplo más claro visto hasta ahora son las Listas Ordenadas, las
cuales contienen elementos “ordenados” entre sí. Sin tomar en cuenta las restricciones
impuestas por las propias estructuras estudiadas, sus elementos conforman conjuntos, con
una cardinalidad definida ya sea por la estructura, por las necesidades del procedimiento o del
conjunto de datos involucrados.

La única restricción básica que se reflejará desde los conjuntos en las implementaciones que se
muestran en adelante y sólo por una cuestión de claridad en la exposición, será la no
existencia de elementos repetidos, excepto en el caso de la intersección de conjuntos.

Se definirán y mostrarán, en las próximas páginas, implementaciones tales que facilitan el


entendimiento y la aplicación del álgebra básica de conjuntos a través del uso de estructuras
procedimentales, realizando operaciones tales como la unión, la intersección, la pertenencia y
la definición de un conjunto vacío, entre otras. De esta forma se apreciará claramente la
relación existente entre las estructuras de datos estudiadas en este curso y las matemáticas
fundamentales. Para ello, se trabajará implementando dos tipos de estructuras recientemente
vistas: Arreglos y Listas Enlazadas, siempre en lenguaje C, dado su similitud con lenguajes
actuales, la mayoría de ellos orientados al trabajo con objetos.

Sin embargo, no se debe deducir de lo anterior que dichas operaciones no son aplicables a
otro tipo de estructuras de datos, pasando su adecuada implementación sólo por un acabado
estudio y entendimiento de la estructura en particular y su correcta implementación a través
de un lenguaje de programación.

Para cada una de las implementaciones propuestas, se trabaja en cada caso en diferente
medida con algunas de las operaciones básicas en el ámbito de los Conjuntos, tales como:

• Definición del Tipo de Datos


• Definición del Conjunto Vacío
• Pertenencia a un Conjunto
• Unión de Conjuntos
• Intersección de Conjuntos
• Diferencia de Conjuntos
• Subconjuntos
• Igualdad de Conjuntos

4
| ESTE DOCUMENTO CONTIENE LA SEMANA 7
IMPLEMENTACIÓN MEDIANTE ARREGLOS
En el siguiente arreglo se guardarán los datos en forma contigua dentro de él, tal como lo
haríamos en una lista. Para ello, se supondrá el conjunto:

C = {1, 2}, con cardinalidad = 2, que se representa gráficamente así:

0 1 2 3 4

1 2

Para toda implementación y según la Teoría de Conjuntos, un conjunto vacío es aquel cuya
cardinalidad es igual a cero.

NOTAS A ESTA IMPLEMENTACIÓN


• En una implementación de este tipo no se puede definir el conjunto universal en forma
explícita, dado el tamaño que éste podría alcanzar, por ejemplo, si se quiere trabajar con
los números Reales.

• En este sentido, la representación de los elementos del conjunto es limitada, dado que su
objetivo es mostrar el tipo de datos con el que se va a trabajar.

• En la implementación de las primitivas, dada la eficiencia del método, se asume que las
estructuras son pasadas por referencia.

• Tal como se ha visto anteriormente, cuando se desborda la capacidad de un arreglo para


contener datos, se producen errores cuando se intenta añadir elementos más allá de su
límite.

• No se incluyen rutinas para detectar errores ni para su control.

• No se incluyen aquí las rutinas de INSERTAR y ELIMINAR, ya que fueron mostradas en la


semana 3 para los Arreglos y en la semana 4 para las Listas.

• Los elementos del arreglo no se encuentran ordenados. No se considera necesaria una


rutina de este tipo, dado que no es significativo el recurso tiempo que se pueda ahorrar
por realizarla, previo a cualquiera de las operaciones básicas con conjuntos.

5
| ESTE DOCUMENTO CONTIENE LA SEMANA 7
DEFINICIÓN DEL TIPO DE DATOS

DEFINICIÓN DEL CONJUNTO VACÍO


Como dijimos recientemente, un conjunto vacío es aquel cuyo cardinal es igual a 0, o sea, que
no contiene elementos, por lo tanto, para definirlo, basta con una instrucción muy simple:

PERTENENCIA A UN CONJUNTO

Como se observa en el código anterior, se puede determinar la existencia de un elemento x


dentro de un conjunto, o arreglo en este caso, sólo con recorrerlo íntegramente, desde 0 hasta
su cardinal. La rutina devuelve TRUE en caso de ser verdadera la condición, o sea, de
encontrarse el elemento buscado.

6
| ESTE DOCUMENTO CONTIENE LA SEMANA 7
UNIÓN DE CONJUNTOS

Para unir A y B en un tercer conjunto C, incluimos todos aquellos elementos de A más todos
aquellos elementos de B que no se encuentren en A.

INTERSECCIÓN DE CONJUNTOS

Para intersectar A y B se recorre todo A. Todos aquellos elementos de A que también se


encuentren en B se insertan en un tercer conjunto (o arreglo) C.

7
| ESTE DOCUMENTO CONTIENE LA SEMANA 7
DIFERENCIA DE CONJUNTOS

Para restar A-B se recorre todo A. Todos aquellos elementos de A que no se encuentren en B
se insertan en un tercer conjunto (o arreglo) C.

SUBCONJUNTOS

Como se sabe, un conjunto A es subconjunto de otro, B, si todos los elementos de A son a su


vez elementos de B. La rutina anterior devuelve TRUE en caso de comprobarse esta condición.

8
| ESTE DOCUMENTO CONTIENE LA SEMANA 7
IGUALDAD DE CONJUNTOS

Es de conocimiento también que un conjunto A es igual a otro conjunto B si contienen


exactamente los mismos elementos. La rutina anterior devuelve TRUE si se verifica esta
condición de igualdad para cada uno de los elementos contenidos en ambos conjuntos.

CONCLUSIONES DE ESTA IMPLEMENTACIÓN


Su gran ventaja es que no hay límite sobre el rango en que se pueden representar los
elementos de un conjunto, así como tampoco sobre el tipo de datos a representar, siempre
que estos permitan determinar elementos diferentes dentro del conjunto.

Su desventaja es su eficiencia, dice relación con el recurso tiempo empleado en la ejecución


del algoritmo. El costo de operaciones normales tales como la inserción y borrado de
elementos es del orden de O(1).

Si se define el cardinal del conjunto A como |A| y de un conjunto B como |B|, todas aquellas
operaciones que involucran los dos conjuntos, tales como unión, intersección, etcétera,
presentan una complejidad del orden de O(|A| x |B|). Del mismo modo, se puede indicar que
la operación de pertenencia de un elemento cualquiera de dichos conjuntos es del orden de
O(|A|) u O(|B|).

El espacio máximo ocupado por un conjunto cualquiera de elementos es, obviamente, el


tamaño del Arreglo.

IMPLEMENTACIÓN MEDIANTE LISTA ENLAZADA


Esta implementación es similar a la realizada mediante un Arreglo, con algunas pequeñas
diferencias que la hacen particular. Sin embargo en este caso, los tipos de datos comprendidos
para los elementos de cada conjunto son los mismos aceptados para los Arreglos.

Se debe suponer también que en este caso existe una relación específica de orden entre los
elementos del conjunto y que, por lo mismo, se pueden diferenciar elementos mayores de
elementos menores. También se aceptará que al insertar o eliminar elementos, la lista se
mantiene ordenada. Lo anterior supone una gran ventaja, ya que para cualquier operación

9
| ESTE DOCUMENTO CONTIENE LA SEMANA 7
sobre las listas de cada conjunto a operar, se debe hacer un único recorrido a fin de identificar
cada uno de sus elementos. Así, las operaciones de búsqueda, inserción y eliminación de
elementos tienen una ejecución en un tiempo del orden de O(|A|), siendo |A| el cardinal o
número de elementos del conjunto A.

Implementando un algoritmo del tipo Fusión de Listas Ordenadas, operaciones tales como la
unión o la intersección de conjuntos se logran a través de la realización de pequeñas
variaciones al algoritmo de intercalación de elementos.

En este caso en particular, las operaciones básicas que se verán en el ámbito de los Conjuntos
son:

• Definición del Tipo de Datos


• Definición del Conjunto Vacío
• Pertenencia a un Conjunto
• Intersección de Conjuntos
• Subconjuntos
• Igualdad de Conjuntos

Dado lo anterior, quedan propuestas –a modo de ejercicio– las siguientes operaciones con
Conjuntos en su implementación mediante Listas Enlazadas: Unión y Diferencia de Conjuntos.

NOTAS A ESTA IMPLEMENTACIÓN


• Los elementos de los conjuntos A y B sobre los que se ejecutarán los recorridos para
las operaciones se encuentran ordenados y no sufren modificaciones.

• Los punteros definidos para recorrer las listas c1 y c2 corresponden a los conjuntos A y
B respectivamente.

• Los punteros auxiliares aux y c3 serán utilizados en la creación del conjunto resultante
C.

• En los códigos presentados a continuación se asume que los elementos de cada


conjunto, vale decir, el tipo de datos a trabajar, son números enteros. Esto permite
que los elementos sean ordenables.

10
| ESTE DOCUMENTO CONTIENE LA SEMANA 7
DEFINICIÓN DEL TIPO DE DATOS

Como se puede ver en el código anterior, se utiliza en esta implementación con Listas
Enlazadas, una con cabecera ficticia y centinela para facilitar las operaciones de inserción y
búsqueda de elementos dentro del conjunto.

DEFINICIÓN DEL CONJUNTO VACÍO

Esta operación se realiza inicializando en cero el cardinal del conjunto y se reserva de paso la
memoria necesaria para alojar la cabecera y el centinela de la lista.

11
| ESTE DOCUMENTO CONTIENE LA SEMANA 7
PERTENENCIA A UN CONJUNTO

La verificación de la condición de pertenencia de un elemento a un conjunto dado se


determina recorriendo la lista de principio a fin o hasta encontrarlo. La rutina devuelve TRUE al
programa si el elemento es encontrado antes que el centinela.

INTERSECCIÓN DE CONJUNTOS
Se sabe que la intersección entre dos conjuntos corresponde a todos aquellos elementos que
pertenecen tanto a uno como al otro conjunto de datos estudiados. Por lo tanto:

12
| ESTE DOCUMENTO CONTIENE LA SEMANA 7
La rutina añade un elemento que es común a los conjuntos A y B al conjunto C, cada vez que
esta coincidencia es detectada (c1->elem == c2->elem).

SUBCONJUNTOS
Se sabe que un conjunto cualquiera (A) es subconjunto de otro (B) cuando todos sus
elementos son, a su vez, elementos de este último conjunto (B). Por lo tanto:

La rutina anterior devuelve TRUE si A es subconjunto de B. En ella, si un solo elemento de A no


está en B, A no es subconjunto de B. Si uno de los conjuntos (B) se encuentra totalmente
recorrido y aún falta por recorrer completamente el otro conjunto (A), se verifica que A no es
subconjunto de B, pero se debe observar con cuidado este paso, ya que podría significar que B
sí es subconjunto de A.

IGUALDAD DE CONJUNTOS
Sabiendo que, como lo hemos definido anteriormente, un conjunto (A) es igual a otro (B) si
ambos conjuntos contienen exactamente los mismos elementos, entonces:

13
| ESTE DOCUMENTO CONTIENE LA SEMANA 7
La rutina devuelve TRUE al programa si se verifica dicha condición. Para esto se comprueba en
primera instancia, la cardinalidad de los conjuntos A y B.

CONCLUSIONES DE ESTA IMPLEMENTACIÓN


Al igual que en la implementación a través de Arreglos, su gran ventaja es que no hay límite
sobre el rango en que se pueden representar los elementos de un conjunto, así como tampoco
sobre el tipo de datos a representar, siempre que estos permitan determinar la existencia de
elementos iguales o diferentes dentro del conjunto.

Si se define el cardinal del conjunto A como |A| y de un conjunto B como |B|, todas aquellas
operaciones que involucran los dos conjuntos, tales como unión, intersección, igualdad de
conjuntos, etcétera, se ejecutarán en un tiempo del orden de O(|A| + |B|).

El espacio máximo ocupado por un conjunto cualquiera de elementos es, obviamente, |A|.
Puede acotarse que este espacio es proporcional al implementado a través de un Arreglo, pero
esta vez multiplicado por la constante que significa la utilización de punteros.

14
| ESTE DOCUMENTO CONTIENE LA SEMANA 7
BIBLIOGRAFÍA
- Alfred V. Aho, John E. Hopcroft, Jefrey D. (1988). Estructuras de datos y algoritmos.
México, DF: Addison-Wesley. Iberoamericana: Sistemas Técnicos de Edición.

- Joyanes Aguilar, L., & Hermoso, Á. (2003). Fundamentos de Programación. Algoritmos y


estructuras de datos. Madrid: Editorial McGraw-Hill.

15
| ESTE DOCUMENTO CONTIENE LA SEMANA 7

También podría gustarte