Robin Jaime Beltran Montijo
Brayan Urbina
cristian josue
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.
¿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 _ in range(10)] data.sort() print("Datos ordenados:", data)
¿Qué diferencia hay entre sort y sorted?
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.
def binary_search(data, target, low, high): if low > high: return False # 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:
def binary_search(data, target, low, high): if low > high: return False mid = (low + high) // 2 if target == data[mid]: return True elif target < data[mid]: return binary_search(data, target, low, mid - 1) else: return binary_search(data, target, mid + 1, high)
¿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 _ in range(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?
Robin Jaime Beltran Montijo
Brayan Urbina
cristian josue
Mauro Andrés Rocca Fontora
Manuel Alejandro Aguilar Téllez Girón
Aaron Joel Limachi Quispe
Alex John Chamba Macas
Royer Guerrero Pinilla
Jesus Espino
Aaron Joel Limachi Quispe
Carmen Sánchez Salgado
Miguel Angel Ramirez Samano
Francisco Garcia [C6]
Omar Daniel Centeno
Marco Antonio Baquero Torres
Roger Christian Cansaya Olazabal
Yorlys Oropeza
Jonathan Osorio
Michelle Osorio
Dennis Alejandro Salinas Estrada
Omar Daniel Centeno
Manuel Alejandro Aguilar Téllez Girón
Carmen Sánchez Salgado
Carlos Centeno
Osvaldo Trejo
JoséAngel Sánchez
Carmen Sánchez Salgado
Fabrizio Fasanando Sotelo
Luis Arturo Huerta Rodríguez
Hector F
Nicolás Mayorga Vargas
Hector F
Pablo Perez
import random def binary_search(data, target, low, high): while low <= high: mid = (low + high) // 2 if target == data[mid]: return True elif target < data[mid]: high = mid - 1 else: low = mid + 1 if __name__ == '__main__': data = [random.randint(0, 100) for i in range(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
if found:
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
def find_number(numbers, search, low, high): if low > high: return False middle = (low + high) // 2 if numbers[middle] == search: return True elif numbers[middle] > search: find_number(numbers, search, low, (middle - 1)) else: find_number(numbers, search, (middle + 1), high)
Había tenido el mismo problema, es la primera vez que veo funciones repulsivas
Son funciones recursivas, no repulsivas A modo de chiste para principiantes estuvo genial 😂🤣
Comparto mi solución iterativa a la búsqueda binaria
def binary_search_iterative(data, target, low, high): while low<=high: mid = (low + high)//2 if data[mid] == target: return True else: if target < data[mid]: high = mid-1 else: low = mid+1 return False
Aquí esta mi aporte si no entienden lo de Binary Search lo que tienen que hacer es
import random def binary_search(data, target, low, high): while low <= high: if low > high: return False mid = (low + high) // 2 if target == data[mid]: return True elif data[mid] < target: low = mid + 1 else: high = mid - 1 return False if __name__ == '__main__': data = [random.randint(1, 100) for i in range(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) // 2 if 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 = True while(found==True): mid = (low + high) // 2 if low > high: return False elif target == data[mid]: found = False return True elif target < data[mid]: high = mid -1 else: low = mid + 1```
Solución con un for
import random def loop_search(target, data): found = False for i in data: if i == target: found = True return found if __name__ == '__main__': data = [random.randint(0, 100) for i in range(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 = False while low_idx <= high_idx: mid = (low_idx + high_idx)//2 if target == data[mid]: solve = True break else: if target < data[mid]: high_idx = mid -1 elif target > data[mid]: low_idx = mid + 1 return solve if __name__ =='__main__': data = [random.randint(0,10) for _ in range(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: return False mid = (low + high) // 2 if target == data[mid]: return True elif target < data[mid]: return binary_search(data, target, low, mid - 1) else: return binary_search(data, target, mid + 1, high) def binary_search_with_while(data, target): low = 0 high = len(data) - 1 while low <= high: mid = (low + high) // 2 if target == data[mid]: return True elif target >= data[mid]: low = mid + 1 else: high = mid - 1 return False if __name__ == '__main__': data = [random.randint(0,100) for i in range(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) // 2 if objective > sorted_list[mid]: start = mid + 1 elif objective < sorted_list[mid]: final = mid - 1 elif objective == sorted_list[mid]: return 1 else: return 0 if __name__ == '__main__': #test example list = [randint(0,20) for _ in range(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 = 0 if s > e: x = False while s <= e: m = (s + e) // 2 if t == d[m]: x = True return m break elif t < d[m]: e = m - 1 else: s = m + 1 return x if __name__ == '__main__': """data = [random.randint(0, 100) for i in range(10)]""" d = [] for i in range(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))
hi comunidad, aquí mi solución!
< def binary_search(data, target): low, hight = 0, len(data) -1 while low <= hight: mid = (low + hight) // 2 if target == data[mid]: return True break elif target < data[mid]: hight = mid -1 else: low = mid +1 return False >
Mi solucion:
import random def binary_search(data, target, low, higth): mid = (low + higth) // 2 #print(mid) ok = True while ok: if low > higth: ok = False return False if target == data[mid]: ok = False return True elif target < data[mid]: higth = mid - 1 else: low = mid + 1 mid = (low + higth) // 2 #print(mid) return False if __name__ == '__main__': data = [random.randint(0, 100) for i in range(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)
def binary_search_without_recursion(data, target, low, high): while low <= high: mid = (low + high) // 2 if target == data[mid]: return True elif target < data[mid]: high = mid - 1 else : low = mid + 1 return False
Encontré este algoritmo un poco más sencillo de ver, por si a alguien le funciona.
def busquedaBinaria(unaLista, item): primero = 0 ultimo = len(unaLista)-1 encontrado = False while primero<=ultimo and not encontrado: puntoMedio = (primero + ultimo)//2 if unaLista[puntoMedio] == item: encontrado = True else: if item < unaLista[puntoMedio]: ultimo = puntoMedio-1 else: primero = puntoMedio+1 return encontrado
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.') break if 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) // 2 if found: print('El número si se encuentra en la lista.') if __name__ == '__main__': number_list = [random.randint(1, 21) for i in range(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) - 1 while min <= max: actual_index = (min + max) // 2 if target == data[actual_index]: return True elif target < data[actual_index]: max = actual_index - 1 else: min = actual_index + 1 return False if __name__ == '__main__': random_numbers = [random.randint(0, 100) for i in range(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: return False for n in n_list: mid = (low + high) // 2 if obj == n_list[mid]: return True elif obj < n_list[mid]: high = mid - 1 else: low = mid + 1 if __name__ == "__main__": n_list = [random.randint(0,100) for n in range(20)] n_list.sort() print(n_list) obj = int(input('Number to find: ')) found = binary_search(n_list, obj, 0, len(n_list)-1) if found: print(f'I Found the number {obj}!') else: print(f'I don\'t found the number {obj}')