Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
=
elemento un menos lo por tiene P si falso
elementos tiene no P si verdadero
() . pilavacia Pila
Cima
La operacin P.cima() devuelve el valor del elemento en la cima de la pila P. Para hacer
esta operacin escribiremos:
d=P.cima()
Al ejecutar esta sentencia en realidad se hacen dos operaciones, primero se hace
d=P.quitar(), luego un P.insertar(d), porque despus de la operacin cima, la pila P queda
sin cambios.
Supongamos ahora la expresin ((5+6)*4)/(17+9), una de las condiciones para que sea
una expresin aritmtica correcta en que tengas sus parntesis balanceados, as que
deseamos saber si el nmero de parntesis que abres es el mismo nmero de parntesis
que cierran.
Para resolver este problema usaremos el concepto de pila. La idea es simple. Vamos a
leer cada elemento de la expresin, si se trata de un parntesis que abre, entonces lo
insertaremos en una pila; si se trata de un parntesis que cierra, entonces sacamos un
elemento de la pila. Al terminar de leer la expresin revisaremos si la pila est vaca, en
cuyo caso habremos concluido que el nmero de parntesis que abre es el mismo que el
nmero de parntesis que cierra y la expresin tiene parntesis balanceados.
La representacin en Java las operaciones de una pila
Definir el tipo de dato de la pila
Se debe seleccionar que tipo de dato va a manejar la pila. Por ejemplo char.
Tamao de la pila
final static int MAX_ELEMENTOS = 100;
9 9 9 9 9 9 9
8 8 8 8 8 8 8
7 7 7 7 7 7 7
6 6 6 6 6 6 6
5 5 5 5 5 5 5
4 4 4 4 4 4 4
3 3 3 3 3 3 3
2 2 2 2 2 2 2
1 1 1 ( 1 1 1 1
0 0 ( 0 ( 0 ( 0 0 ( 0
-1 -1 -1 -1 -1 -1 -1
( (( ((5+6) ((5+6)*4) ((5+6)*4)/( ((5+6)*4)/(17+9)
Crear la pila
TipoPila Pila = new TipoPila();
Inicializar la pila
public void inicializapila() {
cima = -1;
}
Funcin insertar (push)
public void insertar(char d) {
if (!pilallena())
elemento[++cima]= d;
else
System.out.println(Pila llena);
}
Funcin quitar (pop)
public char quitar() {
if (!pilavacia())
return elemento[cima--];
else {
System.out.println(Pila llena);
return ' ';
}
}
Funcin pilavacia (stackempty)
public boolean pilavacia() {
if (cima == -1)
return true;
else
return false;
}
Funcin pilallena (stacktop)
public boolean pilallena() {
if (cima == (MAX_ELEMENTOS - 1))
return true;
else
return false;
}
1 // Clase TipoPila
2 public class TipoPila {
3
4 final static int MAX_ELEMENTOS = 100;
5 private int error;
6 private int cima;
7 private char elemento[];
8 private char dato;
9
10 public TipoPila() {
11 error = 0;
12 cima = -1;
13 elemento = new char [MAX_ELEMENTOS];
14 }
15
16 public void insertar(char d) {
17 if (!pilallena())
18 elemento[++cima]= d;
19 else
20 error = 1;
21 }
22
23 public char quitar() {
24 if (!pilavacia())
25 return elemento[cima--];
26 else {
27 error = 2;
28 return ' ';
29 }
30 }
31
32 public boolean pilavacia() {
33 if (cima == -1)
34 return true;
35 else
36 return false;
37 }
38
39 public boolean pilallena() {
40 if (cima == (MAX_ELEMENTOS - 1))
41 return true;
42 else
43 return false;
44 }
45
46 public int muestraError() {
47 return error;
48 }
49 }
01 // Programa Ejemplo_Pila.java
02 import javax.swing.JOptionPane;
03
04 public class Ejemplo_Pila {
05 public static void main( String args[] ) {
06
07 String Expresion;
08 int i;
09 TipoPila Pila = new TipoPila();
10
11 Expresion = JOptionPane.showInputDialog
12 ("Teclear la expresion a validar:");
13 i=0;
14 while ((i < Expresion.length()) && (Pila.muestraError() == 0)) {
15 switch (Expresion.charAt(i)) {
16 case '(' : Pila.insertar(Expresion.charAt(i));
17 break;
18 case ')' : Pila.quitar();
19 break;
20 }
21 i++;
22 }
23
24 if ((!Pila.pilavacia()) && (Pila.muestraError() == 0))
25 mensaje(3);
26 Else
27 mensaje(Pila.muestraError());
28
29 System.exit( 0 );
30 }
31
32 public static void mensaje(int error) {
33 String Msg = "";
34 switch (error) {
35 case 0: Msg = "Parntesis Equilibrados";
36 break;
37 case 1: Msg = "Pila llena";
38 break;
39 case 2: Msg = "Existen ms parntesis derechos que izquierdos";
40 break;
41 case 3: Msg = "Existen ms parntesis izquierdos que derechos";
42 break;
43 }
44 JOptionPane.showMessageDialog(null, Msg, "Resultado",
45 JOptionPane.PLAIN_MESSAGE );
46 }
47 }
Cambiemos un poco el problema anterior y supongamos que existen 3 tipos diferentes de
delimitadores de mbito, los cuales son parntesis ( y ), los corchetes [ y ] y las llaves { y
}. Con este cambio ahora se tiene que verificar que el mbito que cierra sea del mismo
tipo que el que abre. Por ejemplo evale:
]))) [ ( ( /( )]} [( * ]) [ ( { n l k j h c d c b a y x + + +
Producto de Aprendizaje 2.1:
- Elabore un programa en Java que evalu una expresin con los 3 diferentes
delimitadores de mbito.
Notacin infija, prefija y postfija
Considere la siguiente expresin A + B, en la cual se puede observar dos operandos A y
B, y un operador +.
B A+
Operando
Operador
Operando
A este tipo de representacin se le llama notacin infija (o entre) y existen otras dos
representaciones las cuales son:
AB + Notacin prefija (o polaca en honor del Polaco
Jan Lukasiewicz)
+ AB Notacin postfija (o sufija)
Los prefijos in, pre y post se refieren a la posicin relativa del operador respecto a los
operandos.
En la notacin infija el operador esta entre los operandos, mientras que en la notacin
prefija el operador precede a los operandos y finalmente la notacin postfija el operador
sucede a los operandos.
Ahora consideremos la expresin A+B*C, primero debemos saber cul es la prioridad de
los operadores (+ y *), de antemano sabemos que la multiplicacin (*) tiene la mayor
prioridad, por tal motivo quedaran las notaciones de la siguiente forma:
infija prefija Postfija
A+B*C +A*BC ABC*+
La nica regla que tiene que recordar durante la conversin es que primero se conviertan
las operaciones que tienen los operadores con mayor prioridad y despus considerarlo
como un operador simple.
prefija A+[*BC] +A*BC
postfija A+[BC*] ABC*+
Antes de realizar conversin a alguna notacin debemos establecer la prioridad de los
operadores, considere la siguiente tabla y prioridad:
1. ( ) Agrupacin
2. ^ Exponenciacin
3. *, / Multiplicacin y Divisin
4. +, - Suma y Resta
infija prefija postfija
A+B-C
(A+B)*(C-D)
A^B*C-D+E/F/(G+H)
((A+B)*C-(D-E))^(F+G)
A-B/(C*D^E)
Evaluacin de una expresin postfija
Algoritmo para evaluar una expresin postfija:
Tipo de datos de la pila: int
Funciones:
void insertar(int d);
int quitar();
boolean pilavacia();
boolean pilallena();
boolean esoperador(char caracter);
int realizaoperacion(int op1, int op2,char caracter);
En estas funciones solo existen dos que no han sido definidas:
boolean esoperador(char caracter) Regresa verdadero (true) si el
carcter es un operador (+, -, *, /, ^).
int realizaoperacion(int op1, int op2, char caracter) Realiza la operacin entre el
operador 1 (op1) y el operador 2
(op2) definida por el operando
(carcter).
Algoritmo:
TipoPila Pila = new TipoPila();
Capturar la expresin a evaluar
while (mientras no lleguemos al final de la cadena a evaluar){
smbolo = siguiente carcter
if (Character.isDigit(smbolo)) {
Juntar los caracteres de los nmeros en la variable dato
Pila.insertar(Integer.parseInt(dato));
}
else {
if (Pila.esoperador(smbolo)) {
op2 = Pila.quitar();
op1 = Pila.quitar();
valor = Pila.realizaoperacion(op1, op2, smbolo);
Pila.insertar(valor);
}
}
}
Desplegar el resultado Pila.quitar()
Suponga que se quiere evaluar la expresin: 6 2 3+-3 8 2/+*2^3+
Producto de Aprendizaje 2.2:
- Implemente el algoritmo de evaluacin de una expresin postfija.
Conversin de una expresin infija a postfija
Considere las expresiones siguientes:
C B A
C B A
* ) (
*
+
+
Sus respectivas notaciones postfijas:
*
*
C AB
ABC
+
+
Al examinar la primera expresin el operando A se puede insertar directamente en la
expresin postfija, pero el operador + no se puede insertar en su posicin adecuada al
examinar el operando B, el cual debe de ir directamente en la expresin postfija despus
del operando A. En este momento se puede recuperar el operador + pero no es correcto
porque el operador * tiene mayor precedencia que el operador +. En el caso de la
segunda expresin debido al parntesis indica que el operador + tiene mayor precedencia
que el operador *.
Dado que la prioridad desempea un papel importante, se debe disear una funcin
precedencia (op1, op2), donde op1 y op2 son caracteres que representan los operadores
y debe de regresar un valor booleano que diga si el operador op1 tiene mayor
precedencia que el operador op2.
Ejemplo:
precedencia(+,+) Verdadero, porque el operador + que est a la izquierda, tiene
mayor precedencia que el operador + que est a la derecha.
precedencia (+,*) Falso, porque el operador + no tiene mayor precedencia que el
operador *.
Algoritmo de conversin de una expresin infija a postfija (sin parntesis):
Tipo de datos de la pila: char
Funciones:
void insertar(char d);
char quitar();
boolean pilavacia();
boolean pilallena();
boolean esoperador();
char cima();
boolean precedencia(char op1, char op2);
El mtodo que falta de definir es:
char cima() Regresa el elemento que se encuentra en la cima de la pila (quitar(),
insertar(char elemento)).
Algoritmo:
TipoPila Pila = new TipoPila();
Capturar la expresin infija
while (mientras no lleguemos al final de la expresin infija){
smbolo = siguiente carcter
if (!Pila.esoperador(smbolo)
agregar el smbolo a la cadena postfija
else {
while (!Pila.pilavacia() &&
Pila.precedencia(Pila.cima(), smbolo)) {
elemento = Pila.quitar();
agregar el elemento a la cadena postfija
}
Pila.insertar(smbolo);
}
}
while (!Pila.pilavacia()) {
elemento = Pila.quitar();
agregar el elemento a la cadena postfija
}
Desplegar la cadena postfija
Suponga que se quiere evaluar la expresin: A+B*C^D^E
Ahora debemos modificar el algoritmo para que acepte parntesis, los cuales se deben
tomar como operadores. Cuando se lee un parntesis que abre, este debe insertarse a la
pila y al leer un parntesis que cierra se debe tratar como una subcadena, por tal motivo
se tiene que redisear la funcin precedencia, agregando las siguientes opciones:
precedencia(op1, () = falso
precedencia((, op1) = falso
precedencia(op1, )) = verdadero En este caso es verdadero porque es un
parntesis que cierra y se tomara como una
subcadena para determinar la prioridad de los
operadores.
precedencia((, )) = falso
precedencia((, () = falso
Algoritmo de conversin de una expresin infija a postfija (con parntesis):
Tipo de datos de la pila:char.
Funciones:
void insertar(char d);
char quitar();
boolean pilavacia();
boolean pilallena();
boollean esoperador(char caracter);
char cima();
boolean precedencia(char op1, char op2);
Algoritmo:
TipoPila Pila = new TipoPila();
Capturar la expresin infija
while (mientras no lleguemos al final de la expresin infija){
smbolo = siguiente carcter
if (!Pila.esoperador(smbolo))
agregar el smbolo a la cadena postfija
else {
while (!Pila.pilavacia() &&
Pila.precedencia(Pila.cima(), smbolo)) {
elemento = Pila.quitar();
agregar el elemento a la cadena postfija
}
if (smbolo != ')')
Pila.insertar(smbolo);
else
Pila.quitar();
}
}
while (!Pila.pilavacia()) {
elemento = Pila.quitar();
agregar el elemento a la cadena postfija
}
Desplegar la cadena postfija
Suponga que se quiere evaluar la expresin: ((A-(B+C))*D)^(E+F)
Producto de Aprendizaje 2.3:
- Implemente el algoritmo para convertir una expresin infija a postfija.
Clases para la implementacin de pilas.
La clase Stack (java.util.Stack) es una extensin de la clase Vector. La clase Stack
representa una pila de objetos bajo la filosofa LIFO. Esta clase cuenta con cinco
operaciones que permite al Vector ser utilizado como una pila. Entre estas operaciones se
encuentran push y pop, adems el mtodo peek que proporciona el objeto de la cima de
la pila, asi como loe mtodos empty y search.
Mtodos Descripcin
Stack() Crea un objeto Stack vaco
boolean empty()
Regresa true si el objeto Stak esta vaco y
false en caso contrario.
Objeto peek()
Regresa el objeto de la cima del Stack sin
eliminar el objeto de la pila.
Objeto pop()
Regresa el objeto de la cima del Stack
eliminando el objeto de la pila.
Objeto push(Objeto elem)
Inserta el objeto elem en la cima de la pila. Es
similar a: Vector.addElement(Objeto);
int search(Object o)
Regresa la posicin del objeto o dentro de
la pila o -1 si no lo encuentra.
Producto de Aprendizaje 2.4:
- Elabore un programa en Java que evalu una expresin con los 3 diferentes
delimitadores de mbito utilizando la clase Stack.
2.2. Colas estticas y dinmicas.
Las colas son una estructura de datos similar a las pilas. Recordemos que las pilas
funcionan en un depsito en donde se insertan y se retiran elementos por el mismo
extremo. En las colas sucede algo diferente, se insertan elementos por un extremo y se
retiran por el otro. Por esta razn las colas se rigen por la filosofa FIFO (first in, first out) o
PEPS (primero en entrar primero en salir).
Colas simples
En una cola hay dos extremos, uno es llamado frente y el otro se llama final y es el que se
encuentra en la parte trasera de la cola. En una cola, los elementos se retiran por la parte
del frente y se agregan por la parte final o trasera de la cola.
Las operaciones bsicas de una cola son insertar (agregar un elemento al final de la cola)
y borrar (eliminar el elemento que est al frente de la cola).
Frente
a) A B C
Final
Frente
b) A B C D
Final
Frente
c) B C D
Final
Frente
X insetar X
Final
Frente
X Y insertar Y
Final
Frente
X Y Z insertar Z
Final
Frente
Y Z borrar X
Final
Colas circulares.
Otra solucin consiste en considerar la cola en forma circular, en lugar en forma lineal.
Veamos el siguiente ejemplo e insertemos el elemento F.
Colas dobles.
Una variacin de las colas son la Bicolas o colas de doble entrada. Una Bicola es una cola
en donde se puede insertar o eliminar elementos por los dos extremos. Se puede decir
que una Bicola es una cola bidireccional.
Operaciones.
Antes de poder utilizar una cola debemos estipulas que tipo de datos almacenara (int,
float, char, etc).
Operaciones bsicas de colas simples
Las operaciones bsicas de una cola son:
- Tamao de la cola Nmero de elementos mximos que puede contener la
cola.
- Crear Cola Crear la cola.
- Insertar Agregar un elemento al final de la cola.
- Borrar Extraer el elemento del frente de la cola.
- Cola vaca Comprobar si la cola no tiene elementos.
- Cola llena Comprobar si la cola est llena.
Al utilizar arreglos como una cola existe la posibilidad de desbordamientos (underflow u
overflow). Si por el momento no tomamos en cuenta la posibilidad de desbordamiento las
operaciones quedaran de la siguiente forma:
Insertar
1. Verificar que la cola no est llena.
2. Incrementar en 1 el apuntador del final de la cola.
3. Almacenar el elemento en la nueva posicin final.
Frente
0 1 2 3 4
C D E
Final
Frente
0 1 2 3 4
F C D E insertar F
Final
Borrar
1. Verificar si la cola no este vaca.
2. Leer el elemento que se encuentra la frente de la cola.
3. Incrementar en 1 el frente de la cola.
Cola vaca
Al comenzar el final es igual a -1 y el frente es igual a 0. La cola est vaca siempre que el
final < frente y el nmero de elementos se calcula final frente + 1.
Cola llena
La cola est llena cuando el final es igual al mximo de elementos 1.
La representacin en Java de las operaciones de una cola
Definir el tipo de dato de la cola
Se debe seleccionar que tipo de dato va a manejar la Cola (char, int, double, etc.)
Tamao de la cola
final static int MAX_ELEMENTOS = 100;
Crear una cola
TipoCola Cola = new TipoCola();
Inicializar la cola
frente = 0;
final = -1;
Funcin insertar
public void insertar(char d){
if (!colallena())
elemento[++final]=d;
else
System.out.println("Cola llena");
}
Funcin borrar
public char borrar() {
if (!colavacia())
return elemento[frente++];
else {
System.out.println("Cola vacia");
return ;
}
}
Funcin colavacia
public boolean colavacia(){
if (final < frente)
return true;
esle
return false;
}
Funcin colallena
public boolean colallena(){
if (final == MAX_ELEMENTOS - 1)
return true;
else
return false;
}
Ahora consideremos la posibilidad de desborde, supongamos el siguiente ejemplo:
Si se desea insertar el elemento F, no es posible porque Final == MAX_ELEMENTOS 1,
es decir la cola est llena (aunque calculando el nmero de elementos en la cola final
frente + 1 es igual a 3 y comprobando que la cola no est llena).
Compactacin
Una solucin es modificar la operacin borrar de tal manera que cuando se elimine un
elemento los dems se recorran al principio del arreglo, a este proceso se le llama
compactacin. La funcin borrar quedara de la siguiente forma:
public char borrar(){
char d;
if (!colavacia()) {
d = elemento[0];
for(int i=0; i< final; i++)
elemento[i] = elemento[i+1];
Frente
0 1 2 3 4
C
Final
Frente
0 1 2 3 4
C D E
insertar D
insertar E
Final
final--;
return d;
}
else
System.out.println("Cola vaca);
}
Bajo esta tcnica ya no es necesario el frente de la cola, debido a que el primer elemento
siempre est en la posicin 0. Sin embargo, este mtodo es poco eficaz, porque cada vez
que se borra un elemento se tiene que compactar los elementos restantes. Para poder
solucionar este problema sera necesario realizar la compactacin si y solo si:
((final == (MAX_ELEMENTOS-1)) && ((final frente+1) != (MAX_ELEMENTOS)))
Operaciones bsicas de colas circulares
En las colas circulares es difcil determinar si la cola est llena o no. Para calcularla
debemos utilizar la teora de los residuos de tal modo que generemos posiciones entre 0 y
MAX_ELEMENTOS-1.
TOS MAX_ELEMEN % 1) (final final
TOS MAX_ELEMEN % 1) (frente frente
+ =
+ =
Las operaciones de una cola circular quedaran como sigue:
frente = 0;
final = MAX_ELEMENTOS 1;
Cola vaca
Para comprobar si una cola est vaca o est llena sacrificaremos un elemento de la cola,
de tal forma que la capacidad real de la cola ser MAX_ELEMENTOS 1 y la condicin
de cola vaca quedara:
frente == siguiente(final);
Donde la funcin siguiente regresa la posicin de que le sigue al final, si esta es igual al
frente se determina que la cola est vaca.
Frente
0 1 2 3 4
Final
Cola llena
La cola est llena cuando: frente == siguiente(siguiente(final))
Recordemos que se est sacrificando un elemento, entonces si el frente es igual a la
posicin de las dos siguientes posiciones se supone que la cola est llena.
Insertar
1. Verificar que la cola no est llena.
2. final = (final + 1) % MAX_ELEMENTOS
3. Almacenar el elemento en la nueva posicin final.
Frente
0 1 2 3 4
Final
Frente
0 1 2 3 4
Final
Frente
0 1 2 3 4
a b c d
Final
Frente
0 1 2 3 4
f c d e
Final
Frente
0 1 2 3 4
f g h e
Final
Borrar
1. Verificar si la cola no este vaca.
2. Leer el elemento que se encuentra la frente de la cola.
3. frente = (frente + 1) % MAX_ELEMENTOS
Siguiente
1. A la posicin que recibe como parmetro:
retrun (n + 1) % MAX_ELEMENTOS
La representacin en Java de las operaciones de una cola circular
Inicializar la cola
public void inicializarcola(){
frente = 0;
final = MAX_ELEMENTOS -1;
}
Funcin insertar
public void insertar(char d){
if (!colallena()) {
final = siguiente(final);
elemento[final] = d;
}
else
System.out.println("Cola llena");
}
Funcin borrar
public char borrar(){
char d;
if (!colavacia()) {
d= elemento[frente];
frente = siguiente(frente);
return d;
}
else {
System.out.println("Cola vaca");
return ;
}
}
Funcin colavacia
public boolean colavacia(){
if (frente == siguiente(final))
return true;
else
return false;
}
Funcin colallena
public boolean colallena(){
if (frente == siguiente(siguiente(final)))
return true;
else
return false;
}
Operaciones bsicas de las colas dobles o bicolas
Los extremos de la Bicola se pueden identificar como izquierdo y derecho
respectivamente. Las operaciones bsicas de una Bicola son:
- Crear Bicola Crear la Bicola.
- InsertarIzq Agregar un elemento en el extremo Izquierdo de la
Bicola.
- InsertarDer Agregar un elemento en el extremo Derecho de la
Bicola.
- BorrarIzq Extraer el elemento de la Izquierda de la Bicola.
- BorrarDer Extraer el elemento de la Deracha de la Bicola.
- Bicola vaca Regresa verdadero si la Bicola esta vacia.
- Bicola llena Regresa verdadero si la Bicola esta llena
Una Bicola con restriccin de entrada es aquella que solo permite inserciones por uno de
los extremos, pero que permite eliminar elementos por los dos extremos.
Una Bicola con restriccin de salida es aquella que solo permite inserciones por los dos
extremos, pero solo permite eliminar elementos por un extremo.
Producto de Aprendizaje 2.5:
Elabore un programa en Java que lea 7 nombres desde el teclado y los inserte en un
objeto TipoCola con organizacin circular (Con capacidad de 10 elementos) y
posteriormente saque 4 elementos, despus solicite otros 5 elementos y al final imprima
los datos de la cola.
Clases para la implementacin de colas.
La interfaz Queue (java.util.Queue) representa una cola de objetos bajo la filosofa FIFO.
Esta clase cuenta con los siguientes mtodos:
Mtodos Descripcin
boolena add (Object o)
Inserta el elemento o en la cola si
retornando true si hubo xito y false en
caso contrario.
Object element()
Recupera el elemento de la cabeza de la
cola pero no lo elimina.
Mtodos Descripcin
boolean offer(Object o)
Inserta el elemento o especificado en la
cola (true), en caso de que no sea posible
regresa false.
Object peek()
Recupera el elemento de la cabeza de la
cola pero no lo elimina, en caso de que la
cola est vaca devuelve null.
Object poll()
Recupera el elemento y lo remueve de la
cabeza de la cola o null si esta cola est
vaca.
Object remove() Recupera y remueve la cabeza de la cola.
Producto de Aprendizaje 2.6:
- Implemente el ejercicio 2.5 mediante le interfaz Queue.
Listas
Una lista es una coleccin o secuencia de elementos ordenados uno tras otro, en la que
cada elemento se conecta por medio de un apuntador.
A cada elemento de la lista se le llama nodo. Cada nodo est constituido por dos partes
las cuales son:
Representacin grafica
Debido a que el ltimo elemento de la lista no est sealando a ningn elemento existe
diferentes formas de representarlo grficamente:
1a. Parte
Informacin
2a. Parte
Apuntador que seala
al siguiente nodo
Nodo 1 Nodo 2 Nodo n /
Nod x / Nodo x Nodo x null
Listas enlazadas
Listas Simples.
Cada nodo contiene un nico enlace que conecta al siguiente nodo. La lista se recorre
solamente hacia adelante.
Apuntadores al inicio y al final de la lista
Para poder manipular una lista de una manera eficiente es utilizar apuntadores al inicio de
las lista y al final. Para poder lograr esto debemos utilizar un apuntador al frente o inicio
de la lista y al final o cola.
Listas Dobles.
Cada nodo contiene dos enlaces o apuntadores, el enlace izquierdo apunta al nodo
predecesor y el enlace derecho apunta al nodo sucesor.
Circulares.
El ltimo nodo de la lista apunta al primer elemento de la lista.
Cada nodo esta enlazado a su predecesor y sucesor y el ltimo apunta a primer elemento
y el primero apunta al ltimo.
Multilistas.
En las multilistas existen enlaces verticales y horizontales.
e
1
e
2
e
3
e
n
/
inicio
e
1
e
2
e
3
e
n
/
fin
e
3
e
n
/ / e
1
e
2
e
2
e
3
e
1
e
n
inicio
e
10
/ /
e
6
/ e
8
/ / e
7
/
e
4
/ /
e
3
/ /
e
2
e
9
/
e
5
e
1
Clases para la implementacin de listas.
Clase nodoSimple
class nodoSimple {
private String dato;
private nodoSimple enlace;
nodoSimple( String d ) {
this( d, null );
}
nodoSimple( String d, nodoSimple e ) {
dato = new String(d);
enlace = e;
}
String obtenDato() {
return dato;
}
nodoSimple obtenEnlace() {
return enlace;
}
void cambiaDato(String d) {
dato = new String(d);
}
void cambiaEnlace(nodoSimple e) {
enlace = e;
}
}
Operaciones en listas
Las operaciones bsicas sobre una lista son:
- Tipo de datos de la lista
- Declaracin de un nodo
- Crear la lista
- Comprobar si la lista est vaca
- Insertar un elemento
- Eliminar un elemento
- Buscar un elemento
- Recorrer la lista
Tipo de datos de la lista
En cada tipo de lista se debe definir el tipo de dato que se va a manejar, para nuestro
ejemplo tomaremos el tipo String.
Declaracin de un nodo
nodoSimple nodo, inicio = null, fin = null;
Comprobar si la lista est vaca
Para comprobar si la lista est vaca, simplemente se debe de preguntar si inicio es igual
a null.
Insertar un elemento
Existen tres formas de insertar un nodo en una lista, los cuales pueden ser:
Insertar al inicio de la lista
nodoSimple nodo, inicio = null, fin = null;
...
..
.
Capturar la informacin
nodo = new nodoSimple(informacin);
...
..
.
nodo.cambiaEnlace(inicio);
inicio = nodo;
Producto de Aprendizaje 2.7:
- Elabore un programa en Java que lea 5 nombres desde el teclado y los inserte al
inicio en una lista ligada simple e imprima la lista final.
Insertar al final de la lista
inicio inicio
e
0
e
1
e
2
e
n
/
fin
nodo
inicio
e
1
e
2
e
n
/ e
0
/
fin fin
nodo
nodoSimple nodo, inicio = null, fin = null;
...
..
.
Capturar la informacin
nodo = new nodoSimple(informacin);
...
..
.
fin.cambiaEnlace(nodo);
fin = nodo;
Producto de Aprendizaje 2.8:
- Elabore un programa en Java que lea 5 nombres desde el teclado y los inserte al
final en una lista ligada simple e imprima la lista final.
Insertar entre elementos de la lista
nodoSimple nodo, inicio = null, fin = null;
...
..
.
Capturar la informacin
nodo = new nodoSimple(informacin);
...
..
.
pre.cambiaEnlace(nodo);
nodo.cambiaEnlace(suc);
Producto de Aprendizaje 2.9:
- Elabore un programa en Java que lea 5 nombres desde el teclado, los inserte al
final en una lista ligada simple, posteriormente solicite un nuevo nombre y un valor
numrico e inserte el nuevo nombre despus del n-esimo nombre e imprima la
lista final.
inicio suc
e
1
e
2
e
3
e
n
/
pre fin
e
0
nodo
Eliminar un elemento
As como existen tres formas de insertar un elemento, existen tres formas de eliminarlo.
Eliminar un elemento al inicio de la lista
nodoSimple nodo, inicio = null, fin = null;
String x;
...
..
.
x = inicio.obtenDato();
nodo = inicio;
inicio = inicio.obtenEnlace();
nodo.cambiaEnlace(null);
nodo = null;
Producto de Aprendizaje 2.10:
- Elabore un programa en Java que lea 5 nombres desde el teclado, los inserte al
inicio en una lista ligada simple e imprima la lista, posteriormente elimine el primer
nombre e imprima la lista final.
Eliminar un elemento al final de la lista
nodoSimple nodo, inicio = null, fin = null;
String x;
...
..
.
x = fin.obtenDato();
nodo = inicio;
while (nodo.obtenEnlace() != fin)
nodo = nodo.obtenEnlace();
nodo.cambiaEnlace(null);
fin = nodo;
inicio inicio
e
0
e
1
e
2
e
n
/
nodo fin
inicio
e
1
e
2
e
3
e
n
/
fin fin
nodo
Producto de Aprendizaje 2.11:
- Elabore un programa en Java que lea 5 nombres desde el teclado, los inserte al
final en una lista ligada simple e imprima la lista, posteriormente elimine el ltimo
nombre e imprima la lista final.
Eliminar un elemento en medio de la lista
nodoSimple nodo, inicio = null, fin = null;
String x;
...
..
.
x = nodo.obtenDato();
pre.cambiaEnlace(nodo.obtenEnlace);
nodo.cambiaEnlace(null);
nodo = null;
Nota: En ninguno de los algoritmos anteriores, se ha validado si la lista est vaca o si
existe un solo elemento en la lista.
Producto de Aprendizaje 2.12:
- Elabore un programa en Java que lea 5 nombres desde el teclado, los inserte al
inicio en una lista ligada simple e imprima la lista, posteriormente solicite un
nmero entre 1 al 5 y elimine el n-esimo nombre, al final imprima la lista.
Buscar un elemento
Al realizar la bsqueda un elemento en una lista, se debe realizar este proceso hasta que
se localice el elemento o hasta que se llegar al final de la lista.
boolean buscarL(nodoSimple nodo, String x) {
while (nodo != null && !x.equals(nodo.obtenDato()))
nodo = nodo.obtenEnlace();
if (nodo != null && x.equals(nodo.obtenDato()))
return true;
else
return false;
}
inicio nodo
e
1
e
2
e
3
e
n
/
pre fin
nodoSimple buscarN(nodoSimple nodo, String x) {
while (nodo != null && !x.equals(nodo.obtenDato()))
nodo = nodo.obtenEnlace();
return nodo;
}
Producto de Aprendizaje 2.13:
- Elabore un programa en Java que lea 5 nombres desde el teclado, los inserte al
final en una lista ligada simple e imprima la lista, posteriormente solicite un nuevo
nombre y lo busque en la lista, si encuentra el nombre indique en qu posicin se
encuentra, en caso de no localizarlo imprima -1.
Recorrer la lista
nodo = inicio;
while (nodo != null) {
System.out.print(nodo.ObtenDato() + "->");
nodo = nodo.obtenEnlace();
}
Systema.out.println("/");
El siguiente programa solicita el nmero de elementos que se desea insertar en una lista,
posteriormente mediante un men solicita la forma de insercin (Inicio o Final) y al final
despliegue la lista en pantalla.
1 // Ejemplo_Lista
2
3 import javax.swing.JOptionPane;
4
5 class nodoSimple {
6 private String dato;
7 private nodoSimple enlace;
8
9 nodoSimple( String d ) {
10 this( d, null );
11 }
12
13 nodoSimple( String d, nodoSimple e ) {
14 dato = new String(d);
15 enlace = e;
16 }
17
18 String obtenDato() {
19 return dato;
20 }
21
22 nodoSimple obtenEnlace() {
23 return enlace;
24 }
25
26 void cambiaDato(String d) {
27 dato = new String(d);
28 }
29
30 void cambiaEnlace(nodoSimple e) {
31 enlace = e;
32 }
33 }
34
35 public class Ejemplo_Lista {
36 public static void main(String [] args) {
37 nodoSimple inicio = null, fin = null, nodo;
38 String inf = "";
39 int cuantos, tipo=0;
40 Object[] options = { "Inicio", "Final" };
41
42 cuantos = Integer.parseInt(
43 JOptionPane.showInputDialog("Cuantos elementos deseas:") );
44 if (cuantos > 0) {
45 tipo = JOptionPane.showOptionDialog(null,
46 "Insertar al", "Opcin de insercin",
47 JOptionPane.DEFAULT_OPTION,
48 JOptionPane.QUESTION_MESSAGE,
49 null, options, options[0]);
50
51 for(int i=1; i<=cuantos; i++) {
52 inf = JOptionPane.showInputDialog
53 ("Dame el valor del nodo " + i + ":");
54 nodo = new nodoSimple(inf);
55 if (i == 1) {
56 inicio = nodo;
57 fin = nodo;
58 }
59 else {
60 if (tipo==0) {
61 nodo.cambiaEnlace(inicio);
62 inicio = nodo;
63 }
64 else {
65 fin.cambiaEnlace(nodo);
66 fin = nodo;
67 }
68 }
69 }
70
71 String Salida = "";
72 nodo = inicio;
73 while (nodo != null) {
74 Salida += nodo.obtenDato() + "->";
75 nodo = nodo.obtenEnlace();
76 }
77 Salida += "\\";
78 JOptionPane.showMessageDialog( null,Salida,
79 "Lista ligada simple",JOptionPane.PLAIN_MESSAGE);
80
81 System.exit(0);
82 }
83 }
84 }
Programa: Ejemplo_Lista.java 2/2
Insercin al inicio:
Insercin al final:
Producto de Aprendizaje 2.14:
- Elabore un programa en Java que mediante un men despliegue si se quiere
Insertar, Borrar, Mostrar o Salir en una lista ligada simple, si selecciona Insertar se
despliegue un men que indique si se inserta al Inicio, en Medio o al Final de la
lista, si selecciona en Medio, capture la posicin donde se desea insertar, despus
teclee el nombre y lo inserte en la opcin indicada. Si selecciona Borrar se
despliegue un men que indique si se borra al Inicio, en Medio o Final, si
selecciona en Medio, capture la posicin del elemento a borrar y posteriormente
borre el elemento segn lo indicado. Si selecciona Mostrar despliegue la lista
ligada simple. Solo puede terminar cuando en el men principal seleccione Salir.
Listas doblemente ligadas
Clase nodoDoble
class nodoDoble {
private nodoDoble enlaceIzq;
private String dato;
private nodoDoble enlaceDer;
nodoDoble( String d ) {
this( null, d, null );
}
nodoDoble(nodoDoble izq, String d, nodoDoble der ) {
dato = new String(d);
enlaceIzq = izq;
enlaceDer = der;
}
String obtenDato() {
return dato;
}
nodoDoble obtenEnlaceIzq() {
return enlaceIzq;
}
nodoDoble obtenEnlaceDer() {
return enlaceDer;
}
void cambiaDato(String d) {
dato = new String(d);
}
void cambiaEnlaceIzq( nodoDoble izq ) {
enlaceIzq = izq;
}
void cambiaEnlaceDer( nodoDoble der ) {
enlaceDer = der;
}
}
Insertar un elemento
Existen tres formas de insertar un nodo en una lista doblemente ligada:
Insertar al inicio
inicio inicio
fin
/ / e
0
/ e
3
e
n
e
1
e
2
nododoble nodo, inicio = null, fin = null;
...
..
.
Capturar la informacin
nodo = new nodoDoble(informacin);
...
..
.
nodo.cambiaEnlaceDer(inicio);
inicio.cambiaEnlaceIzq(nodo);
inicio = nodo;
Insertar al final
nodoDoble nodo, inicio = null, fin = null;
...
..
.
Capturar la informacin
nodo = new nodoDoble(informacin);
...
..
.
fin.cambiaEnlaceDer(nodo);
nodo.cambiaEnlaceIzq(fin);
fin = nodo;
Insertar entre elementos de la lista
nodoDoble nodo, inicio = null, fin = null;
...
..
.
Capturar la informacin
inicio
fin fin
/ e
0
/ e
3
e
n
/ e
1
e
2
inicio pre suc
fin
e
0
e
3
e
n
/ / e
1
e
2
nodo
nodo = new nodoDoble(informacin);
...
..
.
pre.cambiaEnlaceDer(nodo);
nodo.cambiaEnlaceIzq(pre);
nodo.cambiaEnlaceDer(suc);
suc.cambiaEnlaceIzq(nodo);
Eliminar un elemento
Existen tres formas de eliminar un elemento en una lista doblemente ligada.
Eliminar un elemento al inicio
nodoDoble nodo, inicio = null, fin = null;
String x;
...
..
.
x = inicio.obtenDato();
nodo = inicio;
inicio = inicio.obtenEnlaceDer();
inicio.cambiaEnlaceIzq(null);
nodo.cambiaEnlaceDer(null);
nodo = null;
Eliminar un elemento al final de la lista
nodoDoble nodo, inicio = null, fin = null;
String x;
...
..
.
x = fin.obtenDato();
nodo = fin;
fin = fin.obtenEnlaceIzq();
fin.cambiaEnlaceIzq(null);
nodo.cambiaEnlaceIzq(nell);
nodo = null;
inicio inicio
fin
e
n
/ e
2
e
3
/ e
1
nodo
inicio
fin fin
e
n
/ / e
1
e
2
e
3
nodo
Eliminar un elemento en medio
nodoDoble nodo, inicio = null, fin = null;
String x;
...
..
.
x = nodo.obtenDato();
pre.cambiaEnlaceDer(suc);
suc.cambiaEnlaceIzq(pre);
nodo.cambiaEnlaceIzq(null);
nodo.cambiaEnlaceDer(null);
nodo = null;
Producto de Aprendizaje 2.15:
- Elabore un programa en Java que mediante un men despliegue si se quiere
Insertar, Borrar, Mostrar o Salir en una lista doblemente ligada, si selecciona
Insertar se despliegue un men que indique si se inserta al Inicio, en Medio o al
Final de la lista, si selecciona en Medio, capture la posicin donde se desea
insertar, despus teclee el nombre y lo inserte en la opcin indicada. Si selecciona
Borrar se despliegue un men que indique si se borra al Inicio, en Medio o Final, si
selecciona en Medio, capture la posicin del elemento a borrar y posteriormente
borre el elemento segn lo indicado. Si selecciona Mostrar despliegue la lista
ligada simple. Solo puede terminar cuando en el men principal seleccione Salir.
Clase LinkedList El paquete java.util contiene la clase LinkedList para implementar
y manipular listas enlazadas que crezcan y se reduzcan durante la
ejecucin del programa. La clase LinkedList es una
implementacin de listas doblemente ligadas.
Mtodos Descripcin
LinkedList() Crea una lista vacia
void add(int index, Object o)
Inserta el objeto o en la posicin indicada
por index
boolean add(Object o) Inserta el objeto o al final de la lista
inicio pre suc
fin
e
n
/ e
1
e
2
/ e
3
nodo
Mtodos Descripcin
void addFirst(Object o) Inserta el objeto o al inicio de la lista
void addLast(Object o) Inserta el objeto o al final de la lista
void clear() Elimina todos los elementos
boolean contains(Object o)
Regresa verdadero si el objeto o est
contenido en la lista
Object get(int index)
Regresa el objeto almacenado en la
posicin indicada por index
Object getFirst()
Regresa el objeto que esta al inicio de la
lista
Object getLast()
Regresa el objeto que esta al final de la
lista
int indexOf(Object o)
Regresa la posicin de la primera
ocurrencia del objeto o en la lista o -1 en
caso de que no exista el elemento.
int lastIndexOf(Object o)
Regresa la posicin de la ltima ocurrencia
del objeto o en la lista o -1 en caso de que
no exista el elemento
Object remove(int index)
Elimina y regresa el objeto indicado por
index
boolena remove(Object o)
Elimina la primera ocurrencia del objeto o
de la lista.
Object removeFirst()
Elimina y regresa el primer elemento de la
lista
Object removeLast()
Elimina y regresa el ltimo elemento de la
lista
Object set(int index, Object o)
Remplaza el elemento indicado por index
por el elemento o y regresa el objeto
almacenado en esa posicin
Mtodos Descripcin
int size() Regresa el nmero de elementos de la lista
Object [ ] toArray()
Regresa un arreglo de objetos que
contiene todos los elementos de lista
Producto de Aprendizaje 2.16:
- Utilizando la clase LinkedList, elabore un programa en Java que mediante un
men despliegue si se quiere Insertar, Borrar, Mostrar o Salir en una lista
doblemente ligada, si selecciona Insertar se despliegue un men que indique si se
inserta al Inicio, en Medio o al Final de la lista, si selecciona en Medio, capture la
posicin donde se desea insertar, despus teclee el nombre y lo inserte en la
opcin indicada. Si selecciona Borrar se despliegue un men que indique si se
borra al Inicio, en Medio o Final, si selecciona en Medio, capture la posicin del
elemento a borrar y posteriormente borre el elemento segn lo indicado. Si
selecciona Mostrar despliegue la lista ligada simple. Solo puede terminar cuando
en el men principal seleccione Salir.
3. Estructuras no lineales
3.1. Recursividad.
Definicin: Un funcin recursiva es una funcin que se llama a si mismo ya sea directa
o indirectamente.
La recursividad directa es el proceso por el cual un mtodo se llama asimismo
desde el mismo cuerpo del programa:
int fn() {
. . .
fn();
. . .
}
La recursividad indirecta implica ms de un mtodo, por ejemplo:
int fn1() {
. . .
fn2(. . .);
. . .
}
int fn2() {
. . .
fn1(. . .);
. . .
}
Uno de los requisitos que debe tener un proceso recursivo para considerarlo valido
es que debe tener una condicin de salida o condicin base, para que garantice el
no generar un secuencia infinita y agotara la memoria (Stack) Pila). Por
ejemplo:
El factorial de un nmero no negativo n (denotado por n!) es el producto de:
n! = n * (n-1) * (n-2) * 1
En el cual :
0! = 1
1! = 1
2! = 2 * 1
3! = 3 * 2 * 1
. . .
Si n es igual a 5 tendremos:
!... 3 * 4 * 5 ) 1 * 2 * 3 * 4 ( * 5 ! 4 * 5 1 * 2 * 3 * 4 * 5 ! 5
)! 1 4 ( )! 1 5 (
= = = =
De modo que la funcin recursiva del factorial n sera:
n! = n * (n-1)! = n * (n-1) * ((n-1)-1)!...1
De tal manera que el factorial de un entero no negativo n mayor o igual a cero se
calculara de la siguiente forma:
>
=
)! 1 ( * 0
1 0
!
n n n
n
n
Implementando de la funcin recursiva:
long factorial (long n) {
if (n == 0)
return 1;
else
return n * factorial(n-1);
}
La recursividad en el recorrido de las pilas
System.out.println( Factorial de 5 es: + factorial(5));
n=5
5*factorial(4)
n=4
4*factorial(3)
5*factorial(4)
n=3
3*factorial(2)
4*factorial(3)
5*factorial(4)
n=2
2*factorial(1)
3*factorial(2)
4*factorial(3)
5*factorial(4)
1*factorial(0)
n=1
2*factorial(1)
3*factorial(2)
4*factorial(3)
5*factorial(4)
1*1 = 1
2*factorial(1)
3*factorial(2)
4*factorial(3)
5*factorial(4)
2*1=2
3*factorial(2)
4*factorial(3)
5*factorial(4)
3*2=6
4*factorial(3)
5*factorial(4)
4*6=24
5*factorial(4)
5*24=120
Factorial de 5: 120
Ejemplos:
- Deducir la funcin recursiva del producto de dos nmeros naturales. El producto
de a*b donde a y b son enteros positivos, tiene dos soluciones:
Solucin iterativa:
veces b
* a a a a a b a + + + + =
Solucin recursiva:
+ >
=
) 1 ( * 0
1
*
b a a b
a b
b a
Por ejemplo 7 * 3 ser:
7 * 3 = 7 + 7 * (3-1) = 7 + 7 + 7*(2-1) = 7 + 7 + 7=21
La funcin recursiva quedara:
int producto (int a, int b) {
if (b == 1)
return a;
else
return a + a * (b - 1);
}
- Deducir la funcin recursiva de la serie fibonacci: 0 1 1 2 3 5 8 13
La seria fibonacci comienzan con los nmeros 0 y 1, y el los dems resultan
de la suma de los dos ltimos:
0 + 1 = 1
1 + 1 = 2
1 + 2 = 3
2 + 3 = 5
3 + 5 = 8
5 + 8 = 13
..
.
Entonces podemos deducir que:
fibonacci(0) = 0
fibonacci(1) = 1
fibonacci(n)= fibonacci(n-1) + fibonacci(n-2)
Solucin recursiva:
+ >=
== ==
) 2 ( ) 1 ( 2
n 1 n || 0 n
) (
n fibonacci n fibonacci n
n fibonacci
La funcin recursiva quedara:
long fibonacci(long n) {
if (n == 0 || n == 1)
return n;
else
return fibonacci(n-1) + fibonacci(n-2);
}
Producto de Aprendizaje 3.1:
- Escriba un programa que utilice una funcin recursiva mcd (mximo como
un divisor) de dos nmeros por el algoritmo de Euclides. El mcd de dos
nmeros a y b se define como el entero mayor que divide a ambos
nmeros. El mcd no est definido si tanto a como b son cero. Los valores
negativos de a y b se sustituyen por sus valores absolutos. Siempre debe
cumplirse la premisa a >= b. Si b = 0 el mcd es a. Por ejemplo el mcd(2970,
1265)
a b Operacin
2970 1265 2990 % 1265=440
1265 440 1265 % 440 = 385
440 385 440 % 385= 55
385 55 385 % 55 = 0
55 0 El mcd es 55
=
=
) % , ( 0 !
0
) , (
b a b mcd b
a b
b a mcd
Object[] options = { "Inicio", "Final" };
tipo = JOptionPane.showOptionDialog(null,
"Insertar al", "Opcin de insercin",
JOptionPane.DEFAULT_OPTION,
JOptionPane.QUESTION_MESSAGE,
null, options, options[0]);
Producto de Aprendizaje 3.2:
A. Implemente los mtodos recursivos de producto de dos nmeros naturales,
serie Fibonacci y Mximo Como un Divisor utilizando un men basado en
botones.
B. Elabore e implemente uno de los problemas siguientes programas
recursivos:
1. Programar un algoritmo recursivo que permita hacer la divisin por
restas sucesivas.
2. Programar un algoritmo recursivo que permita invertir un nmero.
Ejemplo: Entrada: 123 Salida: 321
3. Programar un algoritmo recursivo que permita sumar los dgitos de
un nmero. Ejemplo: Entrada: 123 Resultado: 6
4. Programar un algoritmo recursivo que permita sumar los elementos
de un vector.
5. Programar un algoritmo recursivo que permita multiplicar los
elementos de un vector.
6. Programar un algoritmo recursivo que permita sumar los elementos
de una matriz.
7. Programar un algoritmo recursivo que eleve a la potencia un nmero
x
n
.
3.2. rboles.
Las listas enlazadas, pilas y colas son estructuras de datos lineales (es decir,
secuenciales). Un rbol es una estructura bidimensional no lineal, con propiedades
especiales.
Por medio de los rboles se pueden representar estructuras jerrquicas, direcciones o
etiquetas de una manera organizada.
Dentro de las ciencias computacionales, los rboles tienen muchas aplicaciones, entre
estas se encuentran:
- Organizacin de tablas de smbolos en los compiladores.
- Representacin de rboles de decisin.
- Asignacin de bloques de memoria de tamao variable.
- Ordenacin de datos.
- Bsqueda de datos.
- Solucin de juegos.
- Teoremas.
- Etc.
Definicin: Conjunto finito T de uno o ms nodos tal que:
- v
1
es el nodo raz.
- v
n-1
es el padre de v
n
.
- v
1
, v
2
, , v
n-1
son ancestros de v
n
.
- v
n
es un hijo de v
n-1
.
- Si a es un ancestro de b, entonces b es un descendiente de a.
- Si a y b son hijos de c, entonces a y b son hermanos.
- Si a no tiene hijos, entonces a es un vrtice terminal (o una hoja).
V
1
V
2
V
7
V
6
V
5
V
4
V
3
- Si a no es un vrtice terminal, entonces a es un vrtice interno (o una rama).
- Cada vrtice o nodo puede tener un nombre y una informacin asociada.
- Un arco es una conexin entre dos vrtices o nodos.
- Un camino es una lista de nodos diferentes en los que los nodos estn conectados
por medio de arcos. Una propiedad que se distingue a los rboles es que existe
exactamente un camino entre el nodo raz y cada uno de los nodos del rbol, por
ejemplo el camino desde la raz a la hoja v
5
, se representa v
1
, v
2
, v
5
que incluye las
ramas (v
1
, v
2
) y (v
2
, v
5
) y su longitud es 2.
- La altura o profundidad es la longitud del camino ms largo ms uno.
- El nivel de un nodo es su distancia al nodo raz. El nodo raz tiene distancia cero.
Los hijos del nodo raz estn en el nivel uno, mientras que sus hijos estn en el
nivel 2 y as sucesivamente.
- El grado de un nodo se determina por el nmero de hijos que tiene. Los nodos que
tienen grado cero son hojas.
Ejemplo:
V
1
V
3
V
4
V
5
V
6
V
7
V
2
Nodo Raz
Vrtice
o
Nodo
Arco
Nivel 0
Nivel 1
Nivel 2
A
B C
D E F G H
M N O I J K L
- Cul es el camino de A-L?
- Cules son los hijos de G?
- Cules son los nodos de grado cero?
- Cules son los nodos de grado dos?
- Cules son los nodos de grado tres?
- Cul es la profundidad del rbol?
Representacin de un rbol
Existen varias formas de representacin de un rbol en forma grafica:
Niveles:
01 v
1
02 v
2
03 v
4
03 v
5
02 v
3
03 v
6
03 v
7
Parntesis anidados:
v
1
(v
2
(v
4
,v
5
), v
3
(v
6
,v
7
))
Grafos:
Diagrama de Venn:
Un rbol ordenado es aquel que est estructurado bajo una organizacin especfica.
V
1
V
3
V
4
V
5
V
6
V
7
V
2
v
1
v
3
v
2
v
6
v
7
v
4
v
5
Representacin en memoria de rboles.
rboles generales.
Tambin mediante los rboles podemos representar situaciones de la vida diaria tales
como:
A
B C
D E / F / / H /
/ I / / J / / K / / L /
Vice-Presidente
para asuntos
Acadmicos
Vice-Presidente
para asuntos
Administrativos
Decano de
Artes y Ciencias
Decano de
Comercio
Director de
Plantacin
Acadmica
Director de
Adquisiciones
Jefe de
Matemticas
Jefe de
Ciencias de la
Computacin
Jefe de
Contadura
Presidente
Afrodita Cronos Atlas Prometeo
Eros Zeus Poseidn Hades Ares
Apolo Atenas Hermes Heracles
Urano
rboles binarios.
Definicin: Es un rbol en el cual sus nodos no puede tener ms de dos hijos.
Un rbol binario puede tener cero, uno o dos hijos. Al nodo izquierdo se le llama hijo
izquierdo y al nodo derecho hijo derecho.
Recorrido de rboles binarios.
Existen tres formas de recorrer un rbol binario, las cuales son Preorden, Incorden
Postorden.
Preorden
Preorden
El recorrido es raz, hijo izquierdo e hijo derecho.(rid)
Seles
Seles
Navratilova
Graf
Sabatini
Graf
Graf
A
B C
D E F
G H
Inorden
Inorden
El recorrido es hijo izquierdo, raz e hijo derecho. (ird)
Postorden
Postorden
El recorrido es hijo izquierdo, hijo derecho y raz. (idr)
Preorden:
20, 15, 10, 5, 12, 18, 17,
19, 33, 25, 21, 27, 50, 40,
70
Inorden:
5, 10, 12, 15, 17, 18, 19,
20, 21, 25, 27, 33, 40, 50,
70
Postorden:
5, 12, 10, 17, 19, 18, 15,
21, 27, 25, 40, 70, 50, 33,
20
Declaracin de un nodoArbol
class nodoArbol {
private nodoArbol hizq;
private int dato;
private nodoArbol hder;
nodoArbol( int dat ) {
this( null, dat, null );
}
nodoArbol( nodoArbol izq, int dat, nodoArbol der ) {
dato = dat;
hizq = izq;
hder = der;
}
int obtenDato() {
return dato;
}
nodoArbol obtenHIzq() {
return hizq;
}
nodoArbol obtenHDer() {
return hder;
}
void cambiaDato(int dat) {
dato = dat;
}
void cambiaHIzq(nodoArbol izq) {
hizq = izq;
}
void cambiaHDer(nodoArbol der) {
hder = der;
}
}
Algoritmo preorden utilizando pilas
public static void preordenPila(nodoArbol r) {
tipoPila Pila = new tipoPila();
nodoArbol recorre;
Pila.insertar(null);
recorre = r;
while (recorre != null) {
procesar el nodo recorre
if (recorre.obtenHDer() != null)
Pila.insertar(recorre.obtenHDer());
if (recorre.obtenHIzq() != null)
recorre = recorre.obtenHIzq();
else
recorre = Pila.quitar();
}
}
Algoritmo preorden recursivo
public static void preordenRecursivo(nodoArbol r) {
if (r != null) {
procesar el nodo r
preordenRecursivo(r.obtenHIzq());
preordenRecursivo(r.obtenHDer());
}
}
Algoritmo inorden utilizando pilas
public static void inordenPila(nodoArbol r) {
tipoPila Pila = new tipoPila();
nodoArbol recorre;
Pila.insertar(null);
recorre = r;
while (recorre != null) {
while (recorre != null) {
Pila.insertar(recorre);
recorre = recorre.obtenHIzq();
}
recorre = Pila.quitar();
while (recorre != null) {
procesar el nodo recorre
if (recorre.obtenHDer() != null) {
recorre = recorre.obtenHDer();
break;
}
recorre = Pila.quitar();
}
}
}
Algoritmo inorden recursivo
public static void inordenRecursivo(nodoArbol r) {
if (r != null) {
inordenRecursivo(r.obtenHIzq());
procesar el nodo r
inordenRecursivo(r.obtenHDer());
}
}
Algoritmo postorden utilizando pilas
public static void postordenPila(nodoArbol r) {
tipoPila Pila = new tipoPila();
nodoArbol recorre;
Pila.insertar(null);
recorre = r;
while (recorre != null) {
while (recorre != null) {
Pila.insertar(recorre);
if (recorre.obtenHDer() != null)
Pila.insertar((-1) * recorre.obtenHDer());
recorre = recorre.obtenHIzq();
}
recorre = Pila.quitar();
while (recorre > 0) {
procesa el nodo recorre
recorre = Pila.quitar();
}
if (recorre < 0)
recorre = (-1) * recorre;
}
}
Algoritmo postorden recursivo
public static void postordenRecursivo(nodoArbol r) {
if (r != null) {
postordenRecursivo(r.obtenHIzq());
postordenRecursivo(r.obtenHDer());
procesar el nodo r
}
}
El siguiente programa crea un rbol ordenado ascendentemente, mostrando los datos
mediante el recorrido preorden y utiliza recursin. Primero solicita el nmero de nodos que
se darn de alta, posteriormente solicita el valor de cada nodo y va creando el rbol
binario, al final muestre la informacin.
1 // Ejemplo_Arboles
2
3 import javax.swing.JOptionPane;
4
5 class nodoArbol {
6 private nodoArbol hizq;
7 private int dato;
8 private nodoArbol hder;
9
10 nodoArbol( int dat ) {
11 this( null, dat, null );
12 }
13
14 nodoArbol( nodoArbol izq, int dat, nodoArbol der ) {
15 dato = dat;
16 hizq = izq;
17 hder = der;
18 }
19
20 int obtenDato() {
21 return dato;
22 }
23 nodoArbol obtenHIzq() {
24 return hizq;
25 }
26
27 nodoArbol obtenHDer() {
28 return hder;
29 }
30
31 void cambiaDato(int dat) {
32 dato = dat;
33 }
34
35 void cambiaHIzq(nodoArbol izq) {
36 hizq = izq;
37 }
38
39 void cambiaHDer(nodoArbol der) {
40 hder = der;
41 }
42 }
43
44 class tipoPila {
45
46 final static int MAX_ELEMENTOS = 100;
47 private int error;
48 private int cima;
49 private nodoArbol elemento[];
50
51 public tipoPila() {
52 error = 0;
53 cima = -1;
54 elemento = new nodoArbol [MAX_ELEMENTOS];
55 }
56
57 public void insertar(nodoArbol d) {
58 if (!pilallena())
59 elemento[++cima]= d;
60 else
61 error = 1;
62 }
63
64 public nodoArbol quitar() {
65 if (!pilavacia())
66 return elemento[cima--];
67 else {
68 error = 2;
69 return null;
70 }
71 }
72
73 public boolean pilavacia() {
74 if (cima == -1)
75 return true;
76 else
77 return false;
78 }
79
80 public boolean pilallena() {
81 if (cima == (MAX_ELEMENTOS - 1))
82 return true;
83 else
84 return false;
85 }
86
87 public int muestraError() {
88 return error;
89 }
90 }
91
92 public class Ejemplo_Arbol {
93 public static void main(String [] args) {
94 int i,cuantos, inf;
95 nodoArbol nodo, recorre, raiz = null;
96
97 cuantos = Integer.parseInt(
98 JOptionPane.showInputDialog("Cuantos elementos deseas:") );
99
100 // Construccin del arbol ordenado
101 for (i=0; i < cuantos ; i++) {
102 inf = Integer.parseInt(
103 JOptionPane.showInputDialog("Dame el valor del nodo " + i + ":"));
104 nodo= new nodoArbol(inf);
105 if (raiz == null)
106 raiz = nodo;
107 else {
108 recorre = raiz;
109 while (true) {
110 if (nodo.obtenDato() > recorre.obtenDato())
111 if (recorre.obtenHDer() == null) {
112 recorre.cambiaHDer(nodo);
113 break;
114 }
115 else
116 recorre = recorre.obtenHDer();
117 else
118 if (recorre.obtenHIzq() == null) {
119 recorre.cambiaHIzq(nodo);
120 break;
121 }
122 else
123 recorre = recorre.obtenHIzq();
124 }
125 }
126 }
127 String Salida = "";
128
129 Salida += "Preorden:\n";
130 Salida += " Recursivo: " + preordenRecursivo(raiz) + "\n";
131
132 JOptionPane.showMessageDialog( null,Salida,
133 "Arbol Binario",JOptionPane.PLAIN_MESSAGE);
134 System.exit(0);
135 }
136
137 public static String preordenRecursivo(nodoArbol r) {
138 if (r != null) {
139 return r.obtenDato() + " " +
140 preordenRecursivo(r.obtenHIzq()) +
141 preordenRecursivo(r.obtenHDer());
142 }
143 else
144 return "";
145 }
Producto de Aprendizaje 3.3:
1. Elabore un programa en java que crea un rbol binario ordenado
ascendentemente de nmeros enteros y al final muestre los datos mediante el
recorrido preorden utilizando pilas y recursin.
2. Elabore un programa en java que crea un rbol binario ordenado
ascendentemente de nmeros enteros y al final muestre los datos mediante el
recorrido inorden utilizando pilas y recursin.
3. Elabore un programa en java que crea un rbol binario ordenado
ascendentemente de nmeros enteros y al final muestre los datos mediante el
recorrido postorden utilizando pilas y recursin.
4. Elabore un programa en java que crea un rbol binario ordenado
ascendentemente de cadena de caracteres e imprima cuantas hojas tiene el rbol.
5. Elabore un programa en java que crea un rbol binario ordenado
ascendentemente de cadena de caracteres e imprima cuantos nodos conforman
sus ramas.
6. Elabore un programa en java que crea un rbol binario ordenado
ascendentemente de cadena de caracteres e imprima cuantos nodos son abuelos.
7. Elabore un programa en java que crea un rbol binario ordenado
ascendentemente de nmeros enteros e imprima cuantos nodos son pares.
8. Elabore un programa en java que crea un rbol binario ordenado
ascendentemente de nmeros enteros e imprima cuantos nodos son impares.
9. Elabore un programa en java que crea un rbol binario ordenado
ascendentemente de nmeros enteros, solicite un nmero desde teclado e
imprima si se encuentra ese valor en el rbol.
10. Elabore un programa en java que crea un rbol binario ordenado
ascendentemente de nmeros enteros, solicite un nmero desde teclado,
posteriormente busque el nmero en el rbol y si lo encuentra regrese el nodo
donde lo encontr, en caso contrario regrese null.
3.3. Grafos.
Definicin.
Un grafo est representado por un conjunto de vrtices o nodos V y un conjunto de arcos
A, representado por G=(V,A). Un arco o arista representa una relacin entre dos nodos y
se representa por (u, v), siendo u y v el par de nodos.
Tipos de grafos.
Un grafo no dirigido es aquel en que sus arcos son pares no ordenados o no dirigidos.
Un grafo dirigido es aquel en el que sus arcos son pares ordenados o dirigidos (sus arcos
tiene una flecha que indica la direccin de la relacin). A un grafo dirigido tambin se le
llama diagrafo.
G=(V,A)
V={1, 4, 5, 7, 9}
A={(1, 4), (4, 1), (1, 5),
(5, 1), (4, 9), (9, 4), (5, 7),
(7, 5), (7, 9), (9, 7)}
(a)
G(V, A)
V={C, D, E, F, H}
A={ (C, D), (D, F), (E, C)
(E, H), (H, E) }
(b)
(a) Grafo no dirigido y (b) Grafo dirigido
En ocasiones las relaciones entre nodos tienen asociado una magnitud denominada factor
o peso, y al grafo se le llama grafo ponderado.
Por ejemplo, los pueblos que forman una comarca, los nodos estn conformados por los
pueblos, los arcos por los caminos y los pesos es la distancia en kilmetros.
1
7
4
5
9
11
77
44
55
99
C
D
E
H
F
CC
DD
EE
HH
FF
Grafo ponderado
Grado de un nodo
En un grafo no dirigido el grado de un nodo v (grado(v)), es el nmero de arcos
que contiene el nodo v. Por ejemplo en el primer ejemplo de grafo no dirigido en el
inciso (a), el grado(9) = 2, ahora considerando grafo de la comarca tendremos que
el grado(Lupiana) = 3.
En un grafo dirigido se distingue entre grado de entrada y grado de salida; el grado
de entrada de un nodo v (gradoEntrada(v)), es el numero de arcos que entran al
nodo v y el grado de salida del nodo v (gradoSalida(v)), es el nmero de arcos que
salen de v. Por ejemplo en el primer ejemplo de grafo no dirigido en el inciso (b)
tendremos: gradoEntrada(E) = 1 y el gradoSalida(E) = 2.
Camino
Un camino P de longitud n, desde el vrtice v
0
a v
n
, es un grafo G es la secuencia
de n+1 vrtices v
0
, v
1
, v
2
,, v
n
tal que (v
i
, v
i+1
) e A(arcos) para 0 i n.
Matemticamente el camino se representa por P=(v
0
, v
1
, v
2
,, v
n
).
Grafo no dirigido
Lupiana Lupiana
El
Centenillo
El
Centenillo
San
Nicolas
San
Nicolas
Valleviejo Valleviejo
El Novillo El Novillo
7
5
12
7
6
4
6
7
10
9
11
44
66
77
10 10
99
11 11
Por ejemplo camino del nodo 4 al nodo 7 se representa por P1 = (4, 6, 9, 7) con una
longitud 3, otro camino seria P2=(10, 11). En el ejemplo de la comarca el camino P=
(Lupiana, Valleviejo, El Novillo) tiene una longitud de 19 (12 + 7).
Un camino P=(v
0
, v
1
, v
2
,, v
n
) es simple si todos los nodos que forman el camino son
distintos, pudiendo ser igual v
0
y v
n
(los extremos del camino). Los caminos de P1 y P2
son caminos simples.
En un grafo dirigido, un ciclo es un camino simple cerrado. Por tanto, un ciclo empieza y
termina en el mismo nodo, v
0
= v
n
,; debe tener ms de un arco. Un grafo dirigido sin ciclos
es llamado acclico (GDA-Grafo Dirigido Acclico). En general, un ciclo de longitud k se
denomina k-ciclo.
Grafo dirigido con ciclos
En la figura anterior se muestra un grafo dirigido en el que los vrtices (A, E, B, F, A)
forman un ciclo de longitud 4, por lo tanto es de 4-ciclo.
Un grafo no dirigido es conexo si existe un camino entre cualquier par de nodos que
forman el grafo y es fuertemente conexo si todos sus nodos estn conectados.
(a) (b)
(a) Grafo conexo y (b) Grafo fuertemente conexo
Representacin de grafos en memoria.
A
D
B C
E F
AA
DD
BB CC
EE FF
A
D
C
E
F
AA
DD
CC
EE
FF
A
D
C
F
AA
DD
CC
FF
Primero considere los vrtices o nodos como nmeros consecutivos empezando del
ndice cero. Tome en cuenta que el nmero de nodos son finitos. Se puede elegir una
representacin secuencial, mediante un arreglo bidimensional conocida como matriz de
adyacencia; o bien una representacin mediante una estructura multienlazada,
denominada lista de adyacencia. La eleccin de una representacin u otra depende del
tipo de grafo y de las operaciones que se vayan a realizar sobre los vrtices y arcos. Para
un grafo denso lo menor es utilizar una matriz de adyacencia. Para un grafo disperso se
suelen utilizar listas de adyacencia.
Camino
Sea G=(V, A) un grafo de n nodos, siendo V={v
0
, v
1
, v
2
,..,v
n-1
} el conjunto de nodos, y
A={(v
i
, v
j
)} el conjunto de arcos. Los nodos se pueden representar por nmeros
consecutivos de 0 a n-1. La representacin de los arcos se hace con una matriz M de n
por n, denominada matriz de adyacencia, tal que cada elemento M
ij
puede tomar los
valores:
) v , (v arco un hay no si 0
) v , (v arco un hay si 1
j i
j i
ij
M
Por ejemplo de un grafo dirigido:
Matriz de adyacencia:
0 1 2 3 4
D F K L R
0 D 0 1 1 0 0
1 F 1 0 0 0 0
2 K 0 0 0 0 0
3 L 0 1 1 0 0
4 R 1 0 0 0 0
Lista de adyacencia:
Por ejemplo de un grafo no dirigido:
Matriz de adyacencia:
0 1 2 3 4
1 2 3 4 5
0 1 0 1 0 1 1
1 2 1 0 1 0 0
2 3 0 1 0 1 1
3 4 1 0 1 0 0
4 5 1 0 1 0 0
Lista de adyacencia:
Por ejemplo de un grafo ponderado:
F K /
D /
F K /
D /
K
L
R
/
D
F
3
4
2
1
5
3
4
2
1
5
2 4 5 /
1 3 /
2 4 /
1 3 /
1 3 /
1
2
3
4
5
Matriz de adyacencia
0 1 2 3 4
A F L V W
0 A 0 0 0 0 0
1 F 5 0 5 5 0
2 L 0 0 0 0 9
3 V 8 0 0 0 0
4 W 0 4 0 0 0
Lista de adyacencia:
Producto de Aprendizaje 3.4:
De los siguientes grafos represntelos en su matriz de adyacencia y lista de adyacencia.
F L A
V W
5 5
8 9
4
5
F L A
V W
F L A FF LL AA
V W VV WW
5 5
8 9
4
5
A 5 L 5 V 5 /
W 9 /
A 8 /
F 4 / W
L
V
A
/
F
Futuro
Villa
Grande
San
Blass
El Rincon
El
Rancho
10
6
5
8
6
4
8
Futuro Futuro
Villa
Grande
Villa
Grande
San
Blass
San
Blass
El Rincon El Rincon
El
Rancho
El
Rancho
10
6
5
8
6
4
8
Producto de Aprendizaje 3.5:
Elabore un programa en java que mediante teclado solicite el nmero de nodos de un
grafo, capture los valores del grafo e imprima la matriz de adyacencia y su lista de
adyacencia.
a
d
c
b
e
aa
dd
cc
bb
ee
v
1
v
2
v
6
v
4
v
3
v
5
v
1
v
1
v
2
v
2
v
6
v
6
v
4
v
4
v
3
v
3
v
5
v
5
4. Mtodos de ordenamiento y bsqueda
Uno de los procedimientos ms comunes y tiles en el procesamiento de datos, es la
clasificacin u ordenacin de los mismos. Se considera ordenar al proceso de reorganizar
un conjunto dado de objetos en una secuencia determinada. Cuando se analiza un
mtodo de ordenacin, hay que determinar cuntas comparaciones realizo, cuantos
intercambios hizo y cunto tiempo tardo.
La colocacin en orden de una lista de valores se llama Ordenacin y a la localizacin de
un elemento de una lista se llama bsqueda.
4.1. Algoritmos de ordenamiento.
Existen varios mtodos para ordenamiento y clasificados en tres formas:
- Intercambio
- Seleccin
- Insercin.
En cada familia se distinguen dos versiones: un mtodo simple y directo, fcil de
comprender pero de escasa eficiencia respecto al tiempo de ejecucin, y un mtodo
rpido, ms sofisticado en su ejecucin por la complejidad de las operaciones a realizar,
pero mucho ms eficiente en cuanto a tiempo de ejecucin. En general, para arreglos con
pocos elementos, los mtodos directos son ms eficientes (menor tiempo de ejecucin)
mientras que para grandes cantidades de datos se deben emplear los llamados mtodos
rpidos.
Intercambio
El mtodo de intercambio se basa en comparar los elementos del arreglo e
intercambiarlos si su posicin actual o inicial es contraria inversa a la deseada. Pertenece
a este mtodo el de la burbuja. Aunque no es muy eficiente para ordenar listas grandes,
es fcil de entender y muy adecuado para ordenar una pequea lista de elementos.
Una pasada por la ordenacin de burbujeo consiste en un recorrido completo a travs del
arreglo, en el que se comparan los contenidos de las casillas adyacentes, y se cambian si
no estn en orden. La ordenacin por burbujeo completa consiste en una serie de
pasadas ("burbujeo") que termina con una en la que ya no se hacen cambios porque todo
est en orden.
Ejemplo:
Arreglo
0 7
1 4
2 9
3 2
4 5
5 10
6 1
7 6
8 8
9 3
Movimientos
Algoritmo:
Repite
Para I=0 hasta Arreglo.longitud 1
Si Arreglo[I+1] < Arreglo[I]
Arreglo[I] <-> Arreglo[I+1] // Intercambiar
Contabilizar movimientos
Fin_Si
Fin_para
Hasta que no existan movimientos
Seleccin
Los mtodos de ordenacin por seleccin se basan en dos principios bsicos:
Seleccionar el elemento ms pequeo (o ms grande) del arreglo. Colocarlo en la
posicin ms baja (o ms alta) del arreglo. A diferencia del mtodo de la burbuja, en este
mtodo el elemento ms pequeo (o ms grande) es el que se coloca en la posicin final
que le corresponde.
Ejemplo:
Algoritmo:
Para I=0 hasta Arreglo.longitud 1
Para J= I+1 hasta Arreglo.longitud
Si Arreglo[J] < Arreglo[I]
Arreglo[I] <-> Arreglo[I+1] // Intercambiar
Fin_Si
Fin_para
Fin_para
Insercin
El fundamento de este mtodo consiste en insertar los elementos no ordenados del
arreglo en subarreglos del mismo que ya estn ordenados. Dependiendo del mtodo
elegido para encontrar la posicin de insercin tendremos distintas versiones del mtodo
de insercin.
Arreglo
0 7
1 4
2 9
3 2
4 5
5 10
6 1
7 6
8 8
9 3
Mtodo shell
El mtodo de shell es una versin mejorada del mtodo de insercin directa y recibe ese
nombre en honor a su autor Donald L. Shell quien lo propuso en 1959. En el mtodo de
ordenacin Shell propone que las comparaciones entre elementos se efecten con saltos
de mayor tamao pero con incrementos se efecten con saltos de mayor tamao pero con
incrementos decrecientes, as los elementos quedarn ordenados en el arreglo.
Ejemplo:
Algoritmo:
Salto=Arreglo.longitud/2;
while (Salto>=1)
{
for (int Subarr = 0; Subarr < Salto; Subarr ++)
{
for (int i = Salto+Subarr ; i < Arreglo.Length; i += Salto)
{
int v = Arreglo[i];
int j = i - Salto;
while (j >= 0 && Arreglo[j] > v)
{
Arreglo[j + Salto] = Arreglo[j];
j-=Salto;
}
Arreglo[j + Salto] = v;
}
}
Salto /= 2;
}
Mtodo QuickSort
Es probablemente el ms utilizado de los algoritmos de ordenacin. Fue inventado por
C.A.R. Hoare en 1960 y desde entonces se han propuesto mejoras.
Es muy popular porque es relativamente fcil de implementar, ofrece buenos resultados
generales, en muchos casos consume menos recursos otros mtodo de ordenacin, y
est bien estudiado (ha sido expuesto a un minucioso anlisis matemtico que ha sido
corroborado con amplia experiencia prctica).
0 1 2 3 4 5 6 7 8 9
Arreglo 7 4 9 2 5 10 1 6 8 3
El algoritmo consta de los siguientes pasos:
1. Elegir un elemento de la lista de elementos a ordenar, al que llamaremos pivote.
2. Resituar los dems elementos de la lista a cada lado del pivote, de manera que a
un lado queden todos los menores que l, y al otro los mayores. Los elementos
iguales al pivote pueden ser colocados tanto a su derecha como a su izquierda,
dependiendo de la implementacin deseada. En este momento, el pivote ocupa
exactamente el lugar que le corresponder en la lista ordenada.
3. La lista queda separada en dos sublistas, una formada por los elementos a la
izquierda del pivote, y otra por los elementos a su derecha.
4. Repetir este proceso de forma recursiva para cada sublista mientras stas
contengan ms de un elemento. Una vez terminado este proceso todos los
elementos estarn ordenados.
Ejemplo:
Algoritmo:
//Recibe un vector de enteros y el ndice del primer y ltimo elemento
vlido del mismo
Quicksort(int[] Arreglo, int primero, int ultimo){
int i=primero, j=ultimo
int pivote=Arreglo[(primero + ultimo) / 2]
int auxiliar
Realiza {
Mientras(Arreglo[i] < pivote){ i++ }
Mientras(Arreglo[j] > pivote){ j-- }
0 1 2 3 4 5 6 7 8 9
Arreglo 7 4 9 2 5 10 1 6 8 3
Si (i<=j)
Arreglo[i] <-> Arreglo[j]
i++
j--
Fin_Si
} mientras (i<=j);
Si (primero<j) Quicksort(Arreglo,primero, j)
Si (ultimo>i) Quicksort(Arreglo,i, ultimo)
}
Mtodo Radix
El mtodo Radix es un algoritmo que ordena enteros procesando sus dgitos de forma
individual. Radix no est limitado slo a los enteros. La mayor parte de los mtodos de
ordenamiento representan internamente todos sus datos como representaciones
electrnicas de nmeros binarios, por lo que procesar los dgitos de las representaciones
de enteros por representaciones de grupos de dgitos binarios es lo ms conveniente.
Existen dos clasificaciones de radix: el de dgito menos significativo (LSD) y el de dgito
ms significativo (MSD). Radix sort LSD procesa las representaciones de enteros
empezando por el dgito menos significativo y movindose hacia el dgito ms
significativo. Radix sort MSD trabaja en sentido contrario.
radixSort(int[] arr){
int[][] np = new int[arr.length][2];
int[] q = new int[0x100];
int i,j,k,l,f = 0;
for(k=0;k<4;k++){
for(i=0;i<(np.length-1);i++)
np[i][1] = i+1;
np[i][1] = -1;
for(i=0;i<q.length;i++)
q[i] = -1;
for(f=i=0;i<arr.length;i++){
j = ((0xFF<<(k<<3))&arr[i])>>(k<<3);
if(q[j] == -1)
l = q[j] = f;
else{
l = q[j];
while(np[l][1] != -1)
l = np[l][1];
np[l][1] = f;
l = np[l][1];
}
f = np[f][1];
np[l][0] = arr[i];
np[l][1] = -1;
}
for(l=q[i=j=0];i<0x100;i++)
for(l=q[i];l!=-1;l=np[l][1])
arr[j++] = np[l][0];
}
}
Producto de Aprendizaje 4.1:
Elabore un programa en java que declare y cargue un arreglo de 10,000 elementos en
forma aleatoria, lo ordene mediante los mtodos:
- Burbuja
- Seleccin
- Shell
- Quicksort
- Radix
- Otro
Y determine que algoritmo es mejor en base al que realice menos intercambios.
4.2. Mtodos de bsqueda.
Bsqueda Secuencial:
La bsqueda secuencial es la tcnica ms simple para buscar un elemento en un arreglo.
Consiste en recorrer el arreglo elemento a elemento e ir comparando con el valor
buscado. Se empieza con la primera casilla del arreglo y se observa una casilla tras otra
hasta que se encuentra el elemento buscado o se han visto todas las casillas. El resultado
de la bsqueda es un solo valor, y ser la posicin del elemento buscado o cero (o menos
uno). Dado que el arreglo no est en ningn orden en particular, existe la misma
probabilidad de que el valor se encuentra ya sea en el primer elemento, como en el
ltimo. Por lo tanto, en promedio, el programa tendr que comparar el valor buscado con
la mitad de los elementos del arreglo.
El mtodo de bsqueda lineal funciona bien con arreglos pequeos o para arreglos no
ordenados.
Bsqueda Binaria
La bsqueda binaria es el mtodo ms eficiente para encontrar elementos en un arreglo
ordenado. El proceso comienza comparando el elemento central del arreglo con el valor
buscado. Si ambos coinciden finaliza la bsqueda. Si no ocurre as, el elemento buscado
ser mayor o menor en sentido estricto que el central del arreglo. Si el elemento buscado
es mayor se procede a hacer bsqueda binaria en el subarray superior, si el elemento
buscado es menor que el contenido de la casilla central, se debe cambiar el segmento a
considerar al segmento que est a la izquierda de tal sitio central.
Producto de Aprendizaje 4.2:
Elabore un programa en java que declare y cargue en forma aleatoria dos arreglos, el
primero de 10,000 elementos y el segundo de 1,000; y busque cada elemento del arreglo
de 1,000 en el arreglo de 10,000 mediante la bsqueda Secuencia, Binaria y mediante el
mtodo BinarySearch; y determine que mtodo es mejor en base al menor tiempo.
4.3. Recuperacin de datos.
Producto de Aprendizaje 4.3:
Investigar la recuperacin de datos debido a:
- Discos duros daados o destruidos
- Sistema de archivo daado o corrupto
- Borrado accidental
- Reformateo accidental
- Fallas en sistemas RAID
- Prdidas ocasionadas por Virus
- Desastres Naturales (Inundacin, fuego, rayos, etc.)