You are on page 1of 14

Estructura de Datos

Unidad 8 – Métodos de búsqueda
Métodos de Búsqueda
• El sentido de la ordenación de información, sea
interna o externa, es poder llegar a los datos
más rápidamente.
• Existen varios métodos de búsqueda:
– Secuencial
• Se recorre toda la estructura (arreglo, lista, archivo) hasta
encontrar el dato buscado
• Lenta pero segura, rápida de implementar
– Binaria
• Busca por la mitad hasta llegar al dato buscado o terminar la
estructura
– Hash
• Usa una función para obtener la posición donde está el dato
buscado
HASH
• Si la estructura donde está la información es
muy grande, una búsqueda binaria puede
resultar ineficiente
• La información generalmente tiene algo que la
identifica (número de control, RFC, número de
cliente, etc.) que se conoce como llave o clave
• A veces esa clave indica por sí misma la
posición dentro de la estructura (índice) pero no
siempre es posible
– No es uno a uno (número de control)
– La clave es alfanumérica (RFC)
HASH
Búsqueda 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");
• }

• }
Búsqueda 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");
• }
Búsqueda 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 (cont.)
• HASH = picar y mezclar (en inglés)
• La función HASH es una función de conversión
o localización o dispersión para transformar la
clave en un índice (posición dentro de la
estructura)
• Reduce un dominio amplio generando un
conjunto menor de valores
• A veces, una función genera el mismo valor
para dos claves diferentes (colisión) y se aplican
otros algoritmos para resolver esa situación
Ejemplo HASH
0 434343 Juan Pérez
… …
20 454545 Pedro López
21 H(434343) = 0
414141 Luis Luna

H(333333) = 587
587 333333 Ricardo Tapia
588 H(939393) = 999
333334 Peter Parker
589 333335 Tony Stark
… …
999 939393 Harry Osmond
Función 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 administración
– Asegurar tiempo óptimo para evitar retraso por
cálculo
• Usos
– Tablas de Hash= tablas de índices que agilizan el
proceso de búsqueda de información (bases de datos
sobre todo)
– Algoritmos de encriptación
Métodos para HASH
• Existen varios métodos para implementar una
función HASH
– Restas sucesivas
• Para claves numéricas donde existen huecos de tamaño
conocido (el número de control que inicia con el año, cada
por ejemplo)
• A la clave se le resta el “prefijo” y se le suma el máximo por
grupo*número de grupo (el primer grupo es 0)
• Por ejemplo, si máximo 2000 por año y se inició en 2000
– 001908 001908 – 000000 = 1908
– 021908 021908 – 020000 + 2000 = 1908+(2000*2) = 5908
– 070004 070004 – 070000 + 2000 = 4 + (2000*7) =14004
Métodos para HASH
– Aritmética modular
• Para claves numéricas; asegura un mínimo de
colisiones siempre que el rango del índice sea un
número primo
• En el caso de claves alfanuméricas se suma el
ASCII de cada carácter antes de realizar la
operación
• El índice equivale al residuo de dividir la clave
entre el tamaño del rango del índice
• Por ejemplo, rango de 11
– Clave 33 índice 0
– Clave 30 índice 8
Métodos para HASH (cont.)
– Mitad del cuadrado
• Se eleva al cuadrado la clave y se toma como
índice cierto número de dígitos siempre de las
mismas posiciones; la cantidad de dígitos a usar
depende del rango del índice
• Por ejemplo, tomar siempre los dígitos de las
posiciones 4, 2 y 0
– Clave = 38, el cuadrado es 1444
» Posición 4 = 0, posición 2 = 4, posición 0 = 4
» Índice = 044
– Clave = 97, el cuadrado es 9409
» Posición 4 = 0, posición2 = 4, posición 0 = 9
» Índice = 049
Manejo de colisiones
• Colisión = dos o más entradas producen la
misma salida
• Opciones
– Zona de excedentes o desbordamientos (búsqueda
secuencial)
– Generar otra dirección
• Direccionamiento abierto
– Exploración lineal x+1, x+2, x+3 …
– Exploración cuadrática x+1, x+4, x+9, …, x+i2
– Doble hash x+h2(), x+2h2(), x+3h2(), …
• Encadenamiento
Manejo de colisiones (cont.)
• Encadenamiento
– Semejante a la estructura usada en radixsort
– Vector con tantas posiciones como posibles valores
pueda generar la función hash
– Cada posición del vector tiene una lista enlazada
– Cada registro se agrega al vector
– Es más fácil de controlar las colisiones, pero requiere
una estructura auxiliar para guardar el vector en caso de
archivos
• Compartimentos