Está en la página 1de 14

Métodos de búsqueda

iterativo
Métodos de búsqueda iterativo
Búsqueda exponencial

La búsqueda exponencial es otro algoritmo de búsqueda que se puede implementar de


manera bastante simple en Python, en comparación con la búsqueda de salto y la búsqueda
de Fibonacci, que son un poco complejas. También es conocido por los nombres búsqueda
galopante, búsqueda duplicada y búsqueda Struzik.

La búsqueda exponencial depende de la búsqueda binaria para realizar la comparación final


de valores. El algoritmo funciona mediante:

1. Determinar el rango donde es probable que se encuentre el elemento que estamos


buscando
2. Usando la búsqueda binaria para el rango para encontrar el índice exacto del elemento
Métodos de búsqueda iterativo
La implementación de Python del algoritmo de búsqueda exponencial es:

def búsqueda_exp(lista, val):


if lista[0] == val:
return 0
index = 1
while index < len(lista) and lista[index] <= val:
index = index * 2
return búsqueda_binaria(lista[:min(index, len(lista))], val)

Al emplear la función para encontrar el valor de:

a = [1,2,3,4,5,6,7,8]
print(búsqueda_exp(a,3))
Métodos de búsqueda iterativo
El algoritmo funciona mediante:

• Comprobando si el primer elemento de la lista coincide con el valor que estamos


buscando, dado que lista[0] es 1 y estamos buscando 3, establecemos el índice en 1 y
seguimos adelante.
• Pasando por todos los elementos de la lista, y mientras el elemento en la posición del
índice es menor o igual a nuestro valor, aumentando exponencialmente el valor de index
en múltiplos de dos:
• index = 1, lista[1] es 2, que es menor que 3, por lo que el índice se multiplica por 2 y se
establece en 2.
• index = 2, lista[2] es 3, que es igual a 3, por lo que el índice se multiplica por 2 y se
establece en 4.
• índice = 4, lista[4] es 5, que es mayor que 3; el bucle se rompe en este punto.
Métodos de búsqueda iterativo
Luego realiza una búsqueda binaria cortando la lista; lista[:4]. En Python, esto significa que la
sublista contendrá todos los elementos hasta el cuarto elemento, por lo que en realidad
estamos llamando:

búsqueda_binaria([1,2,3,4], 3)

que volvería:

Índice del elemento que estamos buscando tanto en la lista original como en la lista dividida
que pasamos al algoritmo de búsqueda binaria.
Métodos de búsqueda iterativo
La búsqueda exponencial se ejecuta en tiempo O(log i), donde i es el índice del elemento que
estamos buscando. En el peor de los casos, la complejidad de tiempo es O(log n), cuando el
último elemento es el elemento que estamos buscando (siendo n la longitud de la matriz).

La búsqueda exponencial funciona mejor que la búsqueda binaria cuando el elemento que
estamos buscando está más cerca del comienzo de la matriz. En la práctica, utilizamos la
búsqueda exponencial porque es uno de los algoritmos de búsqueda más eficientes para
matrices infinitas o ilimitadas.
Métodos de búsqueda iterativo
Búsqueda de interpolación

La búsqueda de interpolación es otro algoritmo de divide y vencerás, similar a la búsqueda


binaria. A diferencia de la búsqueda binaria, no siempre comienza a buscar en el medio. La
búsqueda de interpolación calcula la posición probable del elemento que estamos buscando
usando la fórmula:

index = bajo + [(val-lista[bajo])*(alto-bajo) / (lista[alto]-lista[bajo])]


Métodos de búsqueda iterativo
index = bajo + [(val-lista[bajo])*(alto-bajo) / (lista[alto]-lista[bajo])]

Donde están las variables:

• lista - nuestra matriz de entrada


• val - el elemento que estamos buscando
• index - índice probable del elemento de búsqueda. Esto se calcula como un valor más alto
cuando val tiene un valor más cercano al elemento al final de la matriz ( lista[alto]), y más
bajo cuando val tiene un valor más cercano al elemento al comienzo de la matriz (
lista[bajo])
• bajo - el índice inicial de la matriz
• alto - el último índice de la matriz
Métodos de búsqueda iterativo
El algoritmo busca calculando el valor de index:

• Si se encuentra una coincidencia (cuando lista[index] == val), se devuelve el índice


• Si el valor de val es menor que lista[index], el valor del índice se vuelve a calcular
utilizando la fórmula de la submatriz izquierda.
• Si el valor de val es mayor que lista[index], el valor del índice se vuelve a calcular
utilizando la fórmula de la submatriz de la derecha.
Métodos de búsqueda iterativo
def búsqueda_inter(lista, val):
bajo = 0
alto = (len(lista) - 1)
while bajo <= alto and val >= lista[bajo] and val <= lista[alto]:
index = bajo + int(((float(alto - bajo) / (lista[alto] - lista[bajo])) * (val - lista[bajo])))
if lista[index] == val:
return index
if lista[index] < val:
bajo = index + 1;
else:
alto = index - 1;
return -1
Métodos de búsqueda iterativo
Si usamos la función para calcular:

a = [1,2,3,4,5,6,7,8]
print(búsqueda_inter(a, 6))

Nuestros valores iniciales serían:

val = 6,
bajo = 0,
alto = 7,
lista [bajo] = 1,
lista [alto] = 8,
índice = 0 + [(6-1) * (7-0) / (8-1)] = 5

Y como lista[5] es 6, que es el valor buscado, dejamos de ejecutar y devolvemos el resultado:

5
Métodos de búsqueda iterativo
Si tenemos una gran cantidad de elementos, y nuestro índice no se puede calcular en una
iteración, seguimos calculando los valores del índice después de ajustar los valores de alto y
bajo en nuestra fórmula.

La complejidad temporal de la búsqueda de interpolación es O (log log n) cuando los valores


se distribuyen uniformemente. Si los valores no se distribuyen uniformemente, la
complejidad temporal del peor caso es O (n), lo mismo que la búsqueda lineal.

La búsqueda por interpolación funciona mejor en matrices ordenadas y distribuidas


uniformemente. Mientras que la búsqueda binaria comienza en el medio y siempre se divide
en dos, la búsqueda de interpolación calcula la posición probable del elemento y verifica el
índice, lo que hace que sea más probable encontrar el elemento en un número menor de
iteraciones.
Métodos de búsqueda iterativo
Ejercicios propuestos

1. Elabore un programa en Python 3 que emplee una o varias funciones para ordenar una
lista y buscar un valor dentro de ella, emplee el método time() para medir el tiempo de
procesamiento, verifique y compare el tiempo necesario para ordenar y buscar valores
con diferentes listas.

También podría gustarte