Documentos de Académico
Documentos de Profesional
Documentos de Cultura
PROF.CARPIO.
ESTRUCTURA DE DATOS
1. INTRODUCCIN A LAS ESTRUCTURAS DE DATOS.
1.1 TIPOS DE DATOS ABSTRACTOS (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 lenguaje.
Cando los tipos de datos existentes en el lenguaje no son suficientes o no son eficientes para
ciertas aplicaciones, la mayora de los lenguajes de programacin permiten al usuario definir sus
propios tipos de datos.
Esta definicin consiste en establecer los elementos de que consta el tipo as como las
operaciones que se pueden realizar con instancias de este tipo.
Un TDA es el elemento bsico de la abstraccin de datos. Debe verse como una caja negra, pues
la representacin y la implementacin deben permanecer ocultas, de forma que para trabajar con
los elementos de un TDA el nico mecanismo permitido es el de usar las operaciones definidas
para dicho TDA.
DECLARACIN DE TDAS.
Para construir un tipo abstracto se debe:
1) Establecer la definicin del tipo.
2) Definir tambin las operaciones (clases) que pueden operar con dicho tipo
3) Ocultar la presentacin de los elementos del tipo de modo que slo se puede trabajar con ellos
usando los procedimientos definidos en 2)
4) Poder crear instancias mltiples del tipo.
1.2 MODULARIDAD.
Es la propiedad que permite subdividir una aplicacin en partes ms pequeas
llamadas mdulos, cada una de las cuales debe ser tan independiente como sea
posible de la aplicacin en s y de las restantes partes.
La Modularidad consiste en dividir un programa en mdulos que se puedan compilar
por separado, pero que tienen conexiones con otros mdulos. Al igual que la
encapsulacin, los lenguajes soportan la Modularidad de diversas formas.
La Modularidad es la propiedad de un sistema que permite su descomposicin en un
conjunto de mdulos cohesivos y dbilmente acoplados. Por supuesto no todos los
mdulos son iguales: tomar un programa monoltico y separarlo de forma aleatoria en
archivos no es ptimo. Se debe tener en cuenta los conceptos asociados de
dependencia, acoplamiento, cohesin, interfaz, encapsulacin y abstraccin.
Una vez identificado lo que es un buen mdulo, se puede contemplar la reutilizacin de
un buen mdulo como componente.
El Mdulo A depende del Mdulo B si cualquier cambio en el Mdulo B implica que el
Mdulo A tambin tenga que ser modificado. A veces se dice que el Mdulo A es un
cliente del Mdulo B, o que el Mdulo B acta como servidor del Mdulo A. En general,
es normal que un mismo mdulo sea tanto cliente como servidor. Esto significa, que
Una o ms variables que refieran el lugar donde se encuentran las variables dinmicas.
Un mtodo para obtener memoria (new)
2. RECURSIVIDAD.
2.1 DEFINICIN: ES CUANDO UN OBJETO ESTA FORMADO POR SI MISMO O SE DEFINE
EN FUNCIN DE S MISMO.
VENTAJAS:
B^0 =1
B^E, E>0: ELEVA=ELEVA(B,E-1)*B
Numero
10
11
Fibonacci
13
21
34
55
89
class Ejemplos {
public static void main(String[] args) {
System.out.println("Factorial de 4!="+Factorial(4)); Factorial de 4!= 24
System.out.println("2e3="+eleva(2,3)); 2e3=8
System.out.println("Fibonacci de 7="+Fib(7)); Fibonacci de 7=13
}
public static int Factorial(int n){
if(n==0) return 1;
else
return n*Factorial(n-1);
}
public static int eleva(int b, int e){
if(e==0) return 1;
else
return eleva(b,e-1)*b;
}
public static int Fib(int n){
if((n==1)|| (n==2)) return 1;
else
return Fib(n-2) + Fib(n-1);
}
}
4. ESTRUCTURAS LINEALES.
3.1 Listas.
Definicin: Son bloques de informacin organizado bajo un criterio de ordenamiento; es decir la
informacin en las listas esta ordenada.
Se puede insertar en cualquier parte de la lista, as como eliminar cualquier elemento.
La figura 3-A. Muestra una lista de compras; dicha lista contiene un primer elemento, un segundo
elemento y un ltimo. Frecuentemente borramos o aadimos elementos. En la figura 3-B muestra
la lista de compras despus de insertar 3 elementos al final de la misma y borrar otros dos de ella.
miel
aceite
sal
tomates
manzanas
naranjas
huevos
Figura 3-A
miel
aceite
tomates
manzanas
huevos
arroz
pepinos
peras
Figura 3-B
Nodo
siguient
e
Figura 3.C Lista enlazada (representacin grfica tpica).
e1
e2
e3
en
cabeza
dato
sig
dato sig
Inf
or
ma
3.1.3.1
ci Declaracin de un Nodo.
n
actual
dato
sig
cola
dato
sig
Una lista enlazada se compone de una serie de nodos enlazados mediante referencias. En Java se
declara una clase para contener las dos partes del nodo: dato y enlace. Por ejemplo, para una lista
enlazada de nmeros enteros, la clase Nodo es:
public class Nodo {
int dato;
Nodo enlace;
public Nodo(int t) {
dato=t;
enlace=null;
cola
cabeza
4.15
sig
5.25
sig
71.5
sig
10.5
sig
Cada referencia a un nodo debe ser declarada como una variable referencia. Por ejemplo, si se
mantiene una lista enlazada con una referencia de cabecera y otra cola, se deben declarar dos
variables referencias:
Nodo cabeza;
Nodo cola;
En la figura 3.F muestra una lista a la que accede con la referencia cabeza; cada nodo esa
enlazado con el siguiente nodo. El ltimo nodo, cola o final de la lista, no se enlaza con otro nodo,
por lo que su campo enlace contiene la referencia nulo, null. La palabra null representa la
referencia nulo, que es una constante especial de Java. Se puede utilizar null para cualquier valor
de referencia que no apunte a objeto alguno. La referencia null se utiliza, normalmente, en dos
situaciones:
En el campo enlace del ltimo nodo (final o cola) de una lista enlazada.
Como valor de referencia cabeza para una lista enlazada que no tiene nodos. Tal lista se denomina
lista vaca (cabeza=null).
La referencia null se puede asignar a una variable referencia con una sentencia de asignacin
ordinaria. Por ejemplo:
Nodo cabeza;
cabeza=null;
cabeza
4.15
5.25
71.5
10.5
null
Crear un nodo e inicializar el campo dato al nuevo elemento. La referencia del nodo
creado se asigna a nuevo variable local del mtodo.
Hacer el campo enlace del nuevo nodo apunte a la cabeza (primero) de la lista original.
Hacer que la cabeza apunte al nodo que se ha creado.
El ejemplo 3.1 Inserta un elemento por la cabeza de una lista siguiendo los pasos del algoritmo. A
continuacin, se escribe el cdigo Java, del mtodo InsertaPrimero.
Ejemplo 3.1
Una lista enlazada que contiene tres elementos, 10,25 y 40. Insertar un nuevo
elemento, 4, en cabeza de la lista.
cabeza
10
25
40
null
40
null
Paso 1
Cdigo Java
Nodo nuevo=new Nodo(N);
nuevo
4
cabeza
10
25
Paso 2
El campo enlace del nuevo nodo apunta al nodo cabeza actual de la lista.
Cdigo Java
nuevo.enlace=cabeza;
nuevo
4
cabeza
10
25
40
null
10
Paso 3
Se cambia la referencia de cabeza para que apunte al nodo creado; es decir; cabeza apunta al
mismo nodo al que apunta nuevo.
Cdigo Java
cabeza=nuevo;
nuevocabeza
4
10
40
25
null
cabeza
4
10
40
25
null
Caso particular.
El mtodo InsertaPrimero tambin acta correctamente si se trata de aadir un primer nodo o
elemento a una lista vaca. En este caso, cabeza apunta a null y termina apuntando al nuevo nodo
de la lista enlazada.
N=50
10
40
null
11
Nodo R=cabeza,M=null;
M cabezaR
10
null
40
Recorrer la listas
while(R!=null && R.dato<N){
M=R;
R=R.enlace;
}
R!=null && R.4<50 es verdadero (true)
cabezaM
4
R
10
40
null
cabeza
4
M
10
R
40
null
cabeza
4
M
10
40
null
if(R!=null) // es falso
if(R.dato!=N) R=null;
if(R==null){ // es verdadero
if(M==null) // es falso
InsertaPrimero(N);
else // se inserta al final de lista
InsertaUltimo(M,N);
public void InsertaUltimo(Nodo M, int N) {
Nodo nuevo=new Nodo(N);
nuevo.enlace=M.enlace;
}
nuevo
50
null
M.enlace=nuevo;
cabeza
4
M
10
40
nuevo
50
null
cabeza
4
10
40
50
null
13
cabeza
6
12
null
El algoritmo para la operacin insertar entre dos nodos es el mismo para insertar
un nodo al final de la lista. Se recorre los apuntadores auxiliares M y R, la lista
quedara de la siguiente forma.
cabeza
6
M
8
R
12
null
14
nuevo.enlace=M.enlace;
cabeza
6
R
12
null
nuevo
10
M.enlace=nuevo;
cabeza
6
R
12
null
nuevo
10
15
cabeza
8
12
10
null
La operacin de eliminar un nodo de una lista enlazada, se enlaza en nodo anterior con el nodo
siguiente al que se desea eliminar y liberar la memoria que ocupa. El algoritmo para eliminar un
nodo que contiene un dato sigue los siguientes pasos:
1. Buscar el nodo que contiene el dato.
2. Si se encuentra el nodo puede existir tres casos: eliminar el primer nodo, eliminar entre
nodos y eliminar el ltimo nodo.
Tambin considerar el caso de que no existe el nodo en la lista. A continuacin se muestran
ejemplos con los diferentes casos.
cabeza
6
10
12
null
10
12
null
Nodo R=cabeza,M=null;
cabeza
R
6
16
R
6
cabeza
8
12
10
null
cabeza
8
12
10
null
cabeza
8
M
10
R
12
null
if(M.enlace!=null) true
M.enlace=R.enlace;
17
cabeza
ESTRUCTURA DE DATOS. INSTITUTO TECNOLOGICO DE ZACATEPEC.
PROF.CARPIO.
8
10
null
cabeza
8
M
10
null
12
null
cabeza
6
10
12
null
Recorrer la lista:
while(R!=null && R.dato<N){
M=R;
R=R.enlace;
}
R!=null && R.10<10= true && false= false
Al recorrer la lista los apuntadores M y R quedan de la siguiente forma:
cabeza
6
10
12
null
18
if(M.enlace!=null) true
M.enlace=R.enlace;
El apuntador M.enlace a punta a null y de esta manera deja al apuntador R sin
referencia y el Recolector de Basura de Java lo elimina.
cabeza
6
M
8
12
10
null
cabeza
6
12
null
cabeza
8
12
null
Recorrer la lista:
while(R!=null && R.dato<N){
M=R;
R=R.enlace;
}
R!=null && R.12<48= false && false= false
19
cabeza
6
M
8
12
R
null
if(M.enlace!=null) false
M.enlace=R.enlace;
El apuntador M.enlace a punta a null, entonces no es diferente a null, la prueba es
falsa y de esta manera la lista no se modifica. Al terminar el mtodo remove las
variables M y R se eliminan.
3.1.4 Listas doblemente enlazadas.
Aunque la lista ligada simple es una estructura de datos muy til, sin embargo tiene algunas
desventajas. En los siguientes puntos presentaremos otros mtodos para organizar una lista y se
demostrara cmo se pueden utilizar para contrarrestar estas desventajas.
Aun cuando una lista circular encadena tiene ventajas sobre una lista simple, sta todava tiene
algunas deficiencias, uno no puede atravesar esta listan en direccin contraria.
En una lista doblemente ligada cada nodo tiene dos apuntadores, uno para el predecesor y el otro
para su sucesor. Las listas doblemente ligadas pueden ser circulares o simples. Ver figura 3.1.4.A.
Figura 3.1.4.A. REPRESENTACION GRAFICA DE UNA LISTA DOBLEMENTE ENLAZADA.
Podemos considerar los nodos en una lista doblemente enlazada conformada por tres campos: un
campo INFO que contiene la informacin almacenada en el nodo, y los campos izquierdo y
derecho que contienen los apuntadores hacia los nodos de ambos lados.
Los algoritmos de insertar y eliminar son diferentes a las listas anteriores ya que cada nodo tiene
dos apuntadores y en este tipo de lista el criterio de insertar y eliminar puede ser en cualquier parte
de la lista sin considerar que la lista quede ordenada.
20
Desde cualquier punto en esta lista es posible alcanzar o llegar a cualquier otro punto de ella. Si
empezamos en un sitio dado y recorremos toda la lista al final terminamos en el punto de la
partida. Es importante establecer un apuntador primero y ltimo de la lista. Tambin se establece
que el apuntador nulo representa una Lista Circular vaca:
Operaciones bsicas en lista circular:
Insert(elemento, lista);
Elimina(elemento,lista);
Estos algoritmos son diferentes a los de las listas ligadas simples, ya que se necesita insertar un
nodo que sigue al ltimo nodo de una lista circular, no es posible con los algoritmos anteriores. Una
alternativa es escribir algoritmos separados para estos casos como inserta_final y elimina_tlimo.
Estos algoritmos no se analizarn en este curso.
Consideremos un problema que puede ser resuelto en una forma distinta mediante listas circulares.
El problema se conoce con el nombre de Jos y consiste en un grupo de soldados rodeados por
una gran fuerza enemiga. No hay esperanza de victoria si no llegan refuerzos, y existe solamente
un solo caballo disponible para el escape. Los soldados se ponen de acuerdo en un pacto para
determinar cul de ellos debe de escapar y de solicitar ayuda.
21
3.1.6 Aplicaciones.
Editores grficos
Editores en lnea
Macro ensambladores
Hojas de clculo electrnicas
Dispersin abierta (hashing)
Clasificacin y bsqueda de datos
22
}
import java.util.Scanner;
public class ListaDin {
Scanner leer=new Scanner(System.in);
private Nodo cabeza;
public ListaDin(){
cabeza=null;
}
public void add(int N) {
Nodo R=cabeza,M=null;
char pausa;
while(R!=null && R.dato<N){
M=R;
R=R.enlace;
}
if(R!=null)
if(R.dato!=N) R=null;
if(R==null){
if(M==null) // se inserta al principio de la lista
InsertaPrimero(N);
else // se inserta al final de lista
InsertaUltimo(M,N);
}
else{
System.out.println("Ya existe el dato "+N);
pausa=leer.next().charAt(0);
}
}
public void remove(int N){
Nodo aux=cabeza;
char pausa;
if(aux!=null){
if(aux.dato==N)//se comprueba si es el primer nodo
cabeza=aux.enlace; // el primer nodo es el segundo
else{
while(aux.enlace!=null && aux.enlace.dato!=N)//Busca el elemento o encuentra el fin
de la lista
23
24
3.2 Pilas.
DEFINICION.
Una pila es una coleccin ordenada de elementos la cual tiene un extremo por donde se pueden
insertar nuevos elementos y por ese mismo extremo se pueden eliminar. Ese extremo de la pila es
llamado parte superior de la pila o Top de la pila.
Una pila es un contenedor de datos cuyo comportamiento est regido por el principio LIFO (Last
Input Firt Output).
Tope
B
25
X
El tope de la pila.
26
POP: Cuando se ejecuta la instruccin Pop en una pila se esta indicando que
queremos borrar el elemento que se encuentre en la cima de nuestra pila:
27
2.
[{(A+B)}]
28
29
30
3.3 Colas.
DEFINICION:
Una Cola es una coleccin ordenada de elementos a partir de la cual se pueden insertar elementos
por un extremo llamado la parte POSTERIOR de la Cola y por otro extremo, llamado el FRENTE
de la Cola, se pueden eliminar elementos.
La caracterstica ms importante de una Cola es que es una estructura tipo FIFO: Primero en
entrar primero en salir (First In First Out).
Una cola es simplemente un lugar para almacenar cosas, donde esas cosas se
insertan una detrs de otra y para extraer siempre se lo hace por adelante de la
cola donde se encuentra el primer elemento. Una cola funciona como una fila o
cola de personas, que esperan su turno para ser atendidas, la primera persona
atendida es siempre la primera de la fila y cuando llega una persona y queremos
incorporarla a cola o adicionarla debemos hacerlo por detrs de la ltima persona
en la cola.
31
Colas En Java
import java.util.Scanner;
public class ColaDin {
private Nodo start,U;
public void add(String cadena) {
Nodo aux;
if(start==null){ // si la cola esta vacia
aux=new Nodo(cadena);
start=aux;
U=start;
}
else{
aux=new Nodo(cadena);
32
33
Colas dobles:
Una bicola es una lista lineal en la que los elementos se pueden aadir o quitar por cualquier
extremo pero no por la mitad. El termino bicola hace referencia a que se puede ver como un cola bi
direccional.
Hay varias formas de representar una bicola en una computadora. A menos que se indique los
contrario, asumiremos que nuestras bicolas, se mantienen en un arreglo circular bicola con
punteros izquierdo y derechos, que apuntarn a los extremos de la bicola. Asumimos que los
elementos se encuentran entre el extremo izquierdo y el extremo derecho.
BICOLA DE ENTRADA RESTRINGIDA: Esta solo permite inserciones por uno de los dos extremos
de la cola, pero las eliminaciones pueden ser en cualquier extremo de la cola.
BICOLA DE SALIDA RESTRINGIDA: Esta solo permite eliminacin de elementos por uno de los
dos extremos, pero permite que se inserten por cualquiera de los dos.
Los algoritmos que insertan y eliminan elementos en bicolas son diferentes a los de las colas
circulares.
5. Estructuras no lineales.
4.1 Arboles.
4.1.1 Concepto de rbol.
Un rbol es una estructura no lineal que est compuesta de NODOS Y RAMAS. Por
ejemplo:
34
Arboles Binarios. Un rbol binario es aquel donde cada nodo del rbol tiene 3 campos:
1.
2.
3.
35
Un rbol binario de bsqueda es aquel que cada nodo cumple las siguientes caractersticas:
A. Es un rbol binario.
B. Los elementos de un rbol no se repiten.
C. Cada nodo del rbol cumple con las siguientes condiciones:
C.1 Todos los elementos de la izquierda son menores a la informacin que contiene ese
nodo.
C.2 Todos los elementos a la derecha son mayores a la informacin que contiene ese
nodo.
36
37
38
Caso 2 (Borrar un Nodo con un subrbol hijo): El nodo que contiene el valor 5
Este caso tampoco es muy complicado, nicamente tenemos que borrar el Nodo y el subrbol que
tena pasa a ocupar su lugar.
39
Caso 3 (Borrar un Nodo con dos subrboles hijos): Eliminar el nodo que contiene el valor 5
40
41
42
= + 2 3
1.
Visitar la raz
2.
3.
POSTORDEN 2 + 3
= 2 3 +
43
4.1.4 Aplicaciones.
44
Velocidad de procesamiento.
El compilador utilizado (calidad del cdigo generado).
Esta funcin se puede medir fsicamente (ejecutando el programa, reloj en mano), o
calcularse sobre el cdigo contando instrucciones a ejecutar y multiplicando por el tiempo
requerido por cada instruccin.
45
import java.io.*;
class tiempo{
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
public static void main(String args[]) throws IOException{
long milisegundosactuales,milisegundos;
int tiempo = 0;
milisegundosactuales = System.currentTimeMillis();
//Variable para obtener el tiempo al abrir el programa
boolean evento = false;
//Booleano para no tener que repetir cdigo y poder marcar eventos
relacionados con el tiempo
while(true){
evento = false;
// Mtodo para obtener el tiempo actual
milisegundos = System.currentTimeMillis();
if (milisegundosactuales == milisegundos){
milisegundosactuales = milisegundos + 1000; //1000 milisegundos = 1
segundo
tiempo++;
System.out.println(tiempo);
evento = true;
System.out.println(evento);
}
else
//Metodo para evitar que se detenga el
if((milisegundosactuales + 1000) < milisegundos) contador
milisegundosactuales = System.currentTimeMillis();
}//fin while(true)
}// fin main
46
48
En el caso de los ciclos anidados, se determinan cuntas iteraciones contiene cada ciclo. El total
es entonces el producto del nmero de iteraciones del ciclo interno y el nmero de iteraciones del
ciclo externo.
int n;
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++)
System.out.print("*");
System.out.println();
}
Lineal logartmica
Dependencia cuadrtica
Cuadrtica
f(n)=[nlog n]
2
f(n)= n (n + 1)
2
f(n)= n
49