Algoritmos y Programación II 7504 Curso 2006 Concepto de Tipo de Dato Abstracto La abstracción es el mecanismo que permite seleccionar partes de un todo complejo para su consideración ignora

W
Document Sample
scope of work template
							Algoritmos y Programación II - 7504                                                   Curso 2006


Concepto de Tipo de Dato Abstracto:


La abstracción es el mecanismo que permite seleccionar partes de un todo complejo para su
consideración, ignorando el resto. Esto permite filtrar aquellos aspectos relevantes, y obtener
soluciones más generales.

El concepto de abstracción nos remite a la posibilidad de considerar la resolución de un
problema sin tener en cuenta los detalles por debajo de cierto nivel .

El concepto de Tipo de Dato Abstracto (TDA en castellano, ‘Abstract Data Type’ o ADT en
inglés) surgió para facilitar el trabajo con tipos de datos haciendo abstracción de la
implementación de los mismos.
Un TDA está dado por un grupo de datos que cumplen cierta condición especificada para el
TDA, más un conjunto de operaciones que representan el comportamiento del TDA.
La entidad TDA exporta las características de forma de las operaciones.
La implementación de la estructura del TDA, y de las operaciones propias son privadas.
No se permite acceso ni visibilidad a la implementacion de un TDA. Esta parte oculta está
constituída por la maquinaria algorítmica que implementa la semántica de los operadores. De
este modo un TDA encapsula ciertos tipos de datos en cuanto a la definición del tipo y todas las
operaciones del mismo en una sección del código.

Los TDA constituyen una forma de generalización y encapsulamiento de los aspectos más
importantes de la información que se debe manejar en la resolución de un problema, sin
considerar las cuestiones relativas a la implementación.
Un TDA define una nueva clase de concepto que puede manejarse con independencia de la
estructura de datos para representarlo. Es una generalizaciones de los tipos de datos básicos y de
las operaciones primitivas.
Es decir,

      TDA = Representación (estructuras de datos) + Operaciones (métodos)


La especificación de un TDA es la descripción del comportamiento del mismo. Debe
formalizarse. Indica qué hace el TDA.
La representación es la forma concreta en que se representan los datos en un determinado
lenguaje de programación.
La implementación es la forma específica en que se expresan las operaciones. Aquí se
considerará la estructura de datos más conveniente. Está dado por un grupo de instrucciones a
ser ejecutadas por la computadora, y se escribe en uno o más lenguajes de programación.
Cada implementación corresponde a alguna especificación.


Hay dos tipos de especificaciones formales de un TDA:

1. Axiomática : expresión de la forma de las operaciones, indicando las reglas a seguir para
realizar cada operación
2. Semántica : expresión de la operatoria de las operaciones. Se especifican las consecuencias
de las operaciones para el TDA. Se da mediante el lenguaje natural, o mediante especificación
algebraica.




                                                                                                  1
Algoritmos y Programación II - 7504                                                           Curso 2006


Como realizar la especificación formal un TDA:


 Se debe indicar el nombre tanto del TDA y del elemento base del mismo (a veces llamado
 TDA elemental, o TDA contenido), así como indicar todos los nombre de los conjuntos de
 objetos y/o otros TDA involucrados en la definición del TDA ( los conjuntos del TDA en
 definición, los del tipo base y los que se requieran para trabajar con aquellos), y los
 invariantes de representación.
 Especificar la sintaxis corespondiente a las operaciones propias del TDA, o primitivas del
 mismo.
 Generalmente con notación funcional, se indica sobre que conjunto actúan las operaciones y
 qué dan como resultado.
 Especificar la semántica axiomática y operativa. Hay que detallar las pre y
 postcondiciones de cada operación sobre el TDA

Las precondiciones de una operación representan los requisitos que se deben cumplir para que la
operación se lleve a cabo.
Las postcondiciones expresan las condiciones que se verificarán para el TDA luego de llevada a
cabo la operación correspondiente.

Invariante de un TDA:
Es una proposición que expresa el conjunto de valores válidos del TDA. Expresa la estructura
abstracta del TDA.
El invariante permite saber qué elementos pertenecen al TDA y qué elementos no.

Tener en cuenta que el conjunto de axiomas que definen un TDA debe ser completo en el sentido de
definir el resultado de todas las aplicaciones permisibles de las operaciones sobre el TDA, y debe definir
operaciones que permitan construir todas las posibles instancias o situaciones del TDA.
El estado de un objeto se determina por las variables que lo definen, las cuales son modificadas a través
de métodos, por ejemplo mediante la utilización de algún operador.
Luego de aplicar ese operador siempre se debe verificar el cumplimiento de determinadas condiciones
que definen a qué estado debe pasar ese objeto luego de aplicar dicho operador.
Esto se formaliza mediante uno o más axiomas.
Para cada método que implique un cambio de estado en el objeto, se establece un axioma para los fines
antes expuestos.
Tener en cuenta que el estado de un objeto puede depender del estado de otro objeto al que el hace
referencia. El conjunto de axiomas que verifica la integridad del estado de un objeto está formado por los
axiomas particulares inherentes a su TDA, más los definidos en el TDA del objeto referenciado.


Para evaluar la calidad de una implementación de un TDA se considera el requerimiento de
espacio, el tiempo empleado en las distintas operaciones, y la posibilidad de reutilización que
ofrezca.

Se llama ciclo de vida de un TDA al conjunto de etapas por las que atraviesa todo TDA.
Estas son:
Diseño: etapa en la cual se especifica el TDA.
Implementación : se escribe la codificación correspondiente al TDA.
Uso: se utiliza la implementación del TDA en la resolución de un problema.


Los TDA pueden clasificarse en
simples: son aquellos que cambian su valor pero no su estructura (el espacio de almacenamiento
es constante)




                                                                                                         2
Algoritmos y Programación II - 7504                                                   Curso 2006


contenedores: son aquellos que cambian su valor y estructura (son conjuntos o colecciones de
elementos de número variable)

Es frecuente definir TDA Contenedor como una colección de objetos más un conjunto de
métodos
para gestionarlos (permite realizar altas y bajas de elementos en el contenedor, acceder a ellos,
etc.).
Entonces, considerando que los tipos simples también se corresponden con determinados TDA,
se puede decir que un TDA es un contenedor si contiene varias instancias de otros TDA.

Se dice que un contenedor es polimórfico si puede almacenar instancias de tipos de datos
diferentes.
Los contenedores son abstracciones de las estructuras de datos.


Contenedores secuenciales

Organizan los datos en orden lineal.
A cada elemento del contenedor se le asocia la posición que ocupa en el mismo.
Los principales contenedores secuenciales son :
Vector dinámico (vector)
Lista (list)
Pila (stack)
Cola (queue)

Contenedores de acceso directo

Garantizan acceso a cualquier componente en tiempo constante.
El principal es el Vector dinámico

Contenedores asociativos

Permiten gestionar los datos mediante claves que los identifican posibilitando la recuperación
eficiente a partir de las mismas.
Los principales son:
Conjunto (set)
Bolsa (multiset)
Diccionario (map)


Contenedores parametrizables:

La parametrizacion es una técnica de programación que permite producir productos de
programación de alta calidad
Un contenedor parametrizado puede almacenar cualquier tipo de elemento, y no sólo de un tipo
en particular.
Para que la cohesión entre el contenedor y su elemento contenido sea lo más baja posible, el
‘enlace’ entre ambos debe hacerse únicamente a través de las operaciones básicas del tipo base,
o TDA elemental.
Los contenedores que es importante parametrizar son básicamente tres: el arreglo, la lista y el
árbol, dado que todos los demás contenedores se obtienen a partir de estos.

Consideraciones de requerimientos de un contenedor parametrizable :




                                                                                                    3
Algoritmos y Programación II - 7504                                                      Curso 2006


La diferencia de coste en tiempo de ejecución de usar un contenedor parametrizable en lugar de
uno específicamente para un determinado tipo tarea debe ser mínimo
La diferencia de espacio requerida por el contenedor parametrizable debe ser nula o mínima
(máximo O(n)).
Las instancias de cada contenedor deben poder compartir código, independientemente del tipo
de datos que contengan(aumenta la eficiencia y disminuye el tamaño de las aplicaciones)
La reutilización de código debe contemplar la portabilidad.


Utilización de referencias en la parametrización de contenedores:

El uso de referencias o punteros a los objetos almacenados, en lugar de copiar el elemento en el
contenedor, aumenta las posibilidades de compartir código objeto(la semántica de referencia es
una metodología que permite el llamado polimorfismo uniforme). De esta forma, el contenedor
básicamente manipula los enlaces a los objetos.
La aplicación del concepto de Polimorfismo uniforme, asegura que los tipos siempre
compartan la implementación de cualquier algoritmo polimórfico.
En particular, se garantiza utilizando las plantillas, ‘template’ de C++.

Las operaciones de los contenedores pueden agruparse en los siguientes grupos:

Examinadores: sirven para saber si el contenedor está vacío o lleno (Empty() y Full()).Nunca
alteran el valor del contenedor.
Enumeradores: para averiguar cuántos elementos están almacenados en el contenedor, o en
alguna de sus (Count())
Posicionadores: sirven para permitir ‘moverse’ hasta una determinada posición del
contenedor.(por ejemplo, First(), Last(), etc).
Dentro de los posicionadores se pueden diferenciar:
Recorredores: para examinar uno a uno los objetos del contenedor, y para moverse dentro del
ADT. Avanzan y retroceden en el contenedor respecto a una posición relativa actual (Next(),
Prev(), Father(), Child(), etc.).
Localizadores: sirven para encontrar un elemento dentro del contenedor (Locate(), Find() ).
Accesadores o iteradores: son operadores que guían el recorrido de la estructura dentro del
TDA, sin modificarlo, por ejemplo, permitiendo pasar de un elemento al que se haya establecido
como siguiente dentro del TDA. Algunos permiten modificar un objeto contenido; otros, no.
Sirven para recorrer en un orden predefinido los elementos que están almacenados en un
contenedor. Este orden debe ser especificado de forma precisa.
Insertadores: permiten agregar un nuevo objeto al contenedor. Por lo general las operaciones
de inserción requieren que se indique dónde se realizará la inserción( Insert() suele ser un
nombre genérico, para cada TDA en particular puede variar)
Borradores: permiten eliminar objetos del contenedor(Delete()). Generalmente se indica en qué
posición se realizará el borrado.



Se llama Instanciación al proceso de especializar una plantilla de código parametrizable a un
tipo. Para instanciar basta copiar el código de la plantilla y sustituirle las hileras por los nombres
adecuados de las constantes y los tipos de datos.
Una instancia de TDA es un elemento que pertenece al TDA. El TDA es abstracto mientras que
la instancia es concreta.




                                                                                                    4

						
Related docs