Estructuras en Java

Anuncio
Construcción de Software II
Guía 26 – Estructuras en Java
150
REPRESENTACION GRAFICA DE ESTRUCTURAS PILA
Observe
Pilas
LI
FO
REPRESENTACION GRAFICA DE ESTRUCTURAS COLA
Colas
FI
FO
LIFO == Last In First Out == Ultimo en entrar – Primero en salir
FIFO == First In First Out == Primero en entrar – Primero en salir
www.dariolara.com
Guía 26 – Estructuras en Java
Construcción de Software II
143
Estructuras en Java
Introducción
Los tipos de estructuras mas conocidos son Listas, Pilas y Colas y obedecen al
manejo que se dan a las estructuras ordenadas llamadas arreglos (Array)
Recursividad
Ordenacion
Busquedas
Listas
Pilas
Colas
Recursividad
Se dice que algo es recursivo si se define en función de sí mismo o a sí mismo.
También se dice que nunca se debe incluir la misma palabra en la definición de
ésta. El caso es que las definiciones recursivas aparecen con frecuencia en
matemáticas, e incluso en la vida real.
Ejemplo
Basta con apuntar una cámara al monitor que muestra la imagen que muestra esa
cámara.
Práctica 143
Dado un array constituido de números enteros y que contiene N elementos
siendo N >= 1, devolver el elemento mayor.
int mayor(int numeros[], int posicion) {
int aux;
if (posicion == 0)
return numeros[posicion];
else {
aux = mayor(numeros, posicion-1);
if (numeros[posicion] > aux)
return numeros[posicion];
else
return aux;
} }
...
int numeros[5] = {2,4,1,-3,-1};
int N = 5;
printf("%d\n", mayor(numeros, 4));
Ordenación
Su finalidad es organizar ciertos datos (normalmente arrays o ficheros) en un orden
creciente o decreciente mediante una regla prefijada (numérica, alfabética)
Ordenación interna Los datos se encuentran en memoria (ya sean arrays, listas, etc) y
son de acceso aleatorio o directo (se puede acceder a un determinado campo sin
pasar por los anteriores).
Ordenación externa Los datos están en un dispositivo de almacenamiento externo
(ficheros) y su ordenación es más lenta que la interna.
www.dariolara.com
Construcción de Software II
Guía 26 – Estructuras en Java
144
Los principales algoritmos de ordenación interna son:
Selección
Este método consiste en buscar el elemento más pequeño del array y ponerlo
en primera posición; luego, entre los restantes, se busca el elemento más
pequeño y se coloca en segudo lugar, y así sucesivamente hasta colocar el
último elemento.
Práctica 144
int array[N];
int i,j,menor,aux; // Dar valores a los elementos del array
for(i=0;i<N-1;i++) {
for(j=i+1,menor=i;j<N;j++)
if(array[j]<array[menor]) // Si el elemento j es menor que el menor:
menor=j; // el menor pasa a ser el elemento j.
aux=array[i]; // Se intercambian los elementos
array[i]=array[menor]; // de las posiciones i y menor
array[menor]=aux; // usando una variable auxiliar. }
Metodo de la Burbuja
Consiste en comparar pares de elementos adyacentes e intercambiarlos entre
sí hasta que estén todos ordenados. Con el array anterior, {40,21,4,9,10,35}:
Primera pasada:
{21,40,4,9,10,35} <-- Se cambia el 21 por el 40.
{21,4,40,9,10,35} <-- Se cambia el 40 por el 4.
{21,4,9,40,10,35} <-- Se cambia el 9 por el 40.
{21,4,9,10,40,35} <-- Se cambia el 40 por el 10.
{21,4,9,10,35,40} <-- Se cambia el 35 por el 40.
Segunda pasada:
{4,21,9,10,35,40} <-- Se cambia el 21 por el 4.
{4,9,21,10,35,40} <-- Se cambia el 9 por el 21.
{4,9,10,21,35,40} <-- Se cambia el 21 por el 10.
Ya están ordenados, pero para comprobarlo habría que acabar esta segunda
comprobación y hacer una tercera.
Práctica 145
int array[N];
int i,j,aux;
// Dar valores a los elementos del array
for(i=0;i<N-1;i++) // Hacer N-1 pasadas.
{ for(j=0;j<N-i-1;j++) // Mirar los N-i-1 pares.
{ if(array[j+1]<array[j]) // Si el elemento j+1 es menor que el
elemento j:
{
aux=array[j+1]; // Se intercambian los elementos
array[j+1]=array[j]; // de las posiciones j y j+1
array[j]=aux; // usando una variable auxiliar.
}
} }
www.dariolara.com
Guía 26 – Estructuras en Java
Construcción de Software II
149
Práctica 150
ListaMult.java
/**
* @(#)ListaMult.java
*
*
* @author dario lara
* @version 1.00 2007/10/19
*/
import java.awt.*;
import java.applet.Applet;
public class ListaMult extends Applet {
List lm = new List( 6,true );
public void init() {
Button boton = new Button( "Aceptar" );
lm.addItem( "Mercurio" );
lm.addItem( "Venus" );
lm.addItem( "Tierra" );
lm.addItem( "Marte" );
lm.addItem( "Jupiter" );
lm.addItem( "Saturno" );
lm.addItem( "Neptuno" );
lm.addItem( "Urano" );
lm.addItem( "Pluton" );
add( lm );
add( boton );
}
public boolean action( Event evt,Object obj ) {
if( evt.target instanceof Button )
{
if( "Aceptar".equals( obj ) )
{
String seleccion[];
seleccion = lm.getSelectedItems();
for( int i=0; i < seleccion.length; i++ )
System.out.println( seleccion[i] );
}
}
return true;
}
}
www.dariolara.com
Construcción de Software II
148
Práctica 148
Guía 26 – Estructuras en Java
Lista.java
/**
* @(#)Lista.java
* @author dario lara
* @version 1.00 2007/10/19
*/
import java.awt.*;
import java.applet.Applet;
public class Lista extends Applet {
public void init() {
List l = new List( 4,false );
l.addItem( "Mercurio" );
l.addItem( "Venus" );
l.addItem( "Tierra" );
l.addItem( "Marte" );
l.addItem( "Jupiter" );
l.addItem( "Saturno" );
l.addItem( "Neptuno" );
l.addItem( "Urano" );
l.addItem( "Pluton" );
add( l );
}
public boolean action( Event evt,Object obj ) {
if( evt.target instanceof List )
System.out.println( "Entrada de la Lista: " + obj );
return true;
}
}
Práctica 149
Lista.html
<HTML>
<APPLET
CODE="Lista.class"
WIDTH="500"
HEIGHT="500">
</APPLET>
</HTML>
En el applet siguiente, ListaMult.java, se permite al usuario seleccionar varios elementos
de los que constituyen la lista.
www.dariolara.com
Guía 26 – Estructuras en Java
Construcción de Software II
145
Busquedas
Cuestiones generales
La búsqueda de un elemento dentro de un array es una de las operaciones más
importantes en el procesamiento de la información, y permite la recuperación
de datos previamente almacenados. El tipo de búsqueda se puede clasificar
como interna o externa, según el lugar en el que esté almacenada la
información (en memoria o en dispositivos externos). Todos los algoritmos de
búsqueda tienen dos finalidades:

Determinar si el elemento buscado se encuentra en el conjunto en el que
se busca.

- Si el elemento está en el conjunto, hallar la posición en la que se
encuentra.
En este apartado nos centramos en la búsqueda interna. Como principales
algoritmos de búsqueda en arrays tenemos la búsqueda secuencial, la binaria y
la búsqueda utilizando tablas de hash.
Búsqueda secuencial
Consiste en recorrer y examinar cada uno de los elementos del array hasta
encontrar el o los elementos buscados, o hasta que se han mirado todos los
elementos del array.
Práctica 146
for(i=j=0;i<N;i++)
if(array[i]==elemento) {
solucion[j]=i;
j++; }
Este algoritmo se puede optimizar cuando el array está ordenado, en cuyo
caso la condición de salida cambiaría a:
for(i=j=0;array[i]<=elemento;i++)
o cuando sólo interesa conocer la primera ocurrencia del elemento en el array:
for(i=0;i<N;i++)
if(array[i]==elemento)
break;
En este último caso, cuando sólo interesa la primera posición, se puede utilizar
un centinela, esto es, dar a la posición siguiente al último elemento de array el
valor del elemento, para estar seguro de que se encuentra el elemento, y no
tener que comprobar a cada paso si seguimos buscando dentro de los límites
del array:
array[N]=elemento;
for(i=0;;i++)
if(array[i]==elemento)
break;
Si al acabar el bucle, i vale N es que no se encontraba el elemento. El número
medio de comparaciones que hay que hacer antes de encontrar el elemento
buscado es de (N+1)/2.
www.dariolara.com
Construcción de Software II
Guía 26 – Estructuras en Java
146
Búsqueda binaria o dicotómica
Para utilizar este algoritmo, el array debe estar ordenado. La búsqueda binaria
consiste en dividir el array por su elemento medio en dos subarrays más
pequeños, y comparar el elemento con el del centro. Si coinciden, la búsqueda
se termina. Si el elemento es menor, debe estar (si está) en el primer subarray,
y si es mayor está en el segundo. Ej: buscar el elemento 3 en el array
{1,2,3,4,5,6,7,8,9} se realizarían los siguientes pasos:
Se toma el elemento central y se divide el array en dos:
{1,2,3,4}-5-{6,7,8,9}
Como el elemento buscado (3) es menor que el central (5), debe
estar en el primer subarray: {1,2,3,4}
Se vuelve a dividir el array en dos:
{1}-2-{3,4}
Como el elemento buscado es mayor que el central, debe estar en el
segundo subarray: {3,4}
Se vuelve a dividir en dos:
{}-3-{4}
El elemento buscado coincide con el central, lo hemos encontrado.
Si al final de la búsqueda todavía no lo hemos encontrado, y el subarray a
dividir está vacio {}, el elemento no se encuentra en el array.
Práctica 147
int desde,hasta,medio,elemento,posicion;
// desde y
// hasta indican los límites del array que se está mirando.
int array[N];
// Dar valor a elemento.
for(desde=0,hasta=N-1;desde<=hasta;) {
if(desde==hasta) // si el array sólo tiene un elemento:
{
if(array[desde]==elemento) // si es la solución:
posicion=desde; // darle el valor.
else // si no es el valor:
posicion=-1; // no está en el array.
break; // Salir del bucle.
}
medio=(desde+hasta)/2; // Divide el array en dos.
if(array[medio]==elemento) // Si coincide con el central:
{
posicion=medio; // ese es la solución
break; // y sale del bucle.
}
else if(array[medio]>elemento) // si es menor:
hasta=medio-1; // elige el array izquierda.
else // y si es mayor:
desde=medio+1; // elige el array de la derecha. }
www.dariolara.com
Guía 26 – Estructuras en Java
Construcción de Software II
147
Listas
Las listas (List) aparecen en los interfaces de usuario para facilitar a los
operadores la manipulación de muchos elementos. Se crean utilizando
métodos similares a los de los botones
La lista es visible todo el tiempo, utilizándose una barra de desplazamiento
para visualizar los elementos que no caben en el área que aparece en la
pantalla.
El ejemplo siguiente, Lista.java, crea una lista que muestra cuatro líneas a la
vez y no permite selección múltiple
Lo compilamos para generar la clase bytecode Lista.class pero un applet se
ejecuta por medio de un codigo .html que lo llama con la instrucción CODE y
con un navegador como Internet Explorer.
Lista (estructura de datos)
La forma más simple de estructura dinámica es la lista enlazada (lista abierta o
lista ligada). En esta forma los nodos se organizan de modo que cada uno
apunta al siguiente, y el último no apunta a nada, el puntero del nodo
siguiente del último nodo toma el valor nulo (NULL).
En las listas abiertas existe un nodo especial: el primero. Esa referencia al
primer nodo es muy importante ya que mediante ella podemos acceder a toda
la lista.
Mediante asignación dinámica de memoria podemos hacer que la lista varíe de
tamaño, aumentando o disminuyendo, según las necesidades del programa
que la utilice con la única restricción de que haya memoria disponible.
Inicialmente, cuando una lista aún no dispone de ningún nodo, o cuando se
borran todos los nodos de los que dispone, diremos que la lista esta vacía, en
ese caso la referencia al primer nodo tendrá un valor nulo (puntero a NULL).
Tipos de listas
Lista lineal: En la cual el último nodo apunta a NULL.
Lista circular: El último nodo apunta al primero.
Lista doblemente enlazada: Los nodos, aparte de tener un nodo
siguiente, tiene un nodo llamado anterior el cual apunta al anterior
nodo.
www.dariolara.com
Descargar