introducción a java

5
UNIVERSIDAD DE EL SALVADOR FACULTAD MULTIDISCIPLINARIA PARACENTRAL DEPARTAMENTO DE INFORMÁTICA INGENIERÍA DE SISTEMAS INFORMÁTICOS. ESTRUCTURA DE DATOS Ing. Yancy E. Martínez de Molina ESD- ciclo II/2015 . ESTRUCTURAS DE DATOS (Recopilado de Java a Fondo, 2ed. ING. PABLO ADGUSTO SZNAJDLEDER, Alfaomega - 2013) Las estructuras de datos representan formas de almacenar y organizar conjuntos de datos del mismo tipo. Además, deben proveer mecanismos de acceso rápido, ágil y eficiente. Llamamos “algoritmo” al conjunto (finito) de pasos con los que resolvemos un determinado problema computacional. Las estructuras de datos son el soporte fundamental de los algoritmos y la elección de una estructura adecuada facilita notablemente su desarrollo. Por el contrario, si la estructura de datos elegida como soporte para la resolución de un determinado algoritmo no es la indicada entonces su desarrollo se tornará excesivamente complejo. Obviamente, más allá de lo simple o complicada que pueda resultar la programación de un algoritmo en función de la estructura de datos elegida, existe una relación directa entre el rendimiento del algoritmo y la estructura de datos lo que hace que, en determinadas situaciones, la elección de la estructura de datos sea un tema crítico. Podemos clasificar las estructuras de datos en dos grupos: las estructuras estáticas y las estructuras dinámicas. Esta clasificación está relacionada con la capacidad que tiene la estructura para incorporar o deshacerse de elementos a medida que sea necesario. Los arrays (por ejemplo) son estructuras de datos estáticas. Si definimos un array de n elementos, entonces podremos almacenar en este a lo sumo n elementos. Independientemente de esto, el array insumirá una cantidad fija de memoria de n * t bytes siendo t la longitud del tipo de dato definido para el array. En cambio, un vector (un objeto de la clase Vector), por ejemplo, “representa” una estructura dinámica ya que nos permite almacenar tantos elementos como necesitemos, siempre y cuando tengamos memoria disponible. En un vector podemos agregar y eliminar elementos haciendo aumentar o disminuir la cantidad de memoria que ocupa. El vector no es en sí mismo una estructura de datos. En realidad, la clase Vector encapsula y mantiene una estructura de datos interna en la cual almacena la información. En general estudiaremos las principales estructuras de datos dinámicas y analizaremos las clases de la biblioteca que Java provee relacionadas a este tema. Estructuras dinámicas Las estructuras dinámicas permiten almacenar una cantidad variable de datos. Pueden crecer o decrecer según sea necesario incrementando o decrementando la cantidad de memoria que ocupan. En general la estructuras dinámicas se forman encadenando unidades de información llamadas “nodo”. Una estructura dinámica se compone de un conjunto de nodos enlazados entre sí más un conjunto de operaciones asociadas a través de las cuales podemos manipular y acceder al conjunto de nodos y a la información que estos contienen.

Upload: boris-miranda

Post on 10-Feb-2016

2 views

Category:

Documents


0 download

DESCRIPTION

introducción a java

TRANSCRIPT

Page 1: introducción a java

UNIVERSIDAD DE EL SALVADOR FACULTAD MULTIDISCIPLINARIA PARACENTRAL

DEPARTAMENTO DE INFORMÁTICA

INGENIERÍA DE SISTEMAS INFORMÁTICOS.

ESTRUCTURA DE DATOS

Ing. Yancy E. Martínez de Molina

ESD- ciclo II/2015 .

ESTRUCTURAS DE DATOS

(Recopilado de Java a Fondo, 2ed. ING. PABLO ADGUSTO SZNAJDLEDER, Alfaomega - 2013)

Las estructuras de datos representan formas de almacenar y organizar conjuntos de datos del mismo tipo. Además, deben proveer mecanismos de acceso rápido, ágil y eficiente. Llamamos “algoritmo” al conjunto (finito) de pasos con los que resolvemos un determinado problema computacional. Las estructuras de datos son el soporte fundamental de los algoritmos y la elección de una estructura adecuada facilita notablemente su desarrollo. Por el contrario, si la estructura de datos elegida como soporte para la resolución de un determinado algoritmo no es la indicada entonces su desarrollo se tornará excesivamente complejo. Obviamente, más allá de lo simple o complicada que pueda resultar la programación de un algoritmo en función de la estructura de datos elegida, existe una relación directa entre el rendimiento del algoritmo y la estructura de datos lo que hace que, en determinadas situaciones, la elección de la estructura de datos sea un tema crítico. Podemos clasificar las estructuras de datos en dos grupos: las estructuras estáticas y las estructuras dinámicas. Esta clasificación está relacionada con la capacidad que tiene la estructura para incorporar o deshacerse de elementos a medida que sea necesario.

Los arrays (por ejemplo) son estructuras de datos estáticas. Si definimos un array de n elementos, entonces

podremos almacenar en este a lo sumo n elementos. Independientemente de esto, el array insumirá una cantidad fija

de memoria de n * t bytes siendo t la longitud del tipo de dato definido para el array.

En cambio, un vector (un objeto de la clase Vector), por ejemplo, “representa” una estructura dinámica ya que nos

permite almacenar tantos elementos como necesitemos, siempre y cuando tengamos memoria disponible. En un

vector podemos agregar y eliminar elementos haciendo aumentar o disminuir la cantidad de memoria que ocupa.

El vector no es en sí mismo una estructura de datos. En realidad, la clase Vector encapsula

y mantiene una estructura de datos interna en la cual almacena la información. En general estudiaremos las principales estructuras de datos dinámicas y analizaremos las clases de la biblioteca que Java provee relacionadas a este tema.

Estructuras dinámicas Las estructuras dinámicas permiten almacenar una cantidad variable de datos. Pueden crecer o decrecer según sea necesario incrementando o decrementando la cantidad de memoria que ocupan. En general la estructuras dinámicas se forman encadenando unidades de información llamadas “nodo”. Una estructura dinámica se compone de un conjunto de nodos enlazados entre sí más un conjunto de operaciones asociadas a través de las cuales podemos manipular y acceder al conjunto de nodos y a la información que estos contienen.

Page 2: introducción a java

UNIVERSIDAD DE EL SALVADOR FACULTAD MULTIDISCIPLINARIA PARACENTRAL

DEPARTAMENTO DE INFORMÁTICA

INGENIERÍA DE SISTEMAS INFORMÁTICOS.

ESTRUCTURA DE DATOS

Ing. Yancy E. Martínez de Molina

ESD- ciclo II/2015 .

UNIDAD I: TIPOS ABSTRACTOS DE DATOS

(Recopilación de Mark Allen Weiss, “Estructura de Datos en Java”, Addison-Wesley y otras fuentes).

Cuando implementamos programas que modelen el mundo real nos topamos con un problema, en los lenguajes de programación sólo contamos con unos cuantos tipos de datos y en el mundo real no es suficiente con esto. En problemas reales es frecuente que la información que se maneje no sea de Tipo elemental, es decir; no solamente es de tipo entero, real, carácter, etc., Sino que es mucho más compleja. Por esta y otras razones debemos de ampliar nuestra noción de tipo de dato. Un tipo de dato es el conjunto de valores que puede tomar una variable. Como ejemplos tenemos a los boléanos que solo pueden tomar los valores CIERTO y FALSO. Matemáticamente podemos extender el concepto de tipo de dato a Tipo de Datos Abstractos. Un TDA es un modelo

matemático que define un tipo de dato con un conjunto de operaciones definidas sobre ese tipo de dato. Es posible que

esas operaciones den resultados pertenecientes a otro tipo de dato, pero por lo menos una de ellas, debe de dar un

resultado del tipo del TDA en cuestión. Para poder implantar un TDA mediante un lenguaje de programación se

requiere de una Estructura de Datos. Una ED es un conjunto de variables de distintos tipos interconectadas entre sí de

diferentes maneras. Las formas de representar una ED y sus interconexiones dependen del lenguaje de programación

con el que se trabaja.

La unidad básica de una ED es llamada celda. En un lenguaje de programación las celdas se representan comúnmente mediante registros. Un registro es un conjunto de variables de diferente tipo referenciadas por un mismo nombre, cada variable se denomina campo. Los mecanismos mediante los cuales se interconectan las celdas son: •Arreglos •Colecciones En el caso de los arreglos se maneja un arreglo de celdas Si manejamos apuntadores, las celdas tienen 2 campos: uno para el dato que se almacena y el otro es un apuntador a la siguiente celda. La última celda apunta al apuntador NULO, para indicar que no sigue otra. Esto puede visualizarse de la siguiente manera:

manzana

mandarina

naranja

piña

NULO

Fundamentalmente, un tipo de datos es un conjunto de valores y un grupo de operaciones sobre tales valores. Este

conjunto y estas operaciones forman una estructura matemática que se implementa usando una estructura particular

de datos de hardware o software.

Un TAD es una estructura algebraica, o sea, un conjunto de objetos con ciertas operaciones definidas sobre ellos. Piense, por ejemplo, en la calculadora: los elementos que maneja son cantidades numéricas y las operaciones que tiene definidas sobre éstas son las operaciones aritméticas.

Page 3: introducción a java

UNIVERSIDAD DE EL SALVADOR FACULTAD MULTIDISCIPLINARIA PARACENTRAL

DEPARTAMENTO DE INFORMÁTICA

INGENIERÍA DE SISTEMAS INFORMÁTICOS.

ESTRUCTURA DE DATOS

Ing. Yancy E. Martínez de Molina

ESD- ciclo II/2015 .

Es posible observar que las operaciones de un TAD son de diferentes clases: algunas de ellas nos deben permitir crear objetos nuevos, otras determinar su estado, unas construir otros objetos a partir de algunos ya existentes. Tipo: agrupación de elementos con características similares.

Abstracto: no concreto, conceptual.

Dato: información que una computadora puede entender.

Un Tipo Abstracto de Datos es un conjunto de valores y de operaciones definidos mediante una especificación

independiente de cualquier representación.

TAD = Representación (datos o valores)+ operaciones (funciones o procedimientos)

Formalmente un TAD es una declaración de datos empaquetada junto con la operaciones que son significativas para

el tipo de datos, en otras palabras encapsulamos los datos y las operaciones sobre esos datos y ocultamos estos

detalles a la vista del usuario

Para construir un abstracto de datos se debe poder:

1. Exponer una definición del tipo. 2. Hacer disponible un conjunto de operaciones que se pueden utilizar para manipular instancias de ese tipo. 3. Proteger los datos asociados con el tipo de modo que sólo se puede actuar sobre ellos con las rutinas

proporcionadas. 4. Hacer instancia a múltiples del tipo.

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

Especificación informal de un TAD

La especificación informal consta de dos partes:

• Detallar, en los datos del tipo, los valores que pueden tomar. • Describir las operaciones, relacionándolas con los datos. El formato que generalmente se emplea especifica primero el nombre del TAD y los datos:

TAD nombre del Tipo (valores y su descripción)

Para recordar Un tipo abstracto de datos puede definirse mediante la

ecuación:

TAD = Representación (datos) + Operaciones (funciones y procedimientos)

Page 4: introducción a java

UNIVERSIDAD DE EL SALVADOR FACULTAD MULTIDISCIPLINARIA PARACENTRAL

DEPARTAMENTO DE INFORMÁTICA

INGENIERÍA DE SISTEMAS INFORMÁTICOS.

ESTRUCTURA DE DATOS

Ing. Yancy E. Martínez de Molina

ESD- ciclo II/2015 .

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 se indica, de forma comprensible, lo que hace cada operación.

A continuación, cada una de las operaciones con sus argumentos y una descripción funcional en lenguaje natural.

Operación (argumentos). Descripción funcional

Como ejemplo se va a especificar el tipo abstracto de datos Conjunto;

PASO UNO:

TAD conjunto (colección de elementos sin duplicidades, pueden estar en cualquier orden, se usa para

representar los conjuntos matemáticos con sus operaciones).

PASO DOS:

Operaciones, existen numerosas operaciones matemáticas sobre conjuntos, algunas de ellas:

Conjuntovacio. : Crea un conjunto sin elementos. Añadir(Conjunto, elemento).: Comprueba si el elemento forma parte del conjunto, en caso negativo es añadido. La operación modifica al conjunto.

Retirar(Conjunto, elemento).: En el caso de que el elemento pertenezca al conjunto es eliminado de éste. La operación modifica al conjunto. Pertenece(Conjunto, elemento). : Verifica si el elemento forma parte del conjunto, en cuyo caso devuelve cierto.

Es vacio(Conjunto).: Verifica si el conjunto no tiene elementos conjunto, en cuyo caso devuelve cierto Cardinal(Conjunto).: Devuelve el número de elementos del conjunto.

Unión(Conjunto, Conjunto).:Realiza la operación matemática de la unión de dos conjuntos. La operación devuelve un conjunto con los elementos comunes y no comunes a los

dos argumentos.

Especificación formal de un TAD

La especificación formal proporciona un conjunto de axiomas que describen el comportamiento de todas las operaciones. La

descripción ha de incluir un parte de sintaxis, en cuanto a los tipos de los argumentos y el tipo del resultado, y una parte de semántica,

donde se detalla para unos valores particulares de los argumentos la expresión del resultado que se obtiene.

La especificación formal ha de ser lo bastante potente para que cumpla el objetivo de verificar la corrección de la implementación del

TAD.

El esquema que se sigue para especificar formalmente un TAD consta de una cabecera con el nombre del TAD y los datos:

TAD nombre del tipo (valores que toman los datos del tipo)

Sigue, a continuación, la sintaxis de las operaciones: se listan las operaciones indicando los tipos de los argumentos y el tipo

del resultado:

Page 5: introducción a java

UNIVERSIDAD DE EL SALVADOR FACULTAD MULTIDISCIPLINARIA PARACENTRAL

DEPARTAMENTO DE INFORMÁTICA

INGENIERÍA DE SISTEMAS INFORMÁTICOS.

ESTRUCTURA DE DATOS

Ing. Yancy E. Martínez de Molina

ESD- ciclo II/2015 .

Sintaxis

Operación (Tipo argumento, elemento )-> tipo resultado

Al hacer una especificación formal siempre hay operaciones definidas por sí mismas, se consideran constructores del TAD. Se puede decir que mediante estos constructores se generan todos los posibles valores del TAD. Normalmente, se elige como constructor la operación que inicializa (por ejemplo, Conjuntovacio en el TAD Conjunto), y la operación que añade un dato o elemento (esta operación es común a la mayoría de los tipos abstractos de datos).

TAD Conjunto(colección de elementos sin duplicidades, pueden estar en cualquier orden, se usa para representar los conjuntos matemáticos con sus

operaciones).

Sintaxis

Conjuntovacio -> Conjunto Añadir(Conjunto, Elemento) -> Conjunto Retirar(Conjunto, Elemento) -> Conjunto Pertenece(Conjunto, Elemento) -> boolean Esvacio(Conjunto) -> boolean Cardinal(Conjunto) -> entero Union(Conjunto, Conjunto) -> Conjunto

Ventajas de los tipos abstractos de datos.

Los tipos abstractos de datos proporcionan numerosos beneficios al programador, aquí se pueden resumir en los siguientes:

1. Permite una mejor conceptualización y modelización del mundo real. Mejora la representación y la comprensibilidad. Clarifica

los objetos basados en estructuras y comportamientos comunes.

2. Mejora la robustez del sistema. Si hay características subyacentes en los lenguajes permitiendo 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. Mejora el rendimiento (prestaciones). Para sistemas tipiados (tipificados), el conocimiento de los objetos permite la

optimización de tiempo de compilación.

4. Separa la implementación de la especificación. Permite la modificación y mejora de la implementación sin afectar a

la interfaz pública del tipo abstracto de dato.

5. Permite la extensibilidad del sistema. Los componentes de software reutilizables son más fáciles de crear y mantener.

6. Recoge mejor la semántica del tipo. Los tipos abstractos de datos agrupan o localizan las operaciones y la

representación de atributos.

7. Finalidad de uso: no necesitamos conocer los detalles internos del tipo de datos abstracto, solo la especificación

que es mucho más simple.

8. Desarrollo y mantenimiento: desarrollar y modificar código es mucho más sencillo. Localizar los errores es

mucho más simple ya que es más fácil su aislamiento.

9. Reusabilidad: el tipo de dato abstracto se puede usar en distintos programas.

Un programa que maneja un TAD lo hace teniendo en cuenta las operaciones o funcionalidad que tiene, sin interesarse por la

representación física de los datos. Es decir, los usuarios de TAD se comunican con éste a partir de la interfaz que ofrece el TAD

mediante funciones de acceso.