Implementar búsqueda binaria en Python es más simple de lo que parece. Aquí verás cómo construir una función recursiva clara, preparar una lista ordenada con random y list comprehension, y gestionar el punto de entrada del programa. Todo con buenas prácticas y explicaciones directas.
¿Cómo preparar el entorno en Python para binary search?
Antes de codificar, se crea un archivo y se define el punto de ingreso con el keyword if name == "main". Luego, se generan datos aleatorios y se ordenan, porque la búsqueda binaria requiere una lista previamente ordenada.
Crear el archivo y definir el punto de entrada.
Importar el módulo random.
Generar 10 números entre 0 y 100 con list comprehension.
Ordenar la lista con sort para modificarla en sitio.
Imprimir los datos como guía visual.
¿Cómo generar y ordenar datos con random y list comprehension?
Se evita escribir un for loop manual usando list comprehension. La lista se ordena con sort; recuerda que sort modifica la lista y sorted crea una nueva.
import random
if __name__ =="__main__": data =[random.randrange(0,100)for _ inrange(10)] data.sort()print("Datos ordenados:", data)
¿Qué diferencia hay entre sort y sorted?
sort: ordena en el lugar y no devuelve una nueva lista.
sorted: devuelve una copia ordenada y no altera la original.
Usar sort aquí simplifica el flujo y garantiza que la estructura requerida por el algoritmo esté lista.
¿Cómo se define la función recursiva binary search en Python?
La interfaz establece el contrato: recibe la lista ordenada, el target y dos índices, low y high, que representan el estado actual de búsqueda. Devuelve True si encuentra el elemento y False si no.
¿Cuál es la interfaz y el caso base?
El caso base valida si low > high: significa que se recorrió todo el rango posible y el número no está en la lista. Se evita así un error de fuera de índice y se detiene la recursión.
defbinary_search(data, target, low, high):if low > high:returnFalse# se completará más abajo
¿Cómo calcular el índice medio y decidir los tres casos?
Se calcula el índice medio con división entera: mid = (low + high) // 2. Luego se evalúan tres escenarios:
Igualdad: target == data[mid] → encontrado.
Menor: target < data[mid] → buscar en la mitad izquierda: high = mid - 1.
¿Cómo ejecutar el script y qué reto propone el instructor?
Tras ordenar, se pide al usuario el número a buscar con input y se convierte a entero con int, ya que input devuelve cadenas. El resultado se imprime indicando si se encontró o no. En pruebas, se vieron casos donde el número sí está y otros donde no está, validando la implementación.
¿Cómo interactúa el usuario con input y conversión a int?
Se captura el objetivo y se llama a la función con índices correctos: low = 0 y high = len(data) - 1.
if __name__ =="__main__": data =[random.randrange(0,100)for _ inrange(10)] data.sort()print("Datos ordenados:", data) target =int(input("What number would you like to find? ")) found = binary_search(data, target,0,len(data)-1)print(found)
¿Qué ejercicio extra se sugiere sin recursión?
Se propone implementar la misma lógica sin recursión, usando ciclos para actualizar low y high. Es un gran ejercicio para reforzar el manejo de estado, comparaciones y división entera.
¿Te animas a compartir tu versión iterativa con ciclos y contar qué decisiones tomaste al actualizar los índices?
import random
def binary_search(data, target, low, high):while low <= high: mid =(low + high)// 2if target == data[mid]:returnTrue elif target < data[mid]: high = mid -1else: low = mid +1if __name__ =='__main__': data =[random.randint(0,100)for i inrange(10)] data.sort()print(data) target =int(input('What number would you like to find?')) found =binary_search(data, target,0,len(data)-1)if found ==True:print('The number: {} is in the list'.format(target))else:print('The number: {} is not in the list'.format(target))```
Podrias solo dejar
iffound:
Y te podrias ahorrar la igualdad ya que found es True
if found ==True
Iteratividad en lugar de REcursividad
Sólo es necesario definir la función con 2 parámetros
def binary_search(data, target)low = data[0]high = data [len(data)-1]
Ya que low y high se pueden calcular al comienzo de la iteración.
Hola comunidad, les comento que al hacer este ejercicio me pasó de estar por una hora sin entender por qué la siguiente función recursiva no me retornaba el resultado correcto. El resultado era “None”.
Luego al compararlo con el código del profesor, me di cuenta que faltaba el “return” en el elif y el else. Comparto esto para tenerlo en cuenta a la hora de hacer funciones recursivas
Aquí esta mi aporte si no entienden lo de Binary Search lo que tienen que hacer es
Establecer "L" a 0 y "H" a la longitud del array - 1 (n - 1)
si "L" > "R", significa que debemos retornar False
Establecer "m" como la mitad de (L + R) / 2 la división debe ser entera (sin decimales)
Si Data[m] < Target, ahora L es igual a m + 1 y debemos volver al paso 2
Si Data[m] > Target, ahora H es igual a m - 1 y debemos volver al paso 2
Ahora si Target = Data[m] retornamos True
import random
def binary_search(data, target, low, high):while low <= high:if low > high:returnFalse mid =(low + high)// 2if target == data[mid]:returnTrue elif data[mid]< target: low = mid +1else: high = mid -1returnFalseif __name__ =='__main__': data =[random.randint(1,100)for i inrange(10)] data.sort()print(data) target =int(input('Ingresa el número a adivinar? ')) found =binary_search(data, target,0,len(data)-1)print(found)
def f(data,target): lo =0 hi =len(data)while hi - lo >1: mid =(lo + hi)// 2if data[mid]> target: hi = mid
else: lo = mid
return data[lo]== target
Gracias por el código, está super claro.👍 Y creo que de todos los que revisé es el único que utiliza la idea de delimitar bien los límites superior e inferior.
Muestra que hay mil formas de resolver un problema... bien!
def bin_search(data, target, low, high): found =Truewhile(found==True): mid =(low + high)// 2 if low > high:returnFalse elif target == data[mid]: found =FalsereturnTrue elif target < data[mid]: high = mid -1else: low = mid +1```
Solución con un for
import random
def loop_search(target, data): found =Falsefor i indata:if i == target: found =Truereturn found
if __name__ =='__main__': data =[random.randint(0,100)for i inrange(20)] data.sort()print(data) target =int(input('What number would you like to find? ')) found =loop_search(target, data)print(found)
Yeah, give me for! 🖐🏽
Tu codigo funciona, el problema es cuenado se tengan colecciones de datos muy vastas ya que estas recorriendo toda la lista hasta que encuentras el numero, yo creo que la idea tambies es optimizar la busqueda para hacerla mas rapida, de alli surge la idea de usar una solucion binaria, partiendo la lista por mitades cada vez, asi se acelera.
Reto:
import random
def binary_search(data,target): # low_idx indice y high_idx indice mayor de la lista
low_idx =0 high_idx=len(data)-1 solve =Falsewhile low_idx <= high_idx: mid =(low_idx + high_idx)//2if target == data[mid]: solve =Truebreakelse:if target < data[mid]: high_idx = mid -1 elif target > data[mid]: low_idx = mid +1return solve
if __name__ =='__main__': data =[random.randint(0,10)for _ inrange(10)] data.sort()print(data) target =int(input('What number would you like to find? ')) found =binary_search(data,target)print(found)
Mi solución, solo un detalle tenía y es que en ciertas ocasiones enviaba False a pesar de estar el elemento, pero solo es colocar mayor o igual o menor igual(depende de como se realice) y se soluciona el problema
import random
def binary_search(data, target, low, high):if low > high:returnFalse mid =(low + high)// 2if target == data[mid]:returnTrue elif target < data[mid]:returnbinary_search(data, target, low, mid -1)else:returnbinary_search(data, target, mid +1, high)def binary_search_with_while(data, target): low =0 high =len(data)-1while low <= high: mid =(low + high)// 2if target == data[mid]:returnTrue elif target >= data[mid]: low = mid +1else: high = mid -1returnFalseif __name__ =='__main__': data =[random.randint(0,100)for i inrange(10)] data.sort()print(data) target =int(input("What number would you like to find? ")) #found =binary_search(data, target,0,len(data)-1) found =binary_search_with_while(data, target)print(found, target)```
Reto:
from random import randint
def binary_search(list: list,objective: int,start: int,final: int): sorted_list =sorted(list)while start <= final: mid =(start + final)// 2if objective > sorted_list[mid]: start = mid +1 elif objective < sorted_list[mid]: final = mid -1 elif objective == sorted_list[mid]:return1else:return0if __name__ =='__main__': #test example
list =[randint(0,20)for _ inrange(0,10)]print(bool(binary_search(list,15,0,len(list))))
Que hermosa es la recurtion
Asi me quedo a mi :)
¿Creo que el último return usr está un poco raro no? En caso de que no lo encontrara o algo fallara, de todas maneras te devolvería el número. Podrías diferenciar lo que retorna cada return para poder diferenciar el resultado.
.
Espero explicarme. Saludos!
Este es mi código del reto, agradezco a toda la comunidad porque me apoyé del código de todos y no me acuerdo de quién lo tomé exactamente xD. (Sí, al final lo hice yo solo, aunque sí me ayudaron).
import random
def binarySearch(d, t, s, e): x =False m =0if s > e: x =Falsewhile s <= e: m =(s + e)// 2if t == d[m]: x =Truereturn m
break elif t < d[m]: e = m -1else: s = m +1return x
if __name__ =='__main__':"""data = [random.randint(0, 100) for i in range(10)]""" d =[]for i inrange(10): d.append(random.randint(0,100)) d.sort()print(d) t =int(input("Number: ")) found =binarySearch(d, t,0,len(d)-1)print("{} number is at {} position".format(t, found))
import random
def binary_search(data, target, low, higth): mid =(low + higth)// 2#print(mid) ok =Truewhileok:if low > higth: ok =FalsereturnFalseif target == data[mid]: ok =FalsereturnTrue elif target < data[mid]: higth = mid -1else: low = mid +1 mid =(low + higth)// 2#print(mid)returnFalseif __name__ =='__main__': data =[random.randint(0,100)for i inrange(10)] data.sort()print(data) target =int(input('What number would you like to find? ')) found =binary_search(data, target,0,len(data)-1)print(found)
La desventaja que veo es que, continua con el ciclo a pesar de que ya encontró el valor buscado.
Saludos! = )
Esta es mi solución usando loops, como la ven?
import random
def binary_search(number_list): found =False low, high =0,len(number_list)-1 mid =(low + high)// 2 target =int(input('What number would you like to find?: '))while not found:if mid <= low or mid >= high:print('El número NO se encuentra en la lista.')breakif target == number_list[mid]: found =True elif target < number_list[mid]: mid =(low + mid -1)// 2 elif target > number_list[mid]: mid =(mid + high +1)// 2iffound:print('El número si se encuentra en la lista.')if __name__ =='__main__': number_list =[random.randint(1,21)for i inrange(21)] number_list.sort()print(number_list)binary_search(number_list)
Qué tal Fabrizio19!
Buena idea de cambiar la manera de hacer la búsqueda con un while loop en lugar del if que se utilizó en el curso.
A lo rápido encuentro no necesario el primer if dentro del while loop. Si tomaste el punto medio entre low y high, no es necesario comparar si está debajo o arriba del low y high respectivamente, siendo mid un promedio, nunca podrá estar abajo o arriba de los valores que le dieron origen.
Saludos!
Mi solución al reto:
import random
def binarySearch(data, target): data =sorted(data) min, max =0,len(data)-1while min <= max: actual_index =(min + max)// 2if target == data[actual_index]:returnTrue elif target < data[actual_index]: max = actual_index -1else: min = actual_index +1returnFalseif __name__ =='__main__': random_numbers =[random.randint(0,100)for i inrange(20)]print(random_numbers) found =binarySearch(random_numbers,int(input('What number would you like to found? ')))print(found)
Gran solución. Felicidades
Muchas gracias @nicolas-mayorga-vargas!!
¿Ya intentaste el reto?
<code>import random
def binary_search(n_list, obj, low, high):if low > high:returnFalsefor n inn_list: mid =(low + high)// 2if obj == n_list[mid]:returnTrue elif obj < n_list[mid]: high = mid -1else: low = mid +1if __name__ =="__main__": n_list =[random.randint(0,100)for n inrange(20)] n_list.sort()print(n_list) obj =int(input('Number to find: ')) found =binary_search(n_list, obj,0,len(n_list)-1)iffound:print(f'I Found the number {obj}!')else:print(f'I don\'t found the number {obj}')