lunes, 17 de noviembre de 2014

UNIDAD 1 TIPOS DE DATOS ABSTRACTOS


Contenidos
Página
1.1 Tipos de datos abstractos (TDA)
1
1.2 Modularidad
6
1.3 Uso de TDA
6
1.4 Manejo de memoria estática
7
     1.4.1. Ejemplo
7
1.5 Manejo de memoria dinámica
10

Introducción.
Las computadoras como ya sabemos, fueron diseñadas o ideadas como una herramienta mediante la cual podemos realizar operaciones de cálculo complicadas en un lapso de mínimo tiempo. Pero la mayoría de las aplicaciones de este fantástico invento del hombre, son las de almacenamiento y acceso de grandes cantidades de información.
La información que se procesa en la computadora es un conjunto de datos, que pueden ser simples o estructurados. Los datos simples son aquellos que ocupan sólo un localidad de memoria, mientras que los estructurados son un conjunto de casillas de memoria a las cuales hacemos referencia mediante un identificador único.
Debido a que por lo general tenemos que tratar con conjuntos de datos y no con datos simples (enteros, reales, booleanos, etc.) que por sí solos no nos dicen nada, ni nos sirven de mucho, es necesario tratar con estructuras de datos adecuadas a cada necesidad.

Las estructuras de datos son una colección de datos cuya organización se caracteriza por las funciones de acceso que se usan para almacenar y acceder a elementos individuales de datos.

Una estructura de datos se caracteriza por lo siguiente:

-Pueden descomponerse en los elementos que la forman.
-La manera en que se colocan los elementos dentro de la estructura afectará la forma en que se realicen los accesos a cada elemento.
-La colocación de los elementos y la manera en que se accede a ellos puede ser encapsulada.
1.1. Tipos de Datos Abstractos (TDA)

Qué es un TDA? Según los libros:
• “Un TDA es un modelo matemático con una colección de operaciones definidas sobre el modelo” (Aho, Hoperoft y Ullman. “Fundamental Structures of Computer Science”, 1981).
• “Una clase de objetos definida por una especificación independiente de la representación“ (Guttag “Abstract Data Type and development of data structures “ ACM . Vol 20-6, 1977)
• “Es un tipo de dato definido por el usuario a través de una especificación y una implementación de los objetos abstractos”. (Rowe , “types” ACM sigplan, Vol 16-1, 1980).

· Un TDA es un tipo de dato definido por el programador que se puede manipular de un modo similar a los tipos de datos definidos por el sistema.
. Un TDA es el elemento básico de la abstracción de datos. Su desarrollo es independiente del lenguaje de programación utilizado, aunque este puede aportar mecanismos que faciliten su realización.

Algunos lenguajes de programación tienen características que nos permiten ampliar el lenguaje añadiendo sus propios tipos de datos. Un tipo de dato definido por el programador se denomina tipo abstracto de datos (TAD) para diferenciarlo  del tipo fundamental (predefinido) de datos.

El término abstracto se refiere al medio en que un programador abstrae algunos conceptos de programación creando un nuevo tipo de dato.

Por ejemplo, en Java, el tipo Punto, que representa las coordenadas x,y  de un sistema de coordenadas rectangulares, no existe. Sin embargo, es posible implementar el tipo abstracto de datos, considerando los valores que se almacenan en las variables y qué operaciones están disponibles para manipular estas variables.

En esencia, un tipo abstracto es un tipo de dato que consta de datos (estructuras de datos propias) y operaciones que se pueden realizar sobre ellos. Un TAD se compone de estructuras de datos y los procedimientos o funciones que manipulan esas estructuras de datos.

Un tipo abstracto de datos puede definirse mediante la ecuación:
TA D = Representación (datos) + Operaciones (funciones y procedimientos)

La estructura de un tipo abstracto de dato (clase), desde un punto de vista global, se compone de la interfaz y de la implementación.

Las estructuras de datos reales elegidas para almacenar la representación de un tipo abstracto de datos son invisibles a los usuarios o clientes. Los algoritmos utilizados para implementar cada una de las operaciones de los TAD están encapsuladas dentro de los propios TAD. La característica de ocultamiento de la información significa que los  objetos tienen interfaces públicas. Sin embargo, las representaciones e implementaciones de esas interfaces son privadas.

Estructura de un tipo abstracto de datos (TAD)

En un TDA existen dos elementos diferenciados:
- La Interfaz de utilización
- La representación
A la hora de utilizar el TDA, la representación debe permanecer oculta. Solo podremos utilizar las operaciones del tipo para trabajar con sus elementos.
Para construir un tipo abstracto debemos:
1. Exponer una definición del tipo.
2. Definir las operaciones (funciones y procedimientos) que permitan operar con instancias de ese tipo.
3. Ocultar la representación de los elementos del tipo de modo que sólo se pueda actuar sobre ellos con las operaciones proporcionadas.
4. Poder hacer instancias múltiples del tipo.

Tipos básicos de operaciones en un TDA
· Constructores: Crean una nueva instancia del tipo.
· Transformación: Cambian el valor de uno o más elementos de una instancia del tipo.
· Observación: Nos permiten observar el valor de uno o varios elementos de una instancia sin modificarlos.
· Iteradores: Nos permiten procesar todos los componentes en un TDA de forma secuencial.

Ventajas de los tipos abstractos de datos.
Un tipo abstracto de datos es un modelo (estructura) con un número de operaciones que afectan a ese modelo. Los tipos abstractos de datos proporcionan numerosos beneficios al programador, que se pueden resumir en los siguientes:
1. Permiten una mejor conceptualización y modelización del mundo real. Mejoran la representación y la comprensibilidad. Clarifican los objetos basados en estructuras y comportamientos comunes.
2. Mejoran la robustez del sistema. Si hay características subyacentes en los lenguajes, permiten la especificación del tipo de cada variable. Los tipos abstractos de datos permiten la comprobación de tipos para evitar errores de tipo en tiempo de ejecución.
3. Mejoran el rendimiento (prestaciones). Para sistemas tipeados (tipificados), el conocimiento de los objetos permite la optimización de tiempo de compilación.
4. Separan la implementación de la especificación. Permiten la modificación y la mejora de la implementación sin afectar la interfaz pública del tipo abstracto de dato.
5. Permiten la extensibilidad del sistema. Los componentes de software reutilizables son más fáciles de crear y mantener.
6. Recogen mejor la semántica del tipo. Los tipos abstractos de datos agrupan o  localizan las operaciones y la representación de atributos.
Un programa que maneja un TAD lo hace teniendo en cuenta las operaciones o la funcionalidad que tiene, sin interesarse por la representación física de los datos. Es decir, los usuarios de un TAD se comunican con éste a partir de la interfaz que ofrece el TAD mediante funciones de acceso. Podría cambiarse la implementación del tipo de dato sin afectar al programa que usa el TAD ya que para el programa está oculta.


Clasificación de los TDA.

·          Tipos de Datos Abstractos simples:
·          Cambian su valor pero no su estructura ® espacio de almacenamiento constante
·          Enteros, reales, booleanos, carácter, enumerado, subrango, etc.

·          Tipos de Datos Abstractos contenedores:
·          Cambian su valor y estructura (colecciones de elementos de número variable) ® espacio de almacenamiento variable
·          Listas, colas, pilas, árboles, grafos, conjuntos, etc.
·           
·          Tipos de datos abstractos inmutables:
·          Sus casos no pueden modificarse (se crean y destruyen, pero no existen operaciones de modificación)
·          Representación inmutable o mutable

·          Tipos de datos abstractos mutables:
·          Sus casos pueden modificarse (existen operaciones de modificación)
·          Representación mutable








Implementación de los TAD.

Las unidades de programación de lenguajes que pueden implementar un TAD reciben distintos nombres:

Modula-2          módulo
Ada                  paquete
C++                 clase
Java                 clase

En estos lenguajes se definen la especificación del TAD, que declara las operaciones y los datos, y la implementación, que muestra el código fuente de las operaciones, que permanece oculto al exterior del módulo.


ESPECIFICACIÓN DE LOS TAD.
El objetivo de la especificación es describir el comportamiento del TAD; consta de dos partes, la descripción matemática del conjunto de datos y la de las operaciones  definidas en ciertos elementos de ese conjunto de datos.

La especificación del TAD puede tener un enfoque informal, que describe los datos y las operaciones relacionadas en lenguaje natural. Otro enfoque mas riguroso, la especificación formal, supone suministrar un conjunto de axiomas que describen las operaciones en su aspecto sintáctico y semántico.

La especificación informal de un TAD tiene como objetivo describir los datos del tipo y las operaciones según la funcionalidad que tienen. No sigue normas rígidas al hacer la especificación, simplemente indica, de forma comprensible, la acción que realiza cada operación.



Especificación de un TDA
Es la descripción formal del tipo de dato que representa a una entidad a través de sus propiedades y su comportamiento. Dos niveles:
1) Especificación Sintáctica:
¿Qué hace? Especificación de las entidades y sus propiedades (interfaz)
Definir el nombre de las entidades abstractas.
Definir el nombre de las operaciones indicando el dominio (argumentos) y el codominio o rango (los valores de retorno)

Especificación Semántica:
¿Cómo lo hace? Descripción de la representación del objeto (estructura de los datos) y desarrollo de las operaciones.
• Definir el significado de cada operación usando los símbolos definidos en la especificación sintáctica.


1.2. Modularidad.

La modularidad descompone un programa en un pequeño número de abstracciones independientes unas de otras pero fáciles de conectar entre sí. 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 TDA, ya que es el reflejo de la independencia de la especificación y la implementación. Es la demostración de que un TDA puede funcionar con diferentes implementaciones. Además de esto, la programación modular ofrece otras ventajas como por ejemplo un mejor reparto de trabajo y una detección

La modularización de un programa utiliza la noción de tipo abstracto de dato (TAD) siempre que sea posible. Si el lenguaje de programación soporta los tipos que desea el usuario y el conjunto de operaciones sobre cada tipo, se obtiene un nuevo tipo de dato denominado TAD.


1.3.        Uso de TDA.
Ejemplos:
Una calculadora es un ejemplo de un TDA que maneja objetos de cantidades numéricas y las operaciones aritméticas sobre dichas cantidades.
Usa el sistema decimal para las cantidades y realiza operaciones de suma, resta, multiplicación, etc. Sin embargo, ¿Sabes cómo una calculadora representa las cantidades internamente? ¿En  binario? ¿Decimal? , ¿Palitos? ó ¿piedritas?.  NO!, no lo sabemos y tampoco nos hace falta para usar la calculadora.

Un sistema de numeración es un ejemplo de un tipo de dato abstracto que representa el concepto de cantidad. 
Los siguientes son ejemplos de sistemas de numeración:
Romano: I, V, X, L, C, D, M;
Decimal: 0, 1, 2, 3,…., 9;
Maya: . .. … __ _._



Las características más importantes son:

- “crear una protección de las entidades representadas”, es decir:
Oculta la representación e implementación de la entidad y sus operaciones. Nosotros no sabemos como la calculadora representa las cantidades ni como realiza la  operación de sumar.
-Sólo se manipulan a través de sus operaciones.
Nosotros solo podemos realizar las operaciones que la calculadora le permite realizar y nada más.

¿Cómo logramos crear dicha protección?. Según la ecuación de Wirth definimos un programa asi:
Programa = Datos + Algoritmos
Si podemos separar e identificar en un algoritmo las instrucciones que manipulan los datos de las instrucciones que indican control, entonces podemos reescribir la ecuación como:
Programa = Datos + Algoritmos-Datos + Algoritmo-Control
Donde TDA = Datos + Algoritmos-Datos, y por tanto la ecuación queda así:
Programa = TDA + Algoritmo de Control

Ventajas de uso de un TDA
• Herramienta para resolver problemas (nivel de abstracción)
• Independencia entre la forma de representar la información y la solución del problema portabilidad de la solución.
• Favorece la especificación, verificación y depuración de programas.
• Contribuye a la flexibilidad de los cambios.
1.4 Manejo de memoria estática
Las Estructuras de datos Estáticos son aquéllas en las que el tamaño ocupado en memoria se define antes de que el programa se ejecute y no pude modificarse dicho tamaño durante la ejecución del programa. Arreglos, Registros, archivos y cadenas.
Ejemplo: Arreglos Unidimensionales
Un arreglo unidimensional es un tipo de datos estructurado que está formado de una colección finita y ordenada de datos del mismo tipo. Es la estructura natural para modelar listas de elementos iguales.

El tipo de acceso a los arreglos unidimensionales es el acceso directo, es decir, podemos acceder a cualquier elemento del arreglo sin tener que consultar a elementos anteriores o posteriores, esto mediante el uso de un índice para cada elemento del arreglo que nos da su posición relativa.
Para implementar arreglos unidimensionales se debe reservar espacio en memoria, y se debe proporcionar la dirección base del arreglo, la cota superior y la inferior.

REPRESENTACION EN MEMORIA
Los arreglos se representan en memoria de la forma siguiente:
x : array[1..5] of integer
Para establecer el rango del arreglo (número total de elementos) que componen el arreglo se utiliza la siguiente fórmula:
RANGO = Ls - (Li+1)
donde:
ls = Límite superior del arreglo
li = Límite inferior del arreglo               
Para calcular la dirección de memoria de un elemento dentro de un arreglo se usa la siguiente fórmula:
A[i] = base(A) + [(i-li) * w]
donde :
A = Identificador único del arreglo
i = Indice del elemento
li = Límite inferior
w = Número de bytes tipo componente

Si el arreglo en el cual estamos trabajando tiene un índice numerativo utilizaremos las siguientes fórmulas:
RANGO = ord (ls) - (ord (li)+1)
A[i] = base (A) + [ord (i) - ord (li) * w]

Operaciones Con Arreglos.
Las operaciones en arreglos pueden clasificarse de la siguiente forma:
• Lectura
• Escritura
• Asignación
• Actualización
• Ordenación
• Búsqueda




a) LECTURA
Este proceso consiste en leer un dato de un arreglo y asignar un valor a cada uno de sus componentes.
La lectura se realiza de la siguiente manera:
para i desde 1 hasta N haz
x<--arreglo[i]
b) ESCRITURA
Consiste en asignarle un valor a cada elemento del arreglo.
La escritura se realiza de la siguiente manera:
para i desde 1 hasta N haz
arreglo[i]<--x

c) ASIGNACION
No es posible asignar directamente un valor a todo el arreglo, por lo que se realiza de la manera siguiente:
para i desde 1 hasta N haz
arreglo[i]<--algún_valor

d) ACTUALIZACION
Dentro de esta operación se encuentran las operaciones de eliminar, insertar y modificar datos. Para realizar este tipo de operaciones se debe tomar en cuenta si el arreglo está o no ordenado.
Cuando un arreglo esta desordenado primeramente se tiene que llevar a cabo la búsqueda del elemento y posteriormente se realizara la operación correspondiente ya sea inserción, eliminación o modificación. Por otro lado si el arreglo esta ordenado se realiza el recorrido buscando la posición correspondiente según el tipo de ordenamiento que tenga el arreglo para realizar las operaciones.
Veamos un ejemplo de inserción en arreglos ordenados:

1.- Insertar.
//Este algoritmo inserta un elemento y en un arreglo unidimensional que se encuentra ordenado de forma creciente. La capacidad máxima del arreglo es de 100 elementos. N indica el número actual de elementos de V
//POS e I son variables de tipo entero
Si (N < 100) entonces
            Llamar al algoritmo Busca_Secuencial_Ordenado con V,N, Y y POS
Si POS > 0 entonces  // El elemento fue encontrado en el arreglo
                        Escribir “el elemento ya existe”
Si No
                        Hacer N = N+1
                        POS = POS * -1
                        Repetir con I desde N hasta POS + 1
                                   Hacer V[I] = V [I-1]
                        Fin-Repetir
                        Hacer V[POS] = Y
            Fin-SI
Si No
            Escribir “No hay espacio en el arreglo”
Fin-SI

1.5  Manejo de memoria dinámica

Las Estructuras de datos Dinámicas no tienen las limitaciones o restricciones en el tamaño de memoria ocupada que son propias de las estructuras estáticas. Mediante el uso de un tipo de datos específico denominado puntero, es posible construir estructuras de datos dinámicas que son soportadas por la mayoría de los lenguajes.  Listas, árboles y grafos.








No hay comentarios:

Publicar un comentario