Estructura de Datos Orientada a Objetos

Page 1

~1~


~2~


MEMORIAS: ESTRUCTURA DE DATOS ORIENTADAS A OBJETO

Estudiante. Oscar Ayala Fernández III semestre Ing. de Sistemas Universidad de San Buenaventura.

Estudiante. Deisy Ribón Barrios III semestre Ing. de Sistemas Universidad de San Buenaventura.

Estudiante. Javier Villareal Torres III semestre Ing. de Sistemas Universidad de San Buenaventura.

CARTAGENA – COLOMBIA

~3~


TABLA DE CONTENIDO Unidad I 1. Manejo de Vectores y Matrices (Arrays) 1.1. Definición de vector. 1.2. Declaración de un vector. 1.3. Funciones como arreglos. (vector) 1.4. Ejemplos programa con vectores. 1.5. Definición de matriz 1.6. Declaración de una matriz 1.7. Ejemplo programa con Matrices 1.8. Ejemplo métodos con Vectores y matrices Unidad II 2. Pilas y Colas 2.1 Concepto de Pila. 2.2 implementación de clase pilas. 2.3 Ejercicios programas con pilas. 2.4 Concepto de Cola 2.5 Implementación de la clase cola. 2.7 Ejemplo de implementación de clase colas. 2.8 Cola de prioridades. 2.9 Ejemplo de implementación de clase colas de prioridades.

Unidad III 3

Listas Enlazadas 3.1 Definición las Listas enlazadas. 3.2. Implementación de listas enlazadas. 3.3. Definición de Listas enlazadas circulares. 3.4. Implementación de las listas circulares. 3.5. Ejemplo de listas enlazadas circulares. 3.6. Definición Listas doblemente enlazadas.

Unidad IV 4. Recursividad 4.1 Definición de Recursividad. 4.2 implementación de recursividad. 4.3 Ejemplo de recursividad.

~4~


Unidad V 5.

Ordenamiento 5.1. Algoritmos de Ordenamientos 5.2. Algoritmo de ordenamiento Burbuja. 5.2.1. Ejemplo de Algoritmo de Burbuja. 5.3. Algoritmo de ordenamiento de Selección 5.3.1. Ejemplo de Algoritmo de selección. 5.4. Algoritmo de ordenamiento por Inserción. 5.4.1. Ejemplo de Algoritmo Inserción. 5.5. Otros métodos de ordenamiento. 5.6. Comparacion de algoritmos.

Unidad VI 6.

Arboles 6.1. Concepto de Aboles. 6.2. Concepto Arboles Binarios. 6.2.1 Ejemplo de Arboles Binarios. 6.3 Como se representa un árbol binario. 6.4 Recorrido de un árbol binario. 6.4.1 Ejemplo de Recorrido de un árbol binario: 6.5 Árboles Binarios de Búsqueda. 6.6. Borrar un nodo de un árbol.

Unidad VII 7

Grafos 7.2 Concepto de Grafos. 7.3 Tipos de grafos. 7.4 Representación de Grafo. 7.3.1 Matriz de adyacencia. 7.3.2 Matriz de caminos. 7.5 Algoritmo del camino mínimo.

~5~


I MANEJO DE VECTORES Y MATRICES (ARRAYS).

Objetivos de aprendizaje:



Usar los vectores como estructuras orientadas objetos para almacenar datos en programas sencillos.

~6~


1.1 DEFINICION DE VECTOR: 

Estructura de datos que permite almacenar un conjunto de datos. Son similares a las variables y un ejemplo de ellos es el tipo de dato String. Sus datos son homogéneos (son del mismo tipo de datos). Son finitos es decir tienen un tamaño determinado. Tienen un orden. Tipo de arreglo unidimensionales

    

1.2 DECLARACION DE UN VECTOR: Tipo nombre [ ]; Nombre = new tipo [tamaño]; Ejemplo: Int edades [ ]; Edades = new int [100]; 1.3 FUNCIONES COMO ARREGLOS (vector):

Tipo [ ] nombre de función (argumento) Ejemplo: Int [ ] pares (int valores [ ], int tamaño) { Int par [ ] = new int [tamaño]; int c=0; For (int i=0; i< tamaño; i++) { If (valores [i] % 2 ==0) { Par [c]= valores [i]; C++;

~7~


} }

Return par;

} 1.4 EJEMPLO PROGRAMA CON VECTORES: 1. Diseñar un programa orientado a objeto que permita sumar los números pares de un arreglo. Class Sumapares { Prívate int valores [ ]; SumaPares (int [ ] val) { For (int i=0; i > val.length; i++) { Valores [i] = val [i]; } } Public long suma () { long s=0; int i; For (i=0; i< val.length; i++) { If (valores [i] % 2 == 0) s+=valores [i]; } return s; }

2. Hacer un programa que lea un numero entero y cuente los dígitos que tiene dicho numero. Private long numero; Public int contardigitos () { Int valores [ ] = new int E [20]; Int c=0, r, cont =0, sw; Long num =1; Num= numero;

~8~


While (num! =0) { r= num % 10; num = num/10; sw=0; for (int i=0; i<c; i++) { If (valores [i] = r) { Sw=1; Break; } } If (sw==0) { valores [c] = r; C++; } } return c; }

~9~


1.5 DEFINICION DE MATRIZ:    

Tipo de arreglo multidimensional. Es un contenedor para almacenar datos relacionados. Sirve para almacenar un conjunto de elementos. Nos permite almacenar y registrar conjunto de datos, todos del mismo tipo.  Cada elemento de la matriz podrá ser accedido directamente por el nombre de la matriz seguido de uno o más subíndices enteros, en función de la dimensión de la matriz, encerrados entre corchetes (m[0][0], m[1][1]...).  El número máximo de dimensiones o de elementos depende de la memoria disponible (límites establecidos por el compilador).  El número de elementos de la matriz viene dado por el producto de (nº filas, nº columnas).

DECLARACION DE UNA MATRIZ: Tipo nombre arreglo [ ] [ ] = new tipo [nº filas] [nº columnas]; Ejemplo: Int edades [ ] [ ]; Edades = new int [100][10];

1.7 EJEMPLO PROGRAMA CON MATRICES: Class mayores { Private int [ ] [ ] matriz; Int m, n; Mayores (int m, int n) { Matriz = new int [m] [n]; This.m = m; This.n= n;

~ 10 ~


This.matriz =matriz; } Void llenarMatriz (int [ ] [ ] matriz) { This.matriz = matriz; } Int [ ] vector ( ) { Int v [ ] = new v [m]; For (int i =0; i < m; i ++) V [i] = matriz [i] [0]; For (int j=0; J<n; j++) { If (v [i] <matriz [i][j]) v[i]= matriz [i] [j]; } } return v; } 1.8 EJEMPLO METODOS CON VECTORE Y MATRICES: 1. Hacer un programa que permita calcular el promedio de un grupo de estudiantes que cursaron varias asignaturas. Class clase { Pr铆vate double notas [ ] [ ]; Private long c贸digo [ ]; Private double promedio [ ]; Public void promedio (int asig, int estu) { Int i, j; For (i=0; i< estu; i++) {

Promedio [i] =0;

~ 11 ~


For (j=0; j< asig; i++) { Promedio [i] =promedio [i] + notas [i] [j]; } Promedio [i] = promedio [i] /asig; } } Clase (int asigna, int estu) { Notas=new double [estu] [asig]; Codigo= new long [estu]; Promedio= new double [estu]; } Public void leerdatos (double n [ ] [ ], long [ ]) { Notas = n; Codigo = c; } Public String mostrar (int estudiantes, int asigna) { String s= “”; For (i=0; i< estudiante; i++) { s=s+“\n”+codigo [i] + “:”; For (j=0; j <asigna; i++) { s= s+ “”+ notas [i] [j]; }

~ 12 ~


s= s+ “promedio� +prom [i]; } return s; }

~ 13 ~


II PILAS Y COLAS

Objetivos de aprendizaje  Conocer y entender el concepto de pilas y colas como estructuras para almacenamiento de la información.  Implementar pilas y colas en Java.

~ 14 ~


1.1.

CONCEPTO DE PILAS:   

1.2.

Tipo de estructura de datos. El ultimo en entrar es el primero en salir (lifo) (ueps). Variables (Tope: tamaño máximo pilas) (c: contador de elementos).

EJEMPLO DE IMPLEMENTACION DE LA CLASE PILAS: Class pila { Private int lista [ ]; Private int C=0; tope; { Private Pila (int n) { Tope=n; Lista= new int [n]; } Public int ingresar (int Val) { If (c==tope) return -1

~ 15 ~


Else { Lista [C] = Val; C++; } return 1; } Public int extraer ( ) { If (C==0) return -1; Else { C--; Lista [C] =0; } return 1; } Public string verpilas ( ) { { String S= “”; For (int i=0; i<C; i++) { S+= “\n”+lista [i]; } return S;

~ 16 ~


2.3 EJERCICIOS PROGRAMAS CON PILAS: 1. Hacer una pila que cada vez que ingrese un dato ocupe la posici贸n (0) de la pila y al salir sea el primero que lo haga. Class pila { Private int lista [ ]; Private int C=0; tope; Public pila (int n) { Tope=n; Lista = new int [n]; } Public int ingresar (int Val) { If (C==tope) return -1; Else { For (int i=C; i>0; i--) Lista [i] = lista [i-1]; Lista [0] =Val; C++; } return 1; } Public int extraer ( ) { If (C==0) return -1; Else { C--;

~ 17 ~


For (i=0; i<C; i++) Lista [i] = lista [i+1]; Lista [C] =0; } return 1; } Public verultimo ( ) { return lista [0]; } Public int verprimero ( ) { Return lista [C-1]; } } 2. Un parqueadero tiene 3 secciones cada sección tiene capacidad para guardar tres vehículos uno de tras de otro, hacer un programa que permita ingresar los vehículos al parqueadero, para ingresar un vehículo este deberá ingresar en la sección que tenga menos vehículos, extraer, para extraer un vehículo se preguntara por el numero de la sección donde se quiere extraer, al igual que para mostrar los vehículos. Class parqueadero { Private string secc1 [ ], secc2 [ ], secc3 [ ]; Private int c1=0, c2=0, c3=0, tope; Public parqueadero ( ) { Secc1= new string [tope]; Secc2= new string [tope]; Secc3= new string [tope]; }

~ 18 ~


Public int ingresar (string placa) { If (c1== tope && c2==tope && c3== tope) return -1; Else { If (c1<=c2 && c1<=c3) { Secc1 [c1] - placa; c1++; } Else { If (c2<=c3) { Secc2 [c2] = placa; c2++; } Else { Secc3 [c3] = placa; c3++; } } } return 1; } Public int sacar (int secc) { Int sw=0; If (secc==1 && c1==0) sw=1; If (secc==2 && c2==0) sw=1; If (secc==3 && c3==0) sw=1;

~ 19 ~


If (sw==0) { If (secc==1) { c1--; secc1 [c1] = null; } If (secc==2) { c2--; secc2 [c2] = null; } If (secc==3) { c3--; secc3 [c3] = null; } return 1; } else return -1; } Public string mostrar (int secc) { String s= “”; int i; Switch (secc) { Case 1: for (i=0; i< c1; i++) s=s+ “\n” + secc1 [i]; Break; Case 2: for (i=0; i< c2; i++) s=s+ “\n” + secc2 [i]; Break; Case 3: for (i=0; i< c3; i++) s=s+ “\n” + secc3 [i]; Break;

~ 20 ~


} return s; } }

3. Hacer un programa que maneje 2 pilas con nĂşmeros enteros positivos donde cada vez que se valla a agregar un nĂşmero elemento si dicho elemento es par se agregue en la pila 1 e impar en la pila 2, para extraer un elemento deberĂĄ salir el de la pila llena y, si estĂĄn iguales sale el de la pila 1. Private int pila 1[ ], c1=0; Private int pila 2[ ], c2=0; Public void agregar (int elemento) { If (elemento%2==0) { If (c1==tope) return -1; Else { Pila 1[c1] = elemento; C1++; } } Else { If (c2==tope) return -1; Else { Pila 2[c2] = elemento; C2++; } } }

~ 21 ~


Public void extraer ( ) { If (C1==C2) { If (C1==0) return 1; Else { C1--; Pila 1 [c1] =0; } } Else { If (c1>c2) { C1--; Pila 1 [c1] =0; } } Else { If (c1>c2) { C1--; Pila 1 [c1] =0; } Else { C2--; Pila 2 [c2] =0; } } }

~ 22 ~


2.4 CONCEPTO DE COLAS:  Tipo de estructura de datos.  El primer elemento que entra es el primero en salir (FIFO) (PEPS)

2.5 IMPLEMENTACION DE LA CLASE COLAS: Class cola { Private int elemento [ ]; Private int c=0, tope; Public cola (int n) { Tope=n; Elemento= new int [n]; } Public int ingresar (int elem) { If (tope == c) return 0; Else { Elemento [c] = elem; C++; } Return 1; } Public int extraer ( ) { If (c==0) return 0;

~ 23 ~


Else { c--; For (int i=0; i<C-1; i++) Elemento [i]= elemento [i+1]; Elemento[c]=0; } return 1; } Public string mostrar ( ) { String s= “”; For (int i=0; i<c; i++) { S=s+ “\n”+ elemento [i]; } Return s; } }

2.6 EJEMPLO DE IMPLEMENTACIÓN DE CLASE COLAS: 1. Hacer un método que cada elemento que entre se ubique en la posición 0 y los demás se corran una posición y el elemento a extraer es el que está en la última posición del arreglo. Class cola { Prívate int elemento [ ]; Prívate int c=0, tope; Public cola (int n) { Tope= n; Elemento= new int [n]; } Public int Ingresar (int elem) { If (tope==c) Return 0; Else { For (i=c; i >0; i--) Elemento [i] = element [i-1]; Elemento [0] = elem;

~ 24 ~


C++; } Public int extraer ( ) { If (c==0) Return 0; Else { C--; Elemento [c] =0; } Return 1; } Public mostrar ( ) { String S= “”; For (int i=0; i< c; i++) { S=S+ “\n”+ element [i]; } Return S; } } 2. Una institución universitaria tiene 5 carreras para, realizar la matricula los estudiantes deben ingresar a la cola que corresponde a su carrera cada estudiante se identifica con un código donde los cuatro primeros dígitos corresponde al año en que ingresó, los dos siguientes a la carrera y los dos últimos un consecutivo, deberán hacer los métodos que permitan ingresar al estudiante a su cola respectiva, extraer un estudiante de la cola y mostrar los estudiantes de una cola especifica.

Class carreras { Prívate doublé cola 1[ ], cola 2[ ]; Prívate doublé cola 3[ ], cola 4[ ], cola 5[ ]; Prívate int c=0, tope; Public cola (int n) { Tope= n; Cola 1= new double [n]; Cola 2= new double [n]; Cola 3= new double [n]; Cola 4= new double [n];

~ 25 ~


Cola 5= new double [n]; } Public int ingresar (double codigo) { Int car= int ((codigo%10000)/100); Switch (car) { Case 1: if (c1==tope) Sw=1; Else { Cola 1[c1] = codigo; C1++; } Break; Case 2: if (c2==tope) Sw=1; Else { Cola 2[c2]= código; C2++; } Break; } if (sw==0) return 1 else return 0; } } 2.8 COLA DE PRIORIDADES: Una cola de prioridad es una cola a cuyos elementos se les ha asignado

una prioridad, de forma que el orden en que los elementos son procesados y sigue las siguientes reglas:  El elemento con mayor prioridad es procesado primero.  Dos elementos con la misma prioridad son procesados según el orden en que fueron introducidos en la cola. 2.9 EJEMPLO DE IMPLEMENTACIÓN DE CLASE COLAS DE PRIORIDADES: 1. Hacer un método que simule una cola de números enteros con prioridades; es decir que el primero que entra es el primero que sale pero hay que tener en cuenta que los pares tienen mayor prioridad sobre los impares que los pares; si hay un número impar que entro primero que un numero par se tendrá en cuenta si es par o no.

~ 26 ~


Class cola_prioridades { Prívate int lista [ ]; Prívate int c=0; tope; Public cola_prioridades (int t) { Tope= t; Lista= new int [t]; } Public void agregar (int elem) { If (c==tope)…. “Cola llena”; Else lista [c++] =elem; } Public void extraer ( ) { Int li=0; If (c=0)….. “Cola vacia”; Else { For (int i=0; i<c; i++) { If (lista[i] % 2==0) { Li=I; Break; } } For (i=li; i<c-1; i++) { Lista [i] = lista [i+1]; C--;

~ 27 ~


Lista [c] = 0; } } } 2. Una E.P.S. maneja tres tipos de afiliados los de nivel 1 que cancelan por cada cita médica u odontológica 3 mil pesos los de nivel, 2 cancelan 8 mil pesos y los de nivel 3 que cancelan 17 mil pesos; hacer un método que maneje el ingreso, la salida y muestre los usuarios que están haciendo cola; para hacer cita se debe tener en cuenta que primero serán atendidos los de nivel 3, luego los de nivel dos y por último los de nivel 1, cada usuario se identifica con el código donde el ultimo digito corresponde al nivel correspondiente al nivel donde se encuentra dicho usuario Código de 5 dígitos. Class eps { Prívate long cola [ ]; Private int c=0; tope; Public eps (int n) { Tope= n; Cola= new long [n]; } Public Boolean ingresar (long cod) { If (c==tope) Return False Else { Cola [c] = cod; C++; } Return True;

~ 28 ~


} Public Boolean extraer ( ) { Int pos= 0, sw= 0; If (c==0) Return false; Else { For (int i=0; i<c; i++) { If (cod%10==3) { Pos= I; Sw=1; Break; } } If (sw==0) { For (int i=0; i<c; i++) { If (codรง%10==2) { Pos=i; Sw=1; Break; } } } For (i== pos; i<c-1; i++) { Cola [i] = cola [i+1] ;}

~ 29 ~


C--; Cola[c] = 0; } Return true; } Public string mostrar ( ) { String S= “”; For (int i=0; i<c; i++) { S=S+ “\n”+ cola [i]; } Return S; } }

~ 30 ~


III LISTAS ENLAZADAS Objetivos de aprendizaje  Conocer las listas como estructuras para almacenamiento de la información.

 Implementar listas enlazadas en Java.

~ 31 ~


3.1 DEFINICIÓN LAS LISTAS ENLAZADAS: En una lista enlazada se asigna memoria para el almacenar los elementos de la lista conforme se va necesitando, es decir a medida que se añaden o insertan los elementos, y se conectan los elementos de la lista con punteros. La memoria es liberada cuando ya no se necesita más un elemento en la lista. Esquemáticamente una lista enlazada se representa por una secuencia de nodos conectados por enlaces.

Cada nodo está conectado al siguiente por un solo enlace, a esta estructura de datos se llama lista simplemente enlazada.

Un nodo de una lista simplemente enlazada contiene dos campos: datos (contiene un elemento de la lista) y siguiente (almacena un enlace al siguiente nodo de la lista).

El campo siguiente del último nodo contiene un símbolo especial que indica el final de las lista.

Se accede a la lista por medio de un apuntador al primer elemento y solo se puede recorrer la lista en un sentido, del primer nodo al último nodo.

3.2 IMPLEMENTACIÓN DE LISTAS ENLAZADAS: Class listasenl{ Prívate elemento p=null; Prívate class elemento { Private Int dato; Private elemento siguiente; Elemento ( ) { }; }

~ 32 ~


Public int listaenl ( ) { } Public void principio (int d) { Elemento q new elemento ( ); q.dato= d; q.siguiente= p; p=q; } Public int tama単o ( ) { Int c=0; Elemento x=p; While(x! = null) { C++; X=X.siguiente; } Return ( ); } Public elemento buscar (int d) { Int sw=0; Elemento x=p; While (x! = null) { If (x.datos ==d) { Sw=1; Break; } X=X.siguiente }

~ 33 ~


If (sw==1) return x; else return p; } Public void insertardespues(int d1, int d2) { Elemento q= new elemento ( ); Elemento r= new elemento ( ); R= buscar (d2); q.dato= r.dato; q.siguiente=r.siguiente; r.dato= d1; r.siguiente=q; } Public void modificar (int d1, int d2) { Elemento x=p; While (x.dato!=null) {If (x.dato==d1) { x.dato= d2; Break;

}

x=x.siguiente; } }

Public void eliminar (int d) { Element q=new elemento (); Elemto r= new element (); R= rebuscar (d); r.dato=q. dato; r.siguiente=q.siguiente;

~ 34 ~


q=null; } Public String mostrar () { String s= “”; Element x=p; While (x.dato!=null) { S=s+ “”+x.dato; } Return s; } EJEMPLOS DE LISTAS ENLAZADAS: 1. Hacer un método que nos permita determinar cuántas personas en una empresa gana más que el promedio, deberá leer por cada trabajador el código, el nombre, la edad, el salario y deberá imprimir. A) Nombre de empleados que ganan más que el promedio. B) El código del trabajador es de 6 donde el 3er y 4to dígitos corresponde al cargo que ocupa dicho trabajador deberá imprimir la suma de los salarios de la persona que tenga la mayor y la menor edad. Class Empresa {

Private elemento p=null; Private class elemento { Private long codigo; Private String nombre; Private int edad; Private double salario; Private elemento siguiente; Elemento () { }; }

~ 35 ~


Public Empresa () { } Public void agregar (long cod, String nom, in ted, double sal) { Elemento q. new elemento ( ); q.codigo= cod; q.nombre= nom; q.edad= ed; q.salario= sal; q.siguiente= P; p=q; } Public double promedio () { Double prom=0; Int c= 0; Elemento q=p; While (q!=null) { C++; Prom= prom+q. salario; Q=q.siguiente; } Return prom/c; } Public string nombres () { String S= “�; Elemento q=p; While (q!=null) {

~ 36 ~


If (q.salario> promedio ()) { S.S+ “\n”+q. nombre; } q= q.siguiente; } Return S; } Public doublé mas ( ) { Int e=0; Doublé m; Elemento q=p; While (q!=null) { If (q.edad>e) { m=q.salario; e=q.edad; q=q.siguiente; } Return m; } }

Public doublé [ ] cargos ( ) { Int cod; Doublé c [ ]= new doublé [10]; Elemento q=p;

~ 37 ~


While (q!=null) { Cod = (int) ((q.codigo/10000) %100) C[cod-1]= c[cod-1] + q.salario q=q.siguiente } Return c; } 3.3. DEFINICIÓN DE LISTAS ENLAZADAS CIRCULARES:

 En una lista enlazada circular el último elemento de la lista apunta al primer elemento de la misma.

3.4. IMPLEMENTACIÓN DE LISTAS ENLAZADAS CIRCULARES:

Public class circular { Prívate elemento ultimo= null; Prívate class Elemento { Prívate int dato; Prívate elemento siguiente; Elemento ( ) {}; Elemento (int d, elemento s) {

~ 38 ~


dato= d; siguiente= s; } } Public circular ( ) { } Public void principio (int d) { Elemento q= new elemento (d, null) If (ultimo!=null) { q.siguinte= Ultimo.siguiente; Ultimo.siguiente= q; Ultimo= q; } Else { Ultimo= q; Ultimo.siguiente= q; } } Public void fin (int d) { Elemento q= new elemento (d, null) If (ultimo!=null) { q.siguiente= ultimo.siguiente; Ultimo= ultimo.siguiente; } Else {

~ 39 ~


Ultimo= q; Ultimo.siguiente= q; } } Public int tama単o () { If (ultimo== null) return 0; Elemento q= ultimo.siguiente; Int n=1; While (q!=ultimo) { n++; q=q.siguiente; } Return ; } Public int borrar () { If (ultimo=null) return 0; Elemento q= ultimo.siguiente; Int dat= q.dato; If (q==ultimo) Ultimo= null; Else Ultimo.siguiente= q.siguiete; Return dat; } }

~ 40 ~


3.5. EJEMPLO DE LISTAS ENLAZADAS CIRCULARES:

1. Un programa maneja una lista circular que contiene los datos de los usuarios de telefonía celular de una empresa, los datos son: numero de teléfono, tipo de plan (1. Prepago, 2. Pos pago). Numero de minutos (o si es prepago), meses de mora (inicialmente igual a cero o cero si esta al día). Valor de plan prepago (pos pago, n. minutos) {<=100=200* min; >100 && <=500= 170* min; >500 && <=1000 = 130* min; >1000=80*min;} Hacer los métodos agregar usuario este método permitirá ingresar un usuario al final de la lista circular, mostrar esta opción mostrara un usuario de todos los usuarios que estén en mora o que no lo estén, los que no estén en mora deberá incluir los prepago, mora permitirá aumentar o disminuir una mora. Class celular { Prívate elemento ultimo= null; Prívate class elemento { Prívate long nc; Prívate int tp; Prívate doublé nm; Privat int mn; Prívate doublé vp; Prívate elemento siguiente; Elemento () { }; Elemento (long nc; int tp; doublé nm; int mm; doublé vp; elemento s) { This.nc=nc;

~ 41 ~


This.tp=tp; This.nm=nm; This.mm=mm; This.vp=vp; Siguiente=s; } } Public void agregar (int nc, int tp, doublĂŠ nm) { Int mn=0; If (tp==1) vp=0; Else { If (nm<=100) vp=200*nm; Else { If (nm<=500) vp=170*nm; Else { If (nm<=1000) vp=130*nm; Else vp=80*nm; } } } Elemento q= new elemento (nc, tp, nm, mm, vp, null) If (ultimo!=null)

~ 42 ~


{ q.siguiente=ultimo.siguiente; Ultimo.siguiente= q; } Else { Ultimo= q; Ultimo.siguiente= q; } } Public string mostrar (int t) { String s= “”; If (ultimo==null) s=”\n lista vacía” Else { Elemento q= ultimo.siguiente; If (t==1) { If (q. mora>=1) { s=s+ “\n”+q.nc; } } While (q!= ultimo) { q=q.siguiente; if (t==1&& q.mm>=1) { s+= “\n”+q.nc; }

~ 43 ~


Else { If (q.mm==0) S+= “\n”+q.nc; } } } Return s; } Public int mora (int n, long nc) { Int c1=0; c2=0; q.mm++; if (q.mm!=0) q=mm--; }

3.6 LISTA DOBLEMENTE ENLAZADA: 

Cada nodo contiene tres campos: un campo que almacena el elemento de la lista y los otros dos almacenan los enlaces a los nodos precedente y siguiente de la lista.

Se usan punteros nulos para marcar ambos extremos de la lista.

~ 44 ~


IV RECURSIVIDAD

Objetivos de aprendizaje

Entender y aplicar la recursividad en la solución de problemas.

~ 45 ~


4.1 DEFINICIÓN DE RECUERSIVIDAD (RECURSION):    

Cuando un método se llama si mismo. Se utiliza para acortar los códigos. Remplaza el ciclo repetitivo. La recursividad es una alternativa a la repetición o iteración.

De manera más formal, una función recursiva es invocada para solucionar un problema y dicha función sabe cómo resolver los casos más sencillos.

4.2 IMPLEMENTACIÓN DE

RECURSIVIDAD:

1. Factorial (método no recursivo): Public long factorial (int n) { Long fact.=1; For (int i=1;i<=n; i++) { For= fact.*i; } } Return fact.; } Factorial (método recursivo): Public long factorial (int n) { If (n==0||n==1) return 1; Else { Return n* factorial (n-1) {“Metodo con otro parámetro”.

~ 46 ~


} 2.

Sumatoria (método no recursivo): Public long sumatoria (int n) { Long sum=0; } Return sum; }

Sumatoria (método recursivo): Public long sumatoria (int n) { If (n=0) Return 0; Else Return n+ sumatoria (n-1) }

4.3 EJEMPLO DE RECURSIVIDAD: 1. Crear un método que muestre el n- sino termino dela serie fibonacci. (Método no recursivo): Public long fibonacci (int n) { Long sig=1, prim=1, ulti=1; If(n==1||n==2) return 1; Else {

~ 47 ~


For (int i=3; i<=n; i++) Prim=ult; Ult= sig; Sig=prim + ult; } Return sig; } } (Método recursivo): Public int fib (int n) { If (n<2) return n; Else { Return fib (n-1) + fib (n-2); } } 2 Hacer un método recursivo de multiplicación: (Método no recursivo): Public long producto (int x; int y) { Long s=0; For (int i; i<x; i++) { S+ = y; } Return s; } (Método recursivo):

~ 48 ~


Public long producto (int x; int y) { If (y==0) return 0; Else { Return y + producto (x, y-1); } }

3. Hacer un método recursivo que permita determinar si un número es primo o no lo es. (Método no recursivo): Public string primo (int n) { If (n<=2) return “Es primo”; For (int i=2; i<n; i++) { If (n % i==0) { Return “no es primo”; } } Return “es primo”; } (Método recursivo): Public string primo (int i; int n) { If (n<=2) return “\n” es primo”; Else { If (n% i==0) return “\n no es primo”; Else { If (n==i++) return “\n es primo”;

~ 49 ~


Else return primo (i+, n); } } } 4. Hacer un método recursivo de división (x/y => x debe ser mayor que y). (Método recursivo): Private int c=0; Public long divi (int x, int y) { For (int i=0; i<x; i++) { If (x<=0) break; Else { x=x-y; c++; } } Return c; }

(Otra forma de método no recursivo): Public long división (int x, int y) { While (x>0) { C++; x=x-y; }

~ 50 ~


Return c; } (M茅todo recursivo): Public long divisi贸n (int x, int y) { If (x<=0) return c; Else { C++; Return divisi贸n (x-y, y); } } 5. Hacer un programa que imprima el n-simo n煤mero primo. Public int n- simo (int num) { Int c=0; For (i=1; i<=n; i++) { Sw=0; For (int j=2; j<i; j++) { If (i % j==0) { Sw=1; Break; } } If (sw==0) {c++;} If (c== numero) break; } Return i;

~ 51 ~


} 6. Hacer un MĂŠtodo recursivo que permita realizar una sumatoria. (MĂŠtodo no recursivo): Public long sumatoria (int n) { Long sum=0; For (int i=1; i>=0; i--) { sum= sum+i; } Return sum; } (MĂŠtodo recursivo): Public long sumatoria (int n) { If (n==0) Return 0; Else Return n + sumatoria (n-1)}

~ 52 ~


V ORDENAMIENTO Objetivos de aprendizaje 

Conocer y aplicar los algoritmos de ordenamiento y búsqueda en los procesos de almacenamiento de la información.

~ 53 ~


5.1

ALGORITMOS DE ORDENAMIENTOS:

Consiste en agrupar un conjunto de elementos en orden específico. Existen muchos métodos para ordenar entre esos están burbuja, selección, inserción, etc.

5.1.

ALGORITMO DE ORDENAMIENTO BURBUJA: 45 9 12 5 25 32 7 0 1 2 3 4 5 6 Busca el número menor comparando cada número con todos; es decir cada subíndice es comparado con los restantes: Cada inserción se va disminuyendo.

5.1.1

EJEMPLO DE ALGORITMO DE ORDENAMIENTO BURBUJA: 1.

Class burbuja { Private int arreglo [ ]; Public burbuja (int a [ ]) { Arreglo= A; } Public void ordena () { Int i, j; For (i=0; i<arreglo.length; i++) { For (J=i+1; j<arreglo.length; j++) If (arreglo [i]> arreglo [i]) { { temp=arreglo [i]; arreglo [i]= arreglo[j]; arreglo [j]= temp; } } } } }

~ 54 ~

{


2. Hacer un algoritmo que lea las edades de n personas y las imprima en descendente. Class ordenar_edades { Private int edad [ ]; Public ordenar (int v [ ]) { Edad= new int [v]. length]; Edad=v; } Public void organizar ( ) { Int t; For (int i=0; i<edad.legth; i++) { For (int j=i+1; j<edad.legth; j++) { If (edad [i]>edad[j]) { t= edad [i], edad [i]= edad [j]; edad [j]=t; } } } } Public int [ ] mostrar ( ) { Return edad; } }

3.

Para manejar o controlar el numero de películas de una video tienda. Deberán hacer un programa que maneje las siguientes opciones. 1) Agregar películas, para agregar una película se deberá leer el código de la película, el nombre de la película y las existencias, los 2 primeros dígitos del código corresponden al tiempo de la película. Los siguientes 4 el año y los 3 últimos un consecutivo. 2) Ordenar de menor a mayor; Permite organizar las películas por código y por ultimo, mostrar las películas de un genero en especial. Class película { Private doublé cod [ ]; Prívate string nom [ ]; Prívate int exis [ ]; Private int c=0; Public película (int co [ ], string n [ ], int ex [ ]) { Cod = new int [pel]; This.nom= nom;

~ 55 ~


This.cod= cod; This.exis=ex; } Public void agregar (string nm, doublé cd, int ex) { Nom [c]= nm; Cod [c] = cd; Vol [c]=ve; c++; } Public void ordenar ( ) { int i, j; String t1; doublé t2; int t3; For (i=0; i< cod.length -1; i++) { For (j=i+1; j<cod.length; i++) { If (cod [i]> cod[i]) { t1= nom [i]; nom[i]= t1; t2=cod [i]; cod[i]= cod[j]; cod[j]=t2; t3= vol [i]; vol[j]= t3; } } } } Public string mostrar (int gen) { Int genero, string s; For (i=0; i<c; i++) { genero= (int) (cod [i]/10000000) If (genero== gen) s+=”\n + cod [i] + “”+nom [i] + “”+ vol [i];

~ 56 ~


} Return s; }

5.2 ALGORITMO DE ORDENAMIENTO DE SELECCIÓN:

Consiste en lo siguiente:

Busca el elemento más pequeño de la lista.

Lo intercambia con el elemento ubicado en la primera posición de la lista.

Busca el segundo elemento más pequeño de la lista.

Lo intercambia con el elemento que ocupa la segunda posición en la lista.

Repite este proceso hasta que haya ordenado toda la lista.

Ejemplo de selección: Lista a ordenar:

4-3-5-2-1

Intercambiamos con el 4 y la lista queda así: 1-3-5-2-4 Lo intercambiamos con el elemento en la segunda posición, es decir el 3. La lista queda así: 1-2-5-3-4 Intercambiamos con el 5: 1-2-3-5-4 Intercambiamos con el 5: 1-2-3-4-5

~ 57 ~


5.3.1 EJEMPLO DE ALGORITMO DE SELECCIĂ“N:

import javax.swing.*; public class ordenamientosconinsercionmejorado { private long arreglo[]; ordenamientosconinsercionmejorado() {} ordenamientosconinsercionmejorado(int n, long arr[]) { //arreglo=new long[n]; arreglo=arr; } public long [] arreglo () { return arreglo; } public String verarreglo() { String S=""; for (int i=0; i<arreglo.length;i++) { S+="\n"+arreglo[i]; } return S; } public void cambiararreglo(long arr[] ) { arreglo=arr; } public void burbuja () { long t; String s=""; int c=0; for (int i=0;i<arreglo.length-1;i++) { for(int j=i+1;j<arreglo.length;j++) { if(arreglo[i]>arreglo[j]) { t=arreglo[i]; arreglo[i]=arreglo[j];

~ 58 ~


arreglo[j]=t; } c++; if (c>30) s=" ";else s+="\n"; for (int k=0;k<arreglo.length;k++) s+=arreglo[k]+" "; } s+="\n"; } JOptionPane.showMessageDialog(null,"Ordenamiento:"+s+"\nNo. Comparaciones: "+c); } public void seleccion () { int imen,c=0; long men; String s=""; for (int i=0;i<arreglo.length;i++) { men=arreglo[i]; imen=i; for(int j=i+1;j<arreglo.length;j++) { if(arreglo[j]<men) { men=arreglo[j]; imen=j; } c++; } if (c>300) s=" ";else s+="\n"; for (int k=0;k<arreglo.length;k++) s+=arreglo[k]+" "; arreglo[imen]=arreglo[i]; arreglo[i]=men; } JOptionPane.showMessageDialog(null,"Ordenamiento:"+s+"\nNo. Comparaciones: "+c); } public void insercion () { String s=""; long aux; int c=0, l; for (int i=0; i<arreglo.length; i++) { aux = arreglo[i]; int j; l=0; for (j=i-1; j>=0; j--)

~ 59 ~


{ c++; if (arreglo[j]>aux) { l++; arreglo[j+1] = arreglo[j]; } else break; } arreglo[i-l]=aux; if (c>300) s=" ";else s+="\n"; for (int k=0;k<arreglo.length;k++) s+=arreglo[k]+" "; } JOptionPane.showMessageDialog(null,"Ordenamiento:"+s+"\nNo. Comparaciones: "+c); }

public void leer() { int n; n=Integer.parseInt(JOptionPane.showInputDialog("Numero de elementos... ")); long arr[]=new long[n]; for (int i=0; i<n;i++) { arr[i]=Long.parseLong(JOptionPane.showInputDialog("Elemento["+ i+"]...")); } cambiararreglo(arr); } public static void main( String [] Agr) { int n,op; n=Integer.parseInt(JOptionPane.showInputDialog("Numero de elementos... ")); long arr[]=new long[n]; for (int i=0; i<n;i++) { arr[i]=Long.parseLong(JOptionPane.showInputDialog("Elemento["+ i+"]...")); } ordenamientosconinsercionmejorado o= new ordenamientosconinsercionmejorado(n,arr); for (int i=0; i<n;i++) {

~ 60 ~


JOptionPane.showMessageDialog(null,"arreglo["+i+"]= "+o.arreglo()[i]); } do{ op=Integer.parseInt(JOptionPane.showInputDialog("\nMETODO DE ORDENAMIENTO\n1. BURBUJA\n2. SELECCION\n3. INSERCION\n9. CAMBIAR VALORES\n10. SALIR")); switch(op) { case 1: o.burbuja(); break; case 2: o.seleccion(); break; case 3: o.insercion();break; case 9: o.leer(); break; } }while (op!=10); JOptionPane.showMessageDialog(null,"Arreglo Ordenado:"+o.verarreglo()); } }

5.4. ALGORITMO DE ORDENAMIENTO POR INSERCIÓN:   

   

Se toma el elemento y se ubica en la posición que debería estar. Consideremos que en un momento dado, el segmento izquierdo del arreglo está ordenado y el segmento derecho no. Podemos tomar un elemento del segmento derecho e insertarlo en su lugar correcto en el lado izquierdo.

Se considera la lista partida en dos sublistas, una ordenada y la otra para ordenar En el primer paso, la lista ordenada contiene un elemento y la lista por ordenar, TAM-1, Se van extrayendo uno a uno los elementos de la lista desordenada y se colocan en la sublista ordenada, mediante comparaciones sucesivas, hasta encontrar la posición correcta, El proceso continúa hasta que la lista desordenada queda vacía.

Ejemplo de inserción: 8 12 4 9 3 8 12 4 9 3 4

8 12 9 3

4

8 9 12 3

3

4 8 9 12

~ 61 ~


5.5 OTROS METODOS DE 

ORDENAMIENTO:

El método flota:

/* Dado un arreglo y un índice i, colocar en la posición i el elemento más grande que exista entre a[0] y a[i] flota: arreglo, índice->void */ void flota(int a[], int i) { ... } Ejemplo del método flotación:

Quick Sort:

-

Inventado por C. A. R. Hoare

-

Se ordenan los subarreglos.

Se escoge un elemento del arreglo como pivote Se particiona el arreglo en dos subarreglos: uno contiene aquellos elementos menores que el pivote, el otro contiene los mayores

Se obtiene el arreglo ordenado uniendo de nuevo los subconjuntos ordenados y el pivote.

~ 62 ~


5.6. COMPARACION DE ALGORITMOS:

~ 63 ~


VI ARBOLES Objetivos de aprendizaje  Conocer y entender el concepto de árbol como una estructura para almacenamiento de la información.  Implementar un árbol en Java.

~ 64 ~


6.1 CONCEPTO DE ABOLES:

Es una estructura de datos no lineal formada por un conjunto de nodos y un conjunto de ramas, en un árbol existe un nodo especial llamado “Raíz” el nodo donde sale una rama se llama “nodo bifurcación” o “nodo rama” y el nodo que no tiene ramas recibe el nombre de “Nodo terminal” nodo Hoja o “Hoja”.

Un árbol es una colección de elementos entre los cuales existe una estructura jerárquica definida mediante una relación de paternidad entre los elementos.

De un nodo formal se dice que un árbol es un conjunto finito de uno o más nodos tales que: A) Existes un nodo especial llamado “raíz del árbol”. B) Los nodos restantes están agrupados n>0 (en n mayor a 0) conjuntos disyuntos “A1, A2, A3………An”, cada uno de los cuales es a su vez es un árbol que recibe el nombre de subárbol de la raíz. C) El numero de ramas de un nodo se llama “Grado de un nodo” el máximo número de niveles de un árbol se llama “Profundidad o Altura del árbol”. los arboles donde cada nodo tiene los sumos u grado 2 se llama “arboles binarios”.

~ 65 ~


6.2 CONCEPTO ARBOLES BINARIOS:

Conjunto finito de nodos que consta que un nodo raíz que tiene 2 subárboles binario denominado “subárbol izquierdo y árbol derecho”. Las expresiones algebraicas debido a que los operadores que en ella intervienen son binarios, nos dan un ejemplo de estructura de árbol binario.

6.2.1 EJEMPLO DE ARBOLES BINARIOS: 1. (a+b*c) / (d-e/f):

~ 66 ~


2. A+b*c-d+f/g:

3 a+b-c*+f-g: * +

+

A

-

B

d

C

-

f

g

4. a +b+c-d/f+--g / *

+

+ a

b

- f c

g

d

El árbol binario es útil cuando el tamaño de la estructura no se conoce, se necesita acceder a sus elementos ordenadamente, la velocidad de búsqueda es importante o el orden en el que se insertan los elementos es caso aleatorio.

~ 67 ~


6.3

COMO SE REPRESENTA UN ÁRBOL BINARIO: Public class arbolbinario { Private nodo raíz= null; Private class nodo { Private object datos; Private nodo izquierdo; Prívate nodo derecho; Prívate nodo ( ) { } } // Métodos }

6.4

RECORRIDO DE UN ÁRBOL BINARIO:

R= Raíz; I= subárbol izquierdo; D= subárbol derecho;   

Pre orden R.I.D. In orden I.R.D. Pos orden I.D.R. R

I

6.4.1

D

EJEMPLO DE RECORRIDO DE UN ÁRBOL BINARIO: * + a

-

d

b c a Pre orden: * + a- bc-d/ac. In Orden: a+b –c*d-a/a. Pos orden abc-+dac/-*.

/ c

~ 68 ~


x*y+(d-c/a)/b%e: / + * X

% /

y -

b

e

a

C a Pre orden: /+*xy/-dca%be. In orden x*y+d-c/a/b%e. Pos orden xy*dc-a+be%. El recorrido pre orden produce una noticia prefija el in orden una notación convencional y el pos orden una notación post fija o inversa.

6.5

ÁBOLES BINARIOS DE BÚSQUEDA: Es un árbol ordenado donde las ramas de cada nodo están ordenadas de acuerdo con las siguientes reglas. 1. Para todo nodo A[i] todas las claves del subárbol izquierdo son menores de las claves de A[i]. 2. Todas las claves de subárbol derecho de A[i] son mayores que todas las claves de A[i].

6.6

BORRAR UN NODO DE UN ÁRBOL: Resulta fácil i el nodo que se quiere borrar es un nodo terminal (hoja) o un nodo con un solo descendiente. La dificultad se presenta cuando vamos a borrar un nodo con 2 descendientes, en ese caso es lugar en el árbol del nodo a borrar, será remplazado por su sucesor presentándose dos casos, si tomamos como sucesor la raíz del subárbol izquierdo, su subárbol derecho lo será ahora del árbol mas a la derecha en el subárbol izquierdo. Si tomamos en el subárbol izquierdo la raíz de del subárbol derecho, su sub árbol izquierdo lo será ahora del nodo mas a la izquierda del subárbol. 

Entonces plantearemos un ejemplo para que el tema sea claro:

~ 69 ~


 Si queremos borrar el 17, si tomáramos como sucesor la raíz de sub árbol izquierdo 17, su sub árbol derecho 21 lo será ahora del nodo + ala derecha en el sub árbol izquierdo.

 Si tomáramos como sucesor la raíz de sub árbol derecho 21, su sub árbol izquierdo 13 lo será ahora del nodo + ala izquierda en el sub árbol 21.

~ 70 ~


~ 71 ~


VII GRAFOS Objetivos de aprendizaje 

Conocer y entender el concepto de grafo como una estructura para almacenamiento de la información.  Implementar un grafo en Java.

~ 72 ~


7.1

CONCEPTO DE GRAFOS: Es una estructura no lineal que consiste de dos elementos: 1. Un conjunto (V) de elementos llamados vértices, nodos o puntos. 2. Un conjunto E de Aristas o Arcos tal que cada arista de (E) es un par “u,v” denotado como e= [u,v] donde u y v son vértices, los grafos se pueden identificar como g=(V,E). V

E

U 

Un grafo es un T.D.A. que representa un conjunto finito N de nodos, llamados vértices, relacionados entre sí por un conjunto R de arcos.

Grafo con 5 vértices y 6 arcos. 

Vértices del Grafo N = {A, B, C, D, E}

Arcos del Grafo

R= {(A, A), (A, B), (A, D), (A, C), (D, C), (C, E)}

Si el conjunto N es vacío, el grafo será vacío.

Cada arco de un grafo establece una única relación entre dos nodos.

No existe restricción en la relación que establece un arco, o sea, un nodo puede estar relacionado consigo mismo o con otro nodo.

~ 73 ~


 Cada arco se representa a través de un par, donde cada elemento determina uno de los nodos.  En e= [u,v] u y v se denominan extremos de e de u y de v dicen que son vecinos (verticales o adyacentes)  Grado de un nodo u: es un numero de arista que tiene nodo u  Si el grado de u es =0 el nodo no pertenece a ninguna lista recibe el nombre de (nodo aislado).  Camino: secuencia de vértices tal que dos vértices consecutivos sean adyacentes (unidos por un arco). 7.2

TIPOS DE GRAFOS: Un grafo es orientado o dirigido si el hecho de que el arco (Nj, Nk) pertenezca a R no implica que el arco (Nk, Nj) pertenece también a R, para todo j y k.    

El sentido de las flechas en los arcos es importante. Es importante la dirección del arco, o sea, el nodo origen del arco y el nodo destino. El hecho que exista un arco de Nj a Nk no implica que exista de Nk a Nj. Se conocen como dígrafos.

Grafos conexos: Si entre 2 nodos existe un camino

V= {A, B, C, D, E} E= {(A, B) (A, C) (A, E) (B, C) (C, D) (C, E) (D, E)}

~ 74 ~


Grafos con peso: Donde cada arista tiene un valor C1= (B, C, D) w (c1)=10 C2= (B, A, E, D) w (c2) =9 Clasificación de los Grafos:  Grafo Orientado o Dirigido: Donde cada arista tiene una dirección asignada.

Estos grafos tienen 2 grados Grad_ent (0)= 1. Grad_ sal (D)= 2. Cuando un vértice llegan aristas pero no sale ningunas se llama sumidero. Sumidero= c; Cuando de un vértice salen aristas pero no llegan ninguna se llama fuente. Fuente=0;

7.3

REPRESENTACIÓN DE GRAFO:    

La representación matricial permite establecer si hay relación entre cada vértice del grafo y los demás. Para ello, se utiliza una matriz cuadrada. Se utiliza un arreglo bidimensional. Esto significa que la representación matricial es una representación secuencial.

~ 75 ~


A partir de un grafo, siempre es posible definir un orden arbitrario de los nodos.

7.3.1

MATRIZ DE ADYACENCIA:

Representa para cada nodo cuáles son sus vértices adyacentes.    

Cada fila y cada columna de la matriz se corresponde con un vértice en particular. Los elementos de la matriz son booleanos Si el elemento (i, j) es verdadero, existe un arco que va del vértice i al vértice j y, si el elemento (i, j) es falso, no existe arco del vértice i al vértice j. Si el grafo es no orientado, si existe el arco del vértice i al vértice j existe el arco del vértice j al vértice i.

Supongamos que G es un grafo dirigido simple de m nodos y supongamos que los n nodos de v v1, v2, v3…Vm han sido ordenados y llamados Para representar este grafo se puede utilizar una matriz de adyacencia A= (aij) que contiene m.n elementos.

Aij=

-

1 si Vi es adyacente Vj, hay arista entre Vi y Vj. 0 caso contrario.

~ 76 ~


También se conoce como matriz de bits o matriz booleana. M=4 para: V1 v2 v3 v4 A B C D De: v1= A 0 0 0 1 v2= B 1 1 1 0 v3= C 0 0 0 0 v4= D 0 1 1 0 Grad.Entra 1 2 2 1. Grad.sal 1 3 0 2.

7.1 MATRIZ DE CAMINOS: Sea G un grado dirigido simple con m nodos identificados con v1, v2, v3, v4, vm, la matriz de camino o matriz de alcance G. Es la matriz m². P= (Pij). 1 si hay camino entre vi y Vj. Tal que Pij= 0 de lo contrario. Sea a la matriz de adyacencia y p la matriz de camino del grafo G. 1 si y solo si hay un numero positivo en la entrada ij de la matriz Bm A²+A²+A³+….Am donde A es la matriz adyacencia. Pij= 0 En caso contrario.

M4=

A=

v1 v2 v3 v4

V1 v2 v3 v4 0 0 0 1 1 0 1 1 1 0 0 1 0 0 1 0

~ 77 ~


0010 1012 A²= 0 0 1 1 1001

0011 A4= 2 0 2 3 1012 1011

1001 1022 A³= 1 0 1 1 0011

Bm=

1023 5068 3035 2032

1011 P= 1 0 1 1 1011 1011

7.1 ALGORITMO DEL CAMINO MÍNIMO (ALGORITMO DE DIJKTRA): Sea G un grafo dirigido con m nodos v1, v2, v3, vm. Supongamos que G tiene pesos en sus caminos. W (e) si hay aristas entre vi y vj wij 0 de lo contrario. Wij= matriz de peso La matriz de caminos P nos dice si hay o no camino entre los nodos. Ahora se quiere encontrar la matriz q= (qij) que nos indica, las longitudes de caminos mínimos entre 2 nodos, para eso debemos hallar: Qk [i,j]= min (Qk-1[i,j], Qk-1[i,j] + Qk-1 [k,j] Imagen:

1100 A= 1 0 0 1 0100 1 0 10

W=

7500 7002 0300 4010

~ 78 ~


Para hallar Q0 se remplaza los ceros por infinito y luego se halla Qk para k de 1–4 7 5 oo oo Q0= 7 oo oo 2 oo 3 oo oo 4 oo 1 oo Q1 [1, 1]= min (Qo [1,1] Qo [1, 1]+ Qo [1,1])=7

7 14 Q1 [1, 2]= min (Qo [1,2] Qo [1, 1] + Qo [1,2])=5

5

7

5

Q1 [3, 2]= min (Qo [3,2] Qo [1, 1] + Qo [1,2])=3

3

oo

+

5 R

Q1=

7 5 oo oo

S 7 12 oo 2 T oo 3 oo oo U 4 9 1 oo

~ 79 ~


~ 80 ~


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.