02 ene 2009

Tipos abstractos de datos (TAD)

23 comentarios Informática, Personal

Estaba en mi habitación peleándome con la fiebre e intentando dormir, cuando recordé que otra noche de gripe hace un par de años hice un trabajo sobre los tipos abstractos de datos. Como recibí una buena calificación en él, lo dejo aquí por si le puede resultar útil a alguien. Además, recuerdo que también colgué este mismo trabajo en una antigua versión de este blog, allá por 2007.

1. La abstracción

A pesar de que estamos acostumbrados a utilizar el término abstracción dentro del contexto de la programación, la verdad es que esta palabra tiene un origen mucho más lejano. Desde siempre, el hombre se ha tenido que enfrentar a problemas muy complejos, sin embargo con el paso del tiempo hemos descubierto un buen método para enfrentarnos a ellos: la abstracción. Abstraer consiste en centrarse sólo en la parte principal y esencial de los problemas, dejando así a un lado todos los detalles insignificantes o menos importantes.

Un buen ejemplo de la capacidad humana para la abstracción es la elaboración y lectura y un mapa. Cuando dibujamos un mapa de carreteras, reflejamos en él los elementos principales, los que tienen utilidad para su interpretación, como por ejemplo las autopistas, autovías, carreteras nacionales, áreas de servicio, gasolineras, etc. Otros datos como podrían ser museos, parques o monumentos no aparecen ya que se consideran innecesarios en este tipo de mapas. La abstracción es una de las herramientas fundamentales de la mente humana, ya que nos permite dividir los problemas en partes independientes y solucionar cada una por separado.

2. La evolución de la abstracción en la programación

En los primeros tiempos de la informática, los programadores se comunicaban con las máquinas en binario, lo cual resultaba ser una tarea extremadamente larga y complicada. Al cabo de un tiempo apareció el código ensamblador, cuyos nemotécnicos facilitaron notablemente el trabajo de los programadores al evitar que tuviesen que recordar las secuencias de unos y ceros que formaban cada instrucción. Estos nemotécnicos constituyeron la primera escala de abstracción de la era informática.

Unos años más tarde llegaron los lenguajes de alto nivel y con ellos las macroinstrucciones. Gracias a estos lenguajes, los programadores pudieron comenzar a escribir software genérico, es decir, podían programar sin preocuparse de la máquina sobre la que iba a correr el programa. Esto se debía a que las instrucciones de los lenguajes de alto nivel producían varias acciones en la máquina, independientemente de las arquitecturas concretas de cada una de ellas. Con este tipo de lenguajes llegaron también las sentencias de control más habituales como los bucles o sentencias if-then.

En definitiva, la complejidad iba creciendo a medida que lo hacía la abstracción. Así fueron surgiendo los procedimientos y funciones, los módulos y posteriormente los tipos abstractos de datos.

3. Abstracción funcional y abstracción de datos

En la programación, la abstracción puede aplicarse de dos modos distintos dando lugar a la abstracción funcional y la abstracción de datos.

La abstracción funcional aparece al pensar de manera abstracta las operaciones que necesitamos para resolver un problema. Este tipo de abstracción nos permite definir operaciones nuevas en una aplicación que anteriormente carecía de ellas. La abstracción funcional fue la primera en aparecer ya que es fácil de llevar a la práctica debido a que su implementación es posible en la gran mayoría de los lenguajes de programación. Suele corresponderse con el uso de procedimientos o funciones.

La abstracción de datos surge cuando se abstrae el significado de los diferentes tipos de datos que aparecen en nuestro problema. Este tipo de abstracción nos permite crear nuevos tipos de datos pensando en los posibles valores que pueden tomar y en las operaciones que los manipulan. Como cabe esperar, estas operaciones serán a su vez abstracciones funcionales.

La abstracción de datos es más reciente que la funcional, ya que los primeros lenguajes de programación no ofrecían demasiadas facilidades para su uso. Uno de los primeros mecanismos que permitió esta abstracción fueron las clases de Simula.

4. Datos, tipos de datos y TAD

Para hablar de la abstracción es necesario tener clara la diferencia que existe entre los datos, los tipos de datos y los tipos abstractos de datos.

Los datos son los valores que manejamos en la resolución de un problema, tanto los valores de entrada, como los de proceso y los de salida. Es decir, los datos son información y por lo tanto distinguimos varios tipos de datos.

Un tipo de dato se puede definir como un conjunto de valores y un conjunto de operaciones definidas por esos valores. Clasificar los datos en distintos tipos aporta muchas ventajas, como por ejemplo indicarle al compilador la cantidad de memoria que debe reservar para cada instancia dependiendo del tipo de dato al que pertenezca.

Los tipos de datos abstractos van todavía más lejos; extienden la función de un tipo de dato ocultando la implementación de las operaciones definidas por el usuario. Esta capacidad de ocultamiento nos permite desarrollar software reutilizable y extensible, lo cual veremos más adelante cuando hablemos de modularidad.

5. Tipos abstractos de datos

Un tipo de datos definido por el programador se denomina tipo abstracto de datos (TAD) para distinguirlo de los tipos predefinidos de datos. Los tipos abstractos de datos están formados por los datos (estructuras de datos) y las operaciones (procedimientos o funciones) que se realizan sobre esos datos. El conjunto de operaciones definidas sobre el TAD debe ser cerrado, es decir, sólo se debe acceder a los datos mediante las operaciones abstractas definidas sobre ellos. La abstracción de datos sólo permite acceder a ellos de manera controlada.

Las estructuras de los TAD se componen de dos partes: la interfaz y la implementación. Esto se debe a que las estructuras de datos reales que utilizamos para almacenar la representación de un tipo abstracto de datos son invisibles para los usuarios o clientes. Mientras que en la interfaz se declaran las operaciones y los datos, la implementación contiene el código fuente de las operaciones y lo mantiene oculto al usuario.

Las principales ventajas que nos aportan los TAD son las siguientes:
1.    Mejoran la conceptualización y hacen más claro y comprensible el código.
2.    Hacen que el sistema sea más robusto.
3.    Reducen el tiempo de compilación.
4.    Permiten modificar la implementación sin que afecte al interfaz público.
5.    Facilitan la extensibilidad.

6. Construcción de un TAD

La construcción de un TAD consta de dos fases bien diferenciadas entre ellas: la especificación (formal e informal) y la implementación.

Las características de un TAD no deben depender de su realización concreta, sino solamente de cómo queremos que sea su comportamiento, lo cual llamamos especificación. Para la especificación de un tipo abstracto de datos en lenguaje natural (especificación informal) hemos de seguir el siguiente esquema:

TIPO DE DATOS    Nombre del tipo  (Lista de operaciones)
VALORES:              Descripción de los posibles valores
OPERACIONES:     Descripción de cada operación

Primero indicaremos el nombre del TAD y citaremos todas las operaciones definidas. En el apartado valores describiremos los posibles valores de los datos de este tipo, pero lo haremos desde un punto de vista abstracto, sin pensar en la posible realización concreta. Finalmente en el apartado operaciones haremos una descripción de cada una de las operaciones definidas sobre el TAD. En la especificación informal, habitualmente hacemos referencia a conceptos con los cuales el lector está familiarizado (como por ejemplo conceptos matemáticos). El problema surge cuando estos datos auxiliares no están definidos tan precisamente.

La especificación formal nos permite definir conceptos de manera mucho más precisa. Para ello utilizaremos este esquema:

Tipo: Nombre del tipo de datos
Sintaxis: Forma de las operaciones
Semántica: Significado de las operaciones

En el apartado sintaxis proporcionamos el tipo de datos de entrada y de salida de cada una de las funciones definidas sobre el TAD, mientras que en semántica describiremos sus comportamientos. Sin embargo, ésta vez lo haremos siguiendo unas normas algebraicas básicas.

En la implementación del TAD lo que hacemos es elegir la forma en que se van a representar los distintos valores que tomarán los datos. También seleccionaremos la manera en que se realizarán las operaciones. Para esta elección debemos tener en cuenta que todas las operaciones se realicen de la forma más eficiente posible, aunque con la práctica veremos que la mayoría de las veces una implementación facilita mucho algunas operaciones mientras que complica otras.

7. Modularidad

La programación modular descompone un programa en un pequeño número de abstracciones independientes unas de otras pero fáciles de conectar entre sí. Como hemos visto anteriormente, un módulo se caracteriza principalmente por su interfaz y su implementación. La programación modular sigue el criterio de ocultación de información: si no se necesita algún tipo de información, no se debe tener acceso a ella.

La modularidad es un aspecto muy importante en los TAD, ya que es el reflejo de la independencia de la especificación y la implementación. Es la demostración de que un TAD puede funcionar con diferentes implementaciones.

Además de esto, la programación modular ofrece otras ventajas, como por ejemplo un mejor reparto del trabajo y una detección de fallos mucho mejor.

8. TAD más comunes

Los tipos abstractos de datos básicos se clasifican habitualmente, atendiendo a su estructura, en lineales y no lineales.

8.1 TAD lineales

8.1.1 Listas

Esta forma de almacenar elementos consiste en colocarlos en una lista lineal que tiene un enlace por cada elemente para determinar cual es el elemento siguiente. Las listas se utilizan habitualmente para guardar elementos del mismo tipo y se caracterizan porque pueden contener un número indeterminado de elementos y porque siguen un orden explícito. La lista de cero elementos se denomina lista vacía.

8.1.2 Colas

En el contexto de la programación, una cola es una lista en la que los elementos se insertan por un extremo (llamado fondo) y se suprimen por el otro (llamado frente). En esta estructura de datos el primer elemento que entra es el primero en salir. Es un tipo de dato muy común tanto dentro de la informática como en la vida real.

8.1.3 Pilas

Una pila es una estructura de datos en la cual todas las inserciones y las eliminaciones se realizan por el mismo extremo, denominado cima de la pila. En una pila, el último elemento en entrar es el primero en salir, al contrario de lo que pasa en las colas.

8.2 TAD no lineales

8.2.1 Árboles

El árbol es un TAD que organiza sus elementos (nodos) de forma jerárquica. Si una rama va del nodo a al nodo b, entonces a es el padre de b. Todos los nodos tienen un padre, excepto el nodo principal, denominado raíz del árbol.

8.2.2 Árboles binarios de búsqueda

El árbol binario de búsqueda es una variación del TAD árbol. Se trata de aquellos árboles binarios (cada nodo tiene dos hijos como máximo) en los cuales todos los datos del subárbol izquierdo son menores que los datos del nodo, y los datos del subárbol derecho son mayores que los datos del nodo.

8.2.3 Grafos

Hemos visto que los árboles binarios representan datos entre los cuales existe una jerarquía. Los grafos sin embargo se utilizan para representar relaciones arbitrarias entre datos. En su representación, cada elemento de problema forma un nodo. La relación entre nodos forma una arista que puede ser dirigida o bidireccional (no dirigida).

Bibliografía

[Cairó, 2006]
[Joyanes, 1998]
[Collado, 1987]
Apuntes de EDI, David Paredes, 2007

Etiquetas:

23 respuestas en “Tipos abstractos de datos (TAD)”

  1. Erik_Skauch says:

    Que clásico trabajo de EDI, +0.25 en la nota final.

  2. Adriana says:

    Hola!
    Estaba buscando alguna documentación en la Web para mis alumnos de EStructuras y Algoritmos de Datos II, algo sencillo y correcto.
    Tu resumen sobre TADs está muy bueno y fácil de entender. Me viene muy bien ya que no tengo tiempo de escribir algo acorde a lss necesidades de este curso. Son estudiantes de carrera de informática técnica, analistas programadores. Les voy a dar tu trabajo para repaso del tema.
    GRACIAS!!!
    Adriana.

  3. David says:

    Es un placer saber que le va a servir de ayuda a alguien. Un saludo Adriana.

  4. Rik says:

    Gracias!, muy buen documento perfecto para lo que estoy estudiando en este momento. Saludos.

  5. nash says:

    la informacion proporcionada en este documental fu eficiente para poder estudiar para un examen q voy a presentar….gracias
    sigue asii porque si me sera de gran ayuda
    sale saludos y kisses cordiales para ti…

  6. nash says:

    me gustaria q m proporcionaras tu correo electronico para poder hacer una consulta…es que la materia q estoy estudiando es estructura de datos es necesito que me ayudaras…te agradeceria muchoo..

    GRACIAS..

    SALUDOS ESPECIAL PARA TI

  7. KARINA says:

    me preguntaba si x alguna duda le puedo preguntar a usted

  8. KARINA says:

    me preguntaba si x alguna duda le puedo preguntar a usted

  9. Sebastian says:

    Estaba estudiando para Algoritmos y estructuras de datos II, es una materia nueva en el plan nuevo que salio en el 2010. Al ser la primera vez que se da la materia, se nota que esta todo muy improvisado y tratan de dar muchos temas en 2 minutos y no se termina entiendo nada. En fin, lo que quiero decir es que tu apunte me ayudo mucho para entender ciertas cosas. Muchas gracias.

    Saludos.

  10. David says:

    Me alegro de que el trabajo te haya ayudado 😀

  11. Omar Aquino says:

    Quedó muy bueno, si tienes tiempo aderezalo con unos ejemplos

  12. Mladen Grujic lilly says:

    Howdy friend, this really is an example of most well written posts on given subject I’ve examine lately. Textual content is well written, and it’s also not very long for reading. Kind of publishing is both clear to most of folks, yet its not basic. Mate, you hit golden ratio here, continue the good work!

  13. David Fernando says:

    Muchas gracias por el post, me fue de gran utilidad para aclarar ciertas dudas. Gracias y sigue posteando nuevos temas sobre Estructura de Datos.

  14. Gon says:

    Gran trabajo, me ha valido mucho…y encima eres del depor…TU SI QUE VALES!!!!

  15. JOEL says:

    Muchas gracias por el resumen, la verdad que necesitaba tambien tener conocimientos sobre un TAD..

  16. Erik Guzmán F. says:

    Excelente trabajo, lo compartiré con mis alumnos, muy claro y comprensible, Gracias!!!!

  17. DENNIS JOSE CARBAJAL HERNANDEZ says:

    quisiera saver las ventajas de un TDA

  18. Vladimir says:

    Gracias!!!
    Buscando en la web debo comentar que este resumen esta excelente se entiende a la perfección, gracias, saludos!

  19. stefany says:

    esta muy bueno tu apunte me has hecho recordar mis epocas de estudiante…
    wooo m impresiono

  20. Natalia says:

    Hola muy bueno esto.Necesito saber Cuáles son los Tipo Abstracto de Dato – TAD (Nivel Lógico).

  21. mary says:

    Hola muy intersante

  22. Tipo abstracto de datos (TAD) – Definición | Albicode says:

    […] Fuente: www.davidparedes.es/tipos-abstractos-de-datos-tad/ […]

  23. Tipo abstracto de datos (TAD) | Apuig code says:

    […] Fuente: www.davidparedes.es/tipos-abstractos-de-datos-tad/ […]

Escribe un comentario