Você está na página 1de 11

Unidad I Introduccin a las estructuras de datos 1.

1 TDA Un algoritmo es una secuencia finita de operaciones, organizadas para realizar una tarea determinada. Las estructuras de datos son la forma en que se organizan los datos para ser usados. Puede ser una coleccin de variables, posiblemente de diferentes tipos de datos, conectadas de un modo determinado. Una estructura de datos bien organizada debe permitir realizar un conjunto de acciones sobre los datos de tal forma de minimizar el uso de los recursos y el tiempo empleado para efectuar la operacin. Abstraccin La abstraccin es un mecanismo fundamental para la comprensin de fenmenos o situaciones que implican gran cantidad de detalles. Abstraccin es la capacidad de manejar un objeto (tema o idea) como un concepto general, sin considerar la enorme cantidad de detalles que pueden estar asociados con dicho objeto. Ejemplo, se puede saber conducir un automvil sin conocer el tipo del modelo o cmo est fabricado. La abstraccin se utiliza para suprimir detalles irrelevantes, mientras se enfatiza en los relevantes o significativos. El beneficio principal de la abstraccin es que facilita al programador pensar acerca del problema a resolver. Uno de los principios importantes del diseo de software es el de la abstraccin y ocultacin de la informacin. Abstraccin de datos es una tcnica que permite inventar nuevos tipos de datos que sean ms adecuados a una aplicacin y, por consiguiente, facilitar la escritura del programa Tipo Abstracto de Dato (TDA) Qu es un TDA? Un TDA es un modelo matemtico con una coleccin de operaciones definidas sobre el modelo (Aho, Hoperoft y Ullman. Fundamental Structures of Computer Science, 1981). Una clase de objetos definida por una especificacin independiente de la representacin (Guttag Abstract Data Type and development of data structures ACM . Vol 20-6, 1977) Es un tipo de dato definido por el usuario a travs de una especificacin y una implementacin de los objetos abstractos. (Rowe , types ACM sigplan, Vol 16-1, 1980). Un tipo de dato abstracto (TDA) o Tipo abstracto de datos (TAD) es un modelo matemtico compuesto por una coleccin de operacionesdefinidas sobre un conjunto de datos para el modelo. Annimo Un TDA es un tipo de dato definido por el usuario para representar una entidad (abstraccin) a travs de sus caractersticas (datos o atributos) y sus operaciones o funciones (algoritmos que manipulan los datos). Hilda Contreras Un TDA est caracterizado por un conjunto de operaciones (mtodos) al cual le denominamos usualmente como su interfaz pblica y representan el comportamiento del TDA; mientras que la implementacin como

la parte privada del TDA est oculta al programa cliente que lo usa. Todos los lenguajes de alto nivel tienen predefinidos TDA. Con mucha frecuencia se utilizan los trminos TDA y Abstraccin de Datos de manera equivalente, y esto es debido a la similitud e interdependencia de ambos. Sin embargo, es importante definir por separado los dos conceptos. La abstraccin de datos consiste en ocultar las caractersticas de un objeto y obviarlas, de manera que solamente utilizamos el nombre del objeto en nuestro programa. Esto es similar a una situacin de la vida cotidiana. Cuando se dice la palabra perro, usted no neces ita que se le diga lo que hace el perro. Usted ya sabe la forma que tiene un perro y tambin sabe que los perros ladran. De manera que se abstraen todas las caractersticas de los perros en un solo trmino, perro. A esto se le llama Abstraccin y es un concepto muy til en la programacin, ya que un usuario no necesita mencionar todas las caractersticas y funciones de un objeto cada vez que ste se utiliza, sino que son declaradas por separado en el programa y simplemente se utiliza el trmino abstracto (perro) para mencionarlo. En el ejemplo anterior, perro es un Tipo de Dato Abstracto y todo el proceso de definirlo, implementarlo y mencionarlo es a lo que llamamos Abstraccin de Datos. Otro ejemplo: Una calculadora es un ejemplo de un TDA que maneja objetos de cantidades numricas y las operaciones aritmticas sobre dichas cantidades. Usa el sistema decimal para las cantidades y realiza operaciones de suma, resta, multiplicacin, etc. Sin embargo, Ud. sabe cmo una calculadora representa las cantidades internamente? En Binario? Decimal? Palitos? Piedritas? NO no lo sabe y tampoco le hace falta para usar la calculadora. Un sistema de numeracin es un ejemplo de un tipo de dato abstracto que representa el concepto de cantidad. 1.2 Modularidad La modularidad es la posibilidad de dividir una aplicacin en piezas ms pequeas llamadas mdulos. Por qu Modulamos las aplicaciones? Descomponer el problema en partes ms simples Facilitar la comprensin del sistema y de cada una de sus partes. Si se produce un error en un mdulo, ste slo afecta a dicho mdulo Las correcciones debidas a cambios en la especificacin afectan a un nmero reducido de mdulos.

El sistema est compuesto de una serie de mdulos independientes comunicados entre s Cmo se debe modular una aplicacin? El mdulo debe dejar bien claro cmo hacer uso de l El acceso a los servicios de un mdulo debe ser homogneo Un mdulo debe estar listo para su uso pero a su vez debe poder mejorarse El lenguaje de programacin utilizado debe soportar el uso de mdulos

1.3 Uso de TDA Elaborar un ejercicio que permita realizar operaciones sobre conjuntos a travs de los TDA BitSet y StringTokenizer. Las operaciones que permitir realizar son: a) Unin b) Interseccin c) Diferencia Clase BitSet Java proporciona otra alternativa para manipular los bits y esta es mediante la clase BitSet(Conjunto de bits) que crea un tipo especial de arreglo que contiene valores de bits. Este puede aumentar de tamao segn se necesite. Esto lo hace similar a la clase vector. Los constructores definidos para esta clase son: BitSet( ) BitSet(int tamao) La primera opcin crea un objeto por defecto y la segunda opcin permite especificar su tamao inicial (Esta es la cantidad de bits que puede contener). Todos los bits se inicializan en cero. Los mtodos definidos para la clase BitSet son;
Mtodo void and(BitSet conjBits) Descripcin Hace un AND entre los contenidos del objeto BitSet invocante y los especificados por conjBits. El resultado se coloca en el objeto invocante. Por cada bit 1 en conjBits, se borra el correspondiente bit en el BitSet invocante. Pone a cero el bit especificado por ndice. Duplica el objeto BitSet invocante. Devuelve true si el conjunto de bits invocante es equivalente al pasado en conjBits. De los contrario, el mtodo devuelve false. Devuelve el estado actual del bit en el ndice especificado. Devuelve el cdigo de dispersin del objeto invocante. Devuelve el nmero de bits requeridos para almacenar los contenidos del BitSet invocante. Este valor es determinado por la posicin del ltimo bit a 1. Hace un OR de los contenidos del objeto BitSet invocante con los del especificado por conjBits. El resultado se coloca en el objeto invocante. Pone en 1 el bit especificado por ndice. Devuelve el nmero de bits en el objeto BitSet invocante. Devuelve la cadena equivalente del objeto BitSet invocante. Hace un XOR de los contenidos del objeto BitSet invocante con los del especificado por conjBits. El resultado se coloca en el objeto invocante.

void andNot(BitSet conjBits) void clear(int indice) Object clone( ) bolean equals(Object conjBits)

boolean get(int indice) int hashCode( ) int length( )

void or(BitSet conjBits)

void set(int ndice) int size( ) String toString( ) void xor(BitSet conjBits)

Manejo de Memoria La administracin de memoria de una computadora es una tarea fundamental debido a que la cantidad de memoria es limitada.

El sistema operativo es el encargado de administrar la memoria del sistema y compartirla entre distintos usuarios y/o aplicaciones. El RTS (Run Time System) de un lenguaje de programacin administra la memoria para cada programa en ejecucin. La ejecucin de un programa requiere que diversos elementos se almacenen en la memoria: Cdigo del programa (instrucciones) Datos Permanentes Temporales Direcciones para controlar de flujo de ejecucin del programa Memoria esttica y dinmica A la asignacin de memoria para algunos elementos fijos del programa que es controlada por el compilador se le llama asignacin de memoria esttica. A la asignacin y posible recuperacin de memoria durante la ejecucin de un programa y bajo su control, se le llama asignacin de memoria dinmica. 1.4 Manejo de memoria esttica Para implementar alguna estructura de datos, primero es necesario tener muy claro cmo va a ser el manejo de memoria. La diferencia entre estructuras estticas y dinmicas esta en el manejo de memoria. En la memoria esttica durante la ejecucin del programa el tamao de la estructura no cambia. La estructura que maneja memoria esttica son los vectores. Un vector es una coleccin finita, homognea y ordenada de elementos. Es finita porque todo arreglo tiene un lmite, homognea porque todos los elementos son del mismo tipo y ordenada porque se puede determinar cul es el ensimo elemento. Un vector tiene dos partes: Componentes e ndices Los componentes hacen referencia a los elementos que forman el arreglo y los ndices permiten referirse a los componentes del arreglo en forma individual. Los arreglos se clasifican en: Unidimensionales (vectores o listas) Bidimensionales (matrices o tablas) Multidimensionales Los arreglos tienen localidades de memoria continuas y para determinar el espacio que deben ocupar, se requiere conocer la posicin inicial del arreglo en la memoria y el tipo de datos primitivo del que fue declarado, como se aprecia en la siguiente tabla. Tipo de dato primitivo byte char short int float long double Tamao en Bytes de memoria 1 2 2 4 4 8 8

Para determinar la direccin fsica de un elemento de un arreglo unidimensional en la memoria se requiere la siguiente frmula:

Direccin de memoria = Direccin inicial en la memoria + Posicin del arreglo o ndice * Tamao en bytes del tipo de dato primitivo Ejemplo. Si tenemos un arreglo de 5 elementos enteros y queremos determinar la direccin de memoria que ocupa cada uno, tomando en cuenta que la direccin inicial del arreglo es 1300, el resultado sera es siguiente:

arreglo ndice direccin

10 0 1300

20 1 1304

30 2 1308

40 3 1312

50 4 1316

arreglo[0] = 1300 + 0 * 4 = 1300 arreglo[1] = 1300 + 1 * 4 = 1304 arreglo[2] = 1300 + 2 * 4 = 1308 arreglo[3] = 1300 + 3 * 4 = 1312 arreglo[4] = 1300 + 4 * 4 = 1316 Ejercicio. Encontrar las direcciones de memoria fsica que ocupara cada uno de los elementos de un vector de n elementos de tipo flotante si conocemos que la direccin inicial del mismo es la 1345. Ejercicio. Encontrar cual es la direccin fsica que ocupan los siguientes elementos A, M, R, H, G y O de un arreglo que contiene el alfabeto en forma ordenada de la A a la Z y su direccin inicial es la 65. Ejercicio. Si contamos con dos vectores almacenados en la memoria de n elementos enteros cada uno y queremos calcular la suma de los vectores, almacenando el resultado en un tercer vector, encuentre las direcciones de memoria que ocuparn cada uno de los arreglos si se encuentran en una forma consecutiva y la direccin inicial del primero es la 30. Arreglos Bidimensionales. Un arreglo bidimensional (matriz o tabla), es un conjunto de elementos homogneos definidos bajo una estructura finita, controlado por dos ndices y su representacin es por un conjunto de renglones y columnas, en forma de una malla. Para determinar la direccin fsica de un elemento de un arreglo bidimensional en la memoria se puede seguir una de las siguientes formulas: Por renglones. Direccin de memoria = Direccin inicial en la memoria + (Numero de columnas del arreglo * Posicin del arreglo en rengln o ndice de rengln + Posicin del arreglo en columna o ndice de columna) * Tamao en bytes del tipo de dato primitivo

Ejemplo. Si tenemos un arreglo de 3 renglones y 3 columnas con elementos enteros y queremos determinar la direccin de memoria que ocupa cada uno, tomando en cuenta que la direccin inicial del arreglo es 2700, el resultado sera es siguiente:

arreglo 0 1 2

0 40 70 70

1 50 80 80

2 60 90 90

direccin 0 1 2

0 2700 2712 2724

1 2704 2716 2728

2 2708 2720 2732

arreglo[0][0] = 2700 + (3 * 0 + 0) * 4 = 2700 arreglo[0][1] = 2700 + (3 * 0 + 1) * 4 = 2704 arreglo[0][2] = 2700 + (3 * 0 + 2) * 4 = 2708 arreglo[1][0] = 2700 + (3 * 1 + 0) * 4 = 2712 arreglo[1][1] = 2700 + (3 * 1 + 1) * 4 = 2716 arreglo[1][2] = 2700 + (3 * 1 + 2) * 4 = 2720 arreglo[2][0] = 2700 + (3 * 2 + 0) * 4 = 2724 arreglo[2][1] = 2700 + (3 * 2 + 1) * 4 = 2728 arreglo[2][2] = 2700 + (3 * 2 + 2) * 4 = 2732 Ejercicio. Determinar cual es la direccin de memoria fsica que ocupan los elementos de la diagonal principal de una matriz, si su direccin inicial es 1971. Ejercicio. Buscar cuales son las direcciones de memoria fsica que ocupan todos los elementos pares de una matriz, si inicia en la direccin 2001. Ejercicio. Encontrar cuales son las direcciones de memoria fsica donde se encuentra el elemento mayor de una matriz, si su direccin inicial es la 2004. Por columnas. Direccin de memoria = Direccin inicial en la memoria + (Numero de renglones del arreglo * Posicin del arreglo en columna o ndice de columna + Posicin del arreglo en rengln

o ndice de rengln) * Tamao en bytes del tipo de dato primitivo

Ejemplo. Tomamos como base el ejemplo anterior, pero ahora con columnas quedara de la siguiente manera:

arreglo 0 1 2

0 40 70 70

1 50 80 80

2 60 90 90

direccin 0 1 2

0 2700 2704 2708

1 2712 2716 2720

2 2724 2728 2732

arreglo[0][0] = 2700 + (3 * 0 + 0) * 4 = 2700 arreglo[1][0] = 2700 + (3 * 0 + 1) * 4 = 2704 arreglo[2][0] = 2700 + (3 * 0 + 2) * 4 = 2708 arreglo[0][1] = 2700 + (3 * 1 + 0) * 4 = 2712 arreglo[1][1] = 2700 + (3 * 1 + 1) * 4 = 2716 arreglo[2][1] = 2700 + (3 * 1 + 2) * 4 = 2720 arreglo[0][2] = 2700 + (3 * 2 + 0) * 4 = 2724 arreglo[1][2] = 2700 + (3 * 2 + 1) * 4 = 2728 arreglo[2][2] = 2700 + (3 * 2 + 2) * 4 = 2732 Ejercicio. Encuentre las direcciones de memoria fsica de los elementos impares de una matriz, si su direccin inicial es la 1979. Ejercicio. Determinar cules son las direcciones de memoria donde se encuentran las vocales de una matriz, si su direccin inicial es la 2312. Con los arreglos unidimensionales o bidimensionales se pueden desarrollar una serie de operaciones tales como: Lectura / Escritura. Asignacin. Actualizacin: Insercin. Eliminacin.

Modificacin. Ordenamiento. Bsqueda.

De las operaciones anteriores la insercin, eliminacin y modificacin son operaciones que solo se aplican a un elemento y no a todos de forma global.

1.5 Manejo de memoria dinmica En la memoria dinmica durante la ejecucin del programa el tamao de la estructura puede cambiar. La memoria dinmica, es el espacio de almacenamiento que solicita una clase o mtodo en tiempo de ejecucin. De esa manera, a medida que el proceso requiere de ms espacio se solicita al sistema operativo, sin que el proceso se preocupe por donde sern asignados los datos, ni que espacios de memoria nos entregara el sistema operativo. As como existen estructuras de datos estticas (arreglos), tambin existen estructuras de datos dinmicas (listas y rboles), estas ltimas son generadas a partir de un tipo de dato conocido como referencia (direccin de memoria). Para utilizar las referencias se requiere de un elemento llamado nodo, el cual se estructura de la siguiente manera. Dato Dir Dato Dir Dir Nodo con una referencia Nodo con dos referencias

Las estructuras de datos que usan nodos pueden ser lineales o no lineales, dentro de las lineales se encuentran las listas simples y dobles y en las no lineales encontramos los rboles, estas estructuras se representan de la siguiente forma. Lista simple. Dato Dir > ----Dato Dir ------> Dato Dir

Lista doble Dir Dato Dir ----> <----Dir Dato Dir ---> <--Dir Dato Dir

rbol Dir Dato Dir

Dir

Dato

Dir

Dir

Dato

Dir

NOTA: La direccin de un nodo apunta al dato del siguiente nodo, lo mismo sucede en la forma inversa. Suponga que despus de las declaraciones, observamos que necesitaremos 12 valores de tipo int en lugar de 10. En tal caso podemos emplear la siguiente estrategia: int original[ ]=a; a=new int [12]; for(int i=0;i<10;i++) a[i]=original[i]; Implementar una clase de operaciones de vectores que muestre la utilizacin de meoria dinamica class OperVectores{ int arr[]; public OperVectores(); public OperVectores(int tam); public void LlenarAleatoria(); public void Mostrar(); public void pares(); public void May50(); public void asignar(int n); public void asignar (int t[]); } Vector Implementa un arreglo dinmico de objetos, es decir proporciona las capacidades de las estructuras de datos de tipo arreglo, que puede cambiar su propio tamao de forma dinmica. En cualquier momento, un objeto Vector contiene un nmero de elementos que es menor o igual que su capacidad. La capacidad es el espacio que se a reservado para los elementos de Vector. Si un objeto Vector requiere de una capacidad adicional, crece en base a un incremento de capacidad que usted le especifica, o en base a un incremento de capacidad predeterminado. Si usted no especifica un incremento de capacidad, el sistema duplicara el tamao de un objeto Vector cada vez que se requiera de una capacidad adicional. Los constructores de la clase Vector son los siguientes: a) Vector( ) b) Vector(int tamao) c) Vector(int tamao,int incr) a) Esta es la primera forma que crea un vector por defecto, que tiene un tamao inicial de 10. b) Esta es la segunda opcin que crea un vector que viene especificado por tamao. c) La tercera forma crea un vector de capacidad especificada en tamao e incremento incr. El incremento indica el nmero de elementos cuya memoria se asigna cada vez que el vector se aumenta de tamao. Los objetos Vector almacenan referencias a objetos Object. Por lo tanto, un prograna puede almacenar referencias a cualquier objeto en un objeto Vector. Para almacenar valores de tipos primitivos en objetos

Mtodo Final void

Descripcin addElement(Object El objeto especificado por elemento se aade al vector.

Vector, utilice las clases de tipo de envoltura (por ejemplo, Integer y Double) del paquete java.lang para crear objetos que contengan los valores de tipo primitivo. Mtodos definidos por Vector

elemento) Int capacity( ) Object clone( ) Bolean elemento) Void copyInto(Object matriz[ ]) Object elementAt(int indice) Enumeration elements( ) Void ensureCapacity(int tamano) Object firstElement( ) Int indexOf(Object elemento) Los elementos contenidos en el vector invocante se copian en la matriz especificada por matriz. Devuelve el elemento en la posicin indicada por ndice. Devuelve una enumeracin de los elementos del vector. Establece la mnima capacidad del vector en tamao. Devuelve el primer elemento del vector Devuelve el ndice de la primera aparicin de elemento. Si el objeto no est en el vector, se devuelve 1. Int indexOf(Object elemento, int Devuelve el ndice de la primera aparicin de elemento en o despus de inicio. Si el vector no est en inicio) Void esa parte del vector, se devuelve 1. insertElementAt(Object Aade elemento al vector en la posicin indicada por ndice. Devuelve la capacidad del vector Devuelve un duplicado del vector invocante. contains(Object Devuelve true si elemento est contenido en el vector, y devuelve false si no.

elemento,int indice) Bolean isEmpty( ) Object lastElement( ) Int lastIndexOf(Object elemento) Devuelve true si el vector esta vaci y false si contiene uno o ms elementos. Devuelve el ltimo elemento del vector. Devuelve el ndice de la ltima aparicin de elemento, si el elemento no est en el vector, se devuelve 1. Int lastIndexOf(Object Devuelve el ndice de la ltima aparicin antes de inicio. Si el objeto no est en esa parte del vector, se devuelve 1. Vaca el vector. Tras ejecutarse este mtodo, el tamao del vector es 0.

elemento,int inicio) Void removeAllElements( ) Bolean

removeElement(Object Quita elemento del vector. Si existe en el vector ms de una instancia del objeto especificado, entonces se quita la primera. Devuelve true si se hizo con xito y false si el objeto no se encontr. removeElementAt(int Quita el elemento en la posicin indicada por ndice.

elemento) void indice) Void

setElementAt(Object Se asigna elemento a la posicin indicada por ndice.

elemento,int indice) Void setSize(int tamano) Establece el nmero de elementos en el vector en tamao. Si el nuevo nmero es menor que el viejo, se pierden elementos. Si el nuevo tamao es mayor que el viejo, se aaden elementos null. Int size( ) String toString( ) Void trimToSize( ) Devuelve el nmero de elementos actualmente en el vector. Devuelve la cadena equivalente del vector. Establece la capacidad del vector para que sea igual al nmero de elementos que contiene actualmente.

Você também pode gostar