Vous êtes sur la page 1sur 19

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 operaciones definidas 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 implementacincomo 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 necesita 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

Descripcin

void and(BitSet conjBits)

Hace un AND entre los contenidos del


objeto
BitSet
invocante
y
los
especificados por conjBits. El resultado
se coloca en el objeto invocante.

void andNot(BitSet conjBits)

Por cada bit 1 en conjBits, se borra el


correspondiente bit en el BitSet
invocante.

void clear(int indice)

Pone a cero el bit especificado por


ndice.

Object clone( )

Duplica el objeto BitSet invocante.

bolean equals(Object conjBits)

Devuelve true si el conjunto de bits


invocante es equivalente al pasado en
conjBits. De los contrario, el mtodo
devuelve false.

boolean get(int indice)

Devuelve el estado actual del bit en el


ndice especificado.

int hashCode( )

Devuelve el cdigo de dispersin del


objeto invocante.

int length( )

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.

void or(BitSet conjBits)

Hace un OR de los contenidos del


objeto BitSet invocante con los del
especificado por conjBits. El resultado
se coloca en el objeto invocante.

void set(int ndice)

Pone en 1 el bit especificado por


ndice.

int size( )

Devuelve el nmero de bits en el objeto


BitSet invocante.

String toString( )

Devuelve la cadena equivalente del


objeto BitSet invocante.

void xor(BitSet conjBits)

Hace un XOR de los contenidos del


objeto BitSet invocante con los del
especificado por conjBits. El resultado
se coloca en el objeto invocante.

Ejercicio 2.
Realizar un programa que permita encontrar los nmeros primos de 0 hasta n
aplicando el mtodo de la criba de Eratstenes; implementarlo haciendo uso de
la clase BitSet.

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

Tamao en Bytes de memoria

byte

char

short

int

float

long

double

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:

arregl
o

10

20

30

40

50

ndice

direcc
in

13
00

13
04

13
08

13
12

13
16

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

direcci
n

40

50

60

270

270

270

70

80

90

271
2

271
6

272
0

70

80

90

272
4

272
8

273
2

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

direcci
n

40

50

60

270
0

271
2

272
4

70

80

90

270

271

272

70

80

90

270
8

272
0

273
2

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

Dir

Dato

Nodo con una referencia

Dir

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

Dir

Dato

Dato

Dir

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 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

Mtodo

Final
addElement(Object
elemento)

Descripcin

void El objeto especificado por elemento se aade al


vector.

Int capacity( )

Devuelve la capacidad del vector

Object clone( )

Devuelve un duplicado del vector invocante.

Bolean
elemento)

contains(Object Devuelve true si elemento est contenido en el


vector, y devuelve false si no.

Void copyInto(Object matriz[ Los elementos contenidos en el vector invocante


])
se copian en la matriz especificada por matriz.

Object elementAt(int indice) Devuelve el elemento en la posicin indicada


por ndice.

Enumeration elements( )

Devuelve una enumeracin de los elementos del


vector.

Void
ensureCapacity(int Establece la mnima capacidad del vector en
tamano)
tamao.

Object firstElement( )

Int
elemento)

Devuelve el primer elemento del vector

indexOf(Object Devuelve el ndice de la primera aparicin de


elemento. Si el objeto no est en el vector, se
devuelve 1.

Int
indexOf(Object Devuelve el ndice de la primera aparicin de
elemento, int inicio)
elemento en o despus de inicio. Si el vector no
est en esa parte del vector, se devuelve 1.

Void insertElementAt(Object Aade elemento al vector en la posicin


elemento,int indice)
indicada por ndice.

Bolean isEmpty( )

Devuelve true si el vector esta vaci y false si


contiene uno o ms elementos.

Object lastElement( )

Devuelve el ltimo elemento del vector.

Int
lastIndexOf(Object Devuelve el ndice de la ltima aparicin de
elemento)
elemento, si el elemento no est en el vector, se
devuelve 1.

Int
lastIndexOf(Object Devuelve el ndice de la ltima aparicin antes
elemento,int inicio)
de inicio. Si el objeto no est en esa parte del
vector, se devuelve 1.

Void removeAllElements( )

Vaca el vector. Tras ejecutarse este mtodo, el


tamao del vector es 0.

Bolean
removeElement(Object
elemento)

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.

void removeElementAt(int Quita el elemento en la posicin indicada por


indice)
ndice.

Void setElementAt(Object Se asigna elemento a la posicin indicada por


elemento,int indice)
ndice.

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( )

Devuelve el nmero de elementos actualmente


en el vector.

String toString( )

Devuelve la cadena equivalente del vector.

Void trimToSize( )

Establece la capacidad del vector para que sea


igual al nmero de elementos que contiene
actualmente.

Vous aimerez peut-être aussi