Sie sind auf Seite 1von 13

WW

Mtodo de Bsqueda Secuencial:



Se utiliza cuando el vector no est ordenado o no puede ser ordenado previamente.
Consiste en buscar el elemento comparndolo secuencialmente (de ah su nombre) con
cada elemento del arreglo hasta encontrarlo, o hasta que se llegue al final. La existencia
eese puede asegurar cuando el elemento es localizado, pero no podemos asegurar la no
existencia hasta no haber analizado todos los elementos del arreglo.
Arreglo: Es una zona de almacenamiento continuo, que contiene una serie de elementos
del mismo tipo.
Para efectos de sta explicacin visualice el arreglo como una serie de cajas unidas
donde podemos almacenar datos del mismo tipo, los arreglos estn indexados con una
serie de nmeros de van de menor a mayor y que sirven para hacer referencia a cada uno
de las cajas dentro del arreglo, en java esta indices comienzan en 0.



Los arreglos y en general las estructuras de datos nos permiten almacenar informacin o
datos, pero ahora nos seria de utilidad hallar la forma de encontrar los datos que
almacenamos en las mismas, para tal fin se han diseados algoritmo de bsquedas.
Como el titulo lo sugiere trataremos el mtodo de bsqueda secuencial.
Los dos elementos fundamentales a tener en cuentas son: un arreglo con datos objeto de
la bsqueda y un elemento o criterio de bsqueda.
El mtodo de bsqueda secuencial consiste en ir comparando el elemento o criterio
de bsqueda con cada uno de los elementos en el arreglo, esto se hace recorriendo el
arreglo y detenindose en cada elemento y hacer la comparacin, en caso de ser
verdadera la comparacin, guardar la posicin el elemento o dato.







Cdigo Java:
public int busquedaSecuencial(int []arreglo,int dato){
int posicion = -1;
for(int i = 0; i < arreglo.length; i++){//recorremos todo el arreglo
if(arreglo[i] == dato){//comparamos el elemento en el arreglo con el buscado
posicion = i;//Si es verdadero guardamos la posicion
break;//Para el ciclo
}
}
return posicion;
}

Bsqueda dicotmica (binaria)
Se utiliza cuando el vector en el que queremos determinar la existencia de un elemento
est previamente ordenado. Este algoritmo reduce el tiempo de bsqueda
considerablemente, ya que disminuye exponencialmente el nmero de iteraciones
necesarias.
Est altamente recomendado para buscar en arrays de gran tamao. Por ejemplo, en uno
conteniendo 50.000.000 elementos, realiza como mximo 26 comparaciones (en el peor
de los casos).
Para implementar este algoritmo se compara el elemento a buscar con un elemento
cualquiera del array (normalmente el elemento central): si el valor de ste es mayor que el
del elemento buscado se repite el procedimiento en la parte del array que va desde el
inicio de ste hasta el elemento tomado, en caso contrario se toma la parte del array que
va desde el elemento tomado hasta el final. De esta manera obtenemos intervalos cada
vez ms pequeos, hasta que se obtenga un intervalo indivisible. Si el elemento no se
encuentra dentro de este ltimo entonces se deduce que el elemento buscado no se
encuentra en todo el array.


Antes de iniciar con la explicacin hagamos un ejercicio mental, imaginemos que un
amigo desea que adivinemos un nmero que tiene en un papel anotado y que solo l
conoce, antes que empecemos nos advierte que el nmero est comprendido del 0 al
100, y por ltimo por cada intento que hagamos el nos dir si el nmero es mayor, menor
o igual al nmero que tiene anotado en el papel.

Digamos que el nmero secreto a adivinar es el 81.
Bueno si eres sistemtico empezaras intentando con el 50.
[1,2,3,.......,58,59,50,51,52,.......,98,99,100]
Tu amigo te dir que el nmero que deseas adivinar es mayor que 50.
A ste punto ya debes deducir que el nmero est entre el 51 y el 100.
Observa como ya no tienes que gastar intentos con los nmeros comprendidos de 0 a 50.

Ahora intentemos con el 75.
[51,52,53,.......,73,74,75,76,77,.......,98,99,100]
Tu amigo te dir que el nmero que deseas adivinar es mayor que el 75.
A ste punto ya debes deducir que el nmero est entre el 76 y el 100.
Observa como ya no tienes que gastar intentos con los nmeros comprendidos de 0 a 75.

Ahora intentemos con el 87.
[76,77,78,.......,85,86,87,88,89,.......,98,99,100]
Tu amigo te dir que el nmero que deseas adivinar es menor que el 87.
A ste punto ya debes deducir que el nmero est entre el 76 y el 86.
Observa como ya no tienes que gastar intentos con los nmeros comprendidos de 0 a 75
y 87 a 100.

Ahora intentemos con el 81.
[76,77,78,79,80,81,82,83,84,85,86]
Tu amigo te dir que has acertado.













Cdigo Java:
Un pequeo juego de azar.
import java.util.Scanner;
public class JuegoAzar{
public static void main(String args[]){
Scanner in = new Scanner(System.in);
int numero;
int valor;
int contador=0;
boolean ganar=false;
System.out.println("--------------------------------------");
System.out.println("| Bienvenido al juego |");
System.out.println("--------------------------------------");
numero=1+(int)(Math.random()*100);
System.out.println("En estos momentos se ha generado un numero comprendido entre-
\n"+
"1 y 100, que usted debe adivinar");
System.out.println("--------------------------------------");
do{//este ciclo es tambien llamado repeat en otros lenguajes
contador++;
System.out.print("-Digite el numero ");
valor = in.nextInt();//capturamos en numero digitado
if(valor==numero){
System.out.println("Felicitaciones, GANASTES con "+contador+" intentos");
ganar=true;
}else{
String temp="";
if(numero>valor){
temp="mayor";
}else{
temp="menor";
}
System.out.println("El numero que intentas adivinar es "+temp+" que "+valor);
}
}while(contador<6 && ganar==false);//cerramos el ciclo 'do'
//'contador<6' representa el numero de oportunidades del jugador
if(ganar==false){
System.out.println("Lo siento, no has adivinado, el numero era el "+numero);
}
}
}






Arboles AVL

Un rbol AVL (llamado as por las iniciales de sus inventores: Adelson-Velskii y Landis) es
un rbol binario de bsqueda en el que para cada nodo, las alturas de sus subrboles
izquierdo y derecho no difieren en ms de 1.
No se trata de rboles perfectamente equilibrados, pero s son lo suficientemente
equilibrados como para que su comportamiento sea lo bastante bueno como para usarlos
donde los ABB no garantizan tiempos de bsqueda ptimos.
El algoritmo para mantener un rbol AVL equilibrado se basa en reequilibrados locales, de
modo que no es necesario explorar todo el rbol despus de cada insercin o borrado.
Ejemplo:
P11.1. Para el siguiente rbol AVL

a) Indique los factores de balance de cada nodo.
b) Dibujar el rbol AVL, despus de la insercin de un nodo con valor 2. Qu
operaciones se
efectan?.
c) Habiendo ya insertado el nodo con valor 2, dibujar el rbol AVL, despus de la
insercin de
un nodo con valor 6. Qu operaciones se efectan?.
Solucin.
a) Los factores de balance:





b) Luego de insertar el 2, no queda AVL. Con una rotacin simple a la derecha, se
reestablece
la propiedad AVL.


c) La insercin del 6, no requiere rotaciones para mantener la propiedad AVL.

Cdigo Java:
public class Nodo {
int numMat;
Nodo izqda, drcha;
public Nodo(int mat){
numMat = mat;
izqda = drcha = null;
}
public void re_enorden(){
if(izqda != null)
izqda.re_enorden();
System.out.println("Matricula: " +numMat);
if(drcha != null)
drcha.re_enorden();
}
}

public class ABB {
private Nodo raz;
public ABB(){
raz = null;
}
public void insertar(int nuevoM){
if(raz==null){
raz = new Nodo(nuevoM);
}
else{
insertar(raz,nuevoM);
}
}
private void insertar(Nodo rz, int nm){
if (rz == null)
rz = new Nodo(nm);
else if(nm < rz.numMat)
insertar(rz.izqda,nm);
else if(nm > rz.numMat)
insertar(rz.drcha,nm);
else
System.out.println("Numero Duplicados");
}
public void visualizar(){
if(raz!=null)
raz.re_enorden();
}
}

public class Ejecutar {
public static void main(String []args){
ABB rbol = new ABB();
rbol.insertar(6);
rbol.insertar(3);
rbol.insertar(7);
rbol.visualizar();
}
}












Arboles ABB:

Se trata de rboles de orden 2 en los que se cumple que para cada nodo, el valor de la
clave de la raz del subrbol izquierdo es menor que el valor de la clave del nodo y que el
valor de la clave raz del subrbol derecho es mayor que el valor de la clave del nodo.
Operaciones en ABB
El repertorio de operaciones que se pueden realizar sobre un ABB es parecido al que
realizbamos sobre otras estructuras de datos, ms alguna otra propia de rboles:
Buscar un elemento.
Insertar un elemento.
Borrar un elemento.
Movimientos a travs del rbol:
Izquierda.
Derecha.
Raiz.
Informacin:
Comprobar si un rbol est vaco.
Calcular el nmero de nodos.
Comprobar si el nodo es hoja.
Calcular la altura de un nodo.
Calcular la altura de un rbol.







Este es un caso algo complejo, tenemos que tomar el hijo derecho del Nodo que
queremos eliminar y recorrer hasta el hijo ms a la izquierda ( hijo izquierdo y si este
tiene hijo izquierdo repetir hasta llegar al ltimo nodo a la izquierda), reemplazamos el
valor del nodo que queremos eliminar por el nodo que encontramos ( el hijo ms a la
izquierda ), el nodo que encontramos por ser el ms a la izquierda es imposible que
tenga nodos a su izquierda pero si que es posible que tenga un subrbol a la derecha,
para terminar solo nos queda proceder a eliminar este nodo de las formas que conocemos
( caso 1, caso 2 ) y tendremos la eliminacin completa.




Cdigo Java:

public boolean removeNodo( Nodo nodo ) {

/* Creamos variables para saber si tiene hijos izquierdo y derecho */
boolean tieneNodoDerecha = nodo.getHojaDerecha() != null ? true : false;
boolean tieneNodoIzquierda = nodo.getHojaIzquierda() != null ? true : false;

/* Verificamos los 3 casos diferentes y llamamos a la funcin correspondiente */

/* Caso 1: No tiene hijos */
if (!tieneNodoDerecha && !tieneNodoIzquierda) {
return removeNodoCaso1( nodo );
}

/* Caso 2: Tiene un hijo y el otro no */
if ( tieneNodoDerecha && !tieneNodoIzquierda ) {
return removeNodoCaso2( nodo );
}

/* Caso 2: Tiene un hijo y el otro no */
if ( !tieneNodoDerecha && tieneNodoIzquierda ) {
return removeNodoCaso2( nodo );
}

/* Caso 3: Tiene ambos hijos */
if ( tieneNodoDerecha && tieneNodoIzquierda ) {
return removeNodoCaso3( nodo );
}

return false;
}

Das könnte Ihnen auch gefallen