Mtodos de Bsqueda El sentido de la ordenacin de informacin, sea interna o externa, es poder llegar a los datos ms rpidamente. Existen varios mtodos de bsqueda: Secuencial Se recorre toda la estructura (arreglo, lista, archivo) hasta encontrar el dato buscado Lenta pero segura, rpida de implementar Binaria Busca por la mitad hasta llegar al dato buscado o terminar la estructura Hash Usa una funcin para obtener la posicin donde est el dato buscado Bsqueda secuencial
public static void Buscar(int v[]){ int valor=Integer.parseInt(JOptionPane.showInputDialog("Valor a buscar:")); int i=0; boolean bandera=false; while(i<v.length&&!bandera){ if(v[i]==valor){ System.out.println(); System.out.println("El valor "+valor+" fue encontrado en la posicion "+i); bandera=true; } i++; } if(!bandera){ System.out.println(); System.out.println(" El valor no se encuentra en el Arreglo"); }
} Bsqueda secuencial en vector ordenado public static void Buscar(int v[]){ int valor=Integer.parseInt(JOptionPane.showInputDialog("Valor que desea buscar: ")); int i=0; while(i<v.length&&valor>v[i]) i++; System.out.println(); if(i<v.length&&v[i]==valor) System.out.println("El valor "+valor+" fue encontrado en la posicion "+i); else System.out.println("SECUENCIAL ORDENADO: El valor no se encuentra en el Arreglo"); } Bsqueda binaria public static void binaria(int v[]){ int val=Integer.parseInt(JOptionPane.showInputDialog("Valor que desea Buscar")); int i=0,j=v.length-1,m=0; boolean ban=true; while(i<=j&&ban){ m=(i+j)/2; if(val==v[m]){ ban=false; } else{ if(val<v[m]) j=m-1; else i=m+1; } } System.out.println(); if(!ban) System.out.println("BINARIA: El valor "+val+" fue encontrado en la posicion "+m); else System.out.println("BINARIA: El valor No fue encontrado en el Vector"); } HASH Si la estructura donde est la informacin es muy grande, una bsqueda binaria puede resultar ineficiente La informacin generalmente tiene algo que la identifica (nmero de control, RFC, nmero de cliente, etc.) que se conoce como llave o clave A veces esa clave indica por s misma la posicin dentro de la estructura (ndice) pero no siempre es posible No es uno a uno (nmero de control) La clave es alfanumrica (RFC) HASH HASH (cont.) HASH = picar y mezclar (en ingls) La funcin HASH es una funcin de conversin o localizacin o dispersin para transformar la clave en un ndice (posicin dentro de la estructura) Reduce un dominio amplio generando un conjunto menor de valores A veces, una funcin genera el mismo valor para dos claves diferentes (colisin) y se aplican otros algoritmos para resolver esa situacin Ejemplo HASH 0 434343 Juan Prez
20 454545 Pedro Lpez 21 414141 Luis Luna
587 333333 Ricardo Tapia 588 333334 Peter Parker 589 333335 Tony Stark
999 939393 Harry Osmond H(434343) = 0
H(333333) = 587
H(939393) = 999 Funcin HASH Se espera que cumpla con: Destribuir las claves uniformemente, generando pocas colisiones Manejo simple de colisiones, tal que no aumente significativamente el tiempo medio de administracin Asegurar tiempo ptimo para evitar retraso por clculo Usos Tablas de Hash= tablas de ndices que agilizan el proceso de bsqueda de informacin (bases de datos sobre todo) Algoritmos de encriptacin Mtodos para HASH Existen varios mtodos para implementar una funcin HASH Restas sucesivas: esta funcin se emplea con claves numricas entre las que existen huecos de tamao conocido, obtenindose direcciones consecutivas. Por ejemplo, si el nmero de expediente de un alumno universitario est formado por el ao de entrada en la universidad, seguido de un nmero identificativo de tres cifras, y suponiendo que entran un mximo de 400 alumnos al ao, se le asignaran las claves: 1998-000 --> 0 = 1998000-1998000 1998-001 --> 1 = 1998001-1998000 1998-002 --> 2 = 1998002-1998000 ... 1998-399 --> 399 = 1998399-1998000
... yyyy-nnn --> N = yyyynnn-1998000+(400*(yyyy-1998))
Mtodos para HASH Aritmtica modular Para claves numricas; asegura un mnimo de colisiones siempre que el rango del ndice sea un nmero primo En el caso de claves alfanumricas se suma el ASCII de cada carcter antes de realizar la operacin El ndice equivale al residuo de dividir la clave entre el tamao del rango del ndice Por ejemplo, rango de 11 Clave 33 ndice 0 Clave 30 ndice 8 Mtodos para HASH (cont.) Mitad del cuadrado Se eleva al cuadrado la clave y se toma como ndice cierto nmero de dgitos siempre de las mismas posiciones; la cantidad de dgitos a usar depende del rango del ndice Por ejemplo, tomar siempre los dgitos de las posiciones 4, 2 y 0 Clave = 38, el cuadrado es 1444 Posicin 4 = 0, posicin 2 = 4, posicin 0 = 4 ndice = 044 Clave = 97, el cuadrado es 9409 Posicin 4 = 0, posicin2 = 4, posicin 0 = 9 ndice = 049 Manejo de colisiones Colisin = dos o ms entradas producen la misma salida Opciones Zona de excedentes o desbordamientos (bsqueda secuencial) Generar otra direccin Direccionamiento abierto Exploracin lineal x+1, x+2, x+3 Exploracin cuadrtica x+1, x+4, x+9, , x+i 2 Doble hash x+h 2 (), x+2h 2 (), x+3h 2 (),
Manejo de colisiones (cont.) Encadenamiento Semejante a la estructura usada en radixsort Vector con tantas posiciones como posibles valores pueda generar la funcin hash Cada posicin del vector tiene una lista enlazada Cada registro se agrega al vector Es ms fcil de controlar las colisiones, pero requiere una estructura auxiliar para guardar el vector en caso de archivos Compartimentos Se almacenan varios elementos en la misma direccin