Estructura de Datos Orientada A Objetos

También podría gustarte

Está en la página 1de 80

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

 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).

1.2. 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 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 ordenan los subarreglos.
- 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 - d -

B C f g
4. a +b+c-d/f+--g

* +

+ - f g

a b c 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.

I D

6.4.1 EJEMPLO DE RECORRIDO DE UN ÁRBOL BINARIO:

+ -

a - d /

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

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

+ %

* / b e

X y - 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).

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

V1 v2 v3 v4
v1 0 0 0 1
A= v2 1 0 1 1
v3 1 0 0 1
v4 0 0 1 0

~ 77 ~
0010 1001
1012 1022
A²= 0 0 1 1 A³= 1 0 1 1
1001 0011

0011 1023
A4= 2 0 2 3 Bm= 5068
1012 3035
1011 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

7500
W= 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 7 5 oo oo

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

~ 79 ~
~ 80 ~

También podría gustarte