Está en la página 1de 30

Algoritmos y Estructura

de Datos

Razón social
00.00.2015
Logro de la sesión

Al finalizar la unidad, el estudiante


desarrollará algoritmos utilizando métodos
de búsqueda con JAVA.

2
Agenda

• Búsqueda
• Búsqueda Lineal o Secuencial
• Búsqueda Binaria
• Búsqueda por Transformación de claves o hash
• Búsqueda Indexada

3
Búsqueda
• Es un problema fundamental en las ciencias de la
computación y programación.
• Múltiples algoritmos para resolver el mismo
problema: ¿Cómo sabemos qué algoritmo es
"mejor"?
• Los ejemplos usarán arreglos de números enteros
para ilustrar los algoritmos.

4
Búsqueda

5
Búsqueda
• Dada una lista de datos, encuentre la ubicación de un valor
particular o informe que ese valor no está presente

6
Búsqueda Lineal o Secuencial
• Búsqueda lineal o secuencial
– Enfoque intuitivo
– Comenzar en el primer elemento ¿es el que estoy buscando?
– Si no pasa al siguiente elemento, repita hasta que se encuentre o
todos los elementos verificados
• Si los elementos no están ordenados o no se pueden ordenar,
este enfoque es necesario

7
Búsqueda Lineal o Secuencial
/* devuelve el índice de la primera aparición del objetivo en la lista o -1 si
el objetivo no está presente en lista */
public int BusquedaLineal(int[] lista, int objetivo) {
for(int i = 0; i < lista.length; i++)
if( lista[i] == objetivo )
return i;
return -1;
}
Solución genérica
/* devuelve el índice de la primera aparición del objetivo en la lista o -1 si el
objetivo no está presente en lista*/

public int BusquedaLineal(Object[] lista, Object objetivo) {


for(int i = 0; i < lista.length; i++)
if( lista[i] != null && lista[i].equals(objetivo) )
return i;
return -1;
} 8
Búsqueda Lineal – Lista desordenada y ordenada
boolean BusquedaLinealDesordenada(int[] arr, int tamanio, int objetivo) {
for(int i = 0 ; i < tamanio ; i++)
{
if(objetivo == arr[i] )
return true;
}
return false;
}

Lista ordenada
boolean BusquedaLinealOrdenada(int[] arr, int tamanio, int objetivo) {
for(int i = 0 ; i < tamanio ; i++){
if(objetivo == arr[i] )
return true;
else if( objetivo < arr[i] )
return false;}
return false;
}
9
Búsqueda Lineal o Secuencial con recursividad
Ejercicios
Crear un Algoritmo recursivo en Java que busque de forma
secuencial un elemento en un arreglo desordenado
Hacer lo mismo para un arreglo ordenado
Utilizar los siguientes Pseudocódigos

10
Búsqueda Lineal – Análisis de Complejidad
La complejidad de la búsqueda secuencial diferencia entre el comportamiento en el peor y mejor caso. El
mejor caso se encuentra cuando aparece una coincidencia en el primer elemento de la lista, por lo que el
tiempo de ejecución es O(1). El peor caso se produce cuando el elemento no está en la lista o se encuentra
al final de ella. Esto requiere buscar en todos los n términos, lo que implica una complejidad de O(n).

Rendimiento en el peor caso O(n)


Rendimiento en el mejor caso O(1)
Rendimiento en el caso promedio O(n) 11
Búsqueda Binaria
Escribir el algoritmo de búsqueda binaria en Java
Escribiremos en Java el método busqueda_binaria que toma Al principio, este es todo el arreglo
un arreglo ordenado (lista) y el elemento a buscar
menor = 0
(elemento). Si el elemento está en el arreglo, el método
retorna su posición. Harás un seguimiento de qué parte mayor = lista.length - 1
de la matriz o arreglo tienes que buscar.

medio debe ser redondeado si


Cada intento de búsqueda escogería el elemento ubicado en la medio = (menor+mayor)/2 (menor+mayor) no es un número par
mitad del arreglo y se haría hasta que se haya reducido la estimado = lista[medio]
búsqueda a un solo elemento:

Si el número encontrado es muy bajo, actualiza la variable if (estimado < elemento){


menor, para intentar ahora con un arreglo reducido: menor = medio + 1
}

Si el número encontrado es muy alto, actualiza la variable if (estimado > elemento){


mayor, para intentar ahora con un arreglo reducido: mayor = medio - 1
}

12
Codificación de la Búsqueda Binaria
El algoritmo de búsqueda binaria en Java

13
Busqueda Binaria recursiva en Java

14
Búsqueda Binaria con Bandera
Ejercicios
Crear un Algoritmo en Java que busque de forma binaria un
elemento en un arreglo ordenado Utilizar el siguiente Pseudocódigo

Se busca X=615

15
Búsqueda Binaria – Análisis de Complejidad
El mejor caso se presenta cuando una coincidencia se encuentra en el punto central de la lista. En este
caso, la complejidad es O(1), dado que sólo se realiza una prueba de comparación de igualdad. La complejidad
del peor caso es O(log2n), que se produce cuando el elemento no está en la lista o el elemento se encuentra
en la última comparación.

Rendimiento en el peor caso O(Log n)


Rendimiento en el mejor caso O(1)
16
Búsqueda por Transformación de claves o hash
Este método permite aumentar la velocidad de búsqueda sin necesidad de tener los elementos ordenados,
cuenta con la ventaja de que el tiempo de búsqueda es independiente del número de componentes del arreglo:

Ejemplo simple
Supongamos que estamos usando nombres como nuestra clave:
❖ Toma la tercera letra del nombre, toma el valor int de la letra (a = 0, b = 1,
...), divide entre 6 y toma el resto
❖ ¿Qué numero esconde el nombre “Bellers”?
✓ l -> 11 -> 11% 6 = 5 • Esta es una función hash imperfecta. Una función hash
• Mike = (10% 6) = 4 perfecta produce una asignación uno a uno de las
claves a los valores hash. En este caso para Kelly y
• Kelly = (11% 6) = 5 Margaret se genera una “colisión”
• Olivia = (8% 6) = 2 • ¿Cuál es el número máximo de valores que esta función
• Isabelle = (0% 6) = 0 puede combinar perfectamente?
• David = (21% 6) = 3
• Margaret = (17% 6) = 5 (uh oh)
• Wendy = (13% 6) = 1

17
Más sobre funciones hash o de dispersión
Normalmente una función hash o de dispersión es un proceso de dos pasos:
- Transforma la clave (que puede no ser un número entero) en un valor entero
- Asigna el entero resultante en un índice válido para la tabla hash o tabla de dispersión (donde se
almacenan todos los elementos)

Para facilitar la búsqueda, una


función hash debe generar posiciones
diferentes dadas dos claves
diferentes. Si esto último no ocurre
(H(K1)=d,H(K2)=d y K1!=K2) se produce
una colisión.
Entonces una función hash debe ser
fácil de calcular y distribuir
uniformemente las claves y debe
evitar las colisiones. Si éstas se
presentan se contará con algún
método que genere posiciones
alternativas.

• Las funciones hash pueden basarse en una serie de técnicas, entre las más
utilizadas tenemos: función hash por módulo, función hash cuadrado, función hash por
plegamiento, función hash por truncamiento. 18
Búsqueda por Transformación de claves o hash

Un proceso mas general…


El proceso de almacenar objetos
usando una función hash es el
siguiente:
1. Cree un arreglo de tamaño M
para almacenar objetos, este
arreglo se llama Hash-Table.
2. Encuentre un código hash de un
objeto pasándolo a través de la
función hash.
3. Tome el módulo de código hash
por el tamaño de Hash-Table para
obtener el índice de la tabla
donde se almacenarán los objetos.
4. Finalmente, almacene estos
objetos en el índice designado.

19
Búsqueda por Transformación de claves o hash

Un proceso mas general…


El proceso de búsqueda de
objetos en una Hash-Table
usando una función hash es el
siguiente:
1. Encuentre un código hash
del objeto que estamos
buscando pasándolo a través de
la función hash.
2. Tome el módulo de código
hash por el tamaño de la tabla
hash para obtener el índice de
la tabla donde se almacenan
los objetos.
3. Finalmente, recupere el
objeto del índice designado.

20
Búsqueda por Transformación de claves o hash
"Isabelle" 230492619
hashCode
method
230492619 % 997 = 177

0 1 2 3 .........177............ 996

"Isabelle"

21
Codificación de la Búsqueda por Transformación de claves o
hash
Clase HashTable

22
Codificación de la Búsqueda por Transformación de claves o
hash
Clase HashTable

23
Codificación de la Búsqueda por Transformación de claves o
hash Clase UsoHash

24
Ejercicio
Implementar el siguiente Pseudocódigo con
una función hash por módulo o división:
• La función hash por módulo o división consiste en tomar el
residuo de la división de la clave entre el número de
componentes del arreglo donde se almacenarán las claves.

• Supongamos que tenemos un arreglo de N elementos y K es la clave


del dato a buscar. Las función hash queda definida por la
siguiente fórmula: H(K)=(KmodN)+1

• Para lograr mayor uniformidad es importante que N sea un número


primo o divisible entre muy pocos números

Buscando el 13 25
Búsqueda Indexada

26
Búsqueda Indexada

La cantidad de
elementos que debe
conformar cada
grupo o bloque (k)
debe ser la raíz
cuadrada del tamaño
del arreglo

27
Codificación de la Búsqueda Indexada
Clase index

Uso de la búsqueda indexada

28
¿Preguntas?

29
FIN

30

También podría gustarte