Juan Pablo Lozano
A punta de enumeración exhaustiva Dr Strange se puso a ver en que futuro los vengadores ganaban a Thanos
David Behar
Quiero twittearlo, cúal es tu @ para etiquetarte?
Andres Rodriguez Tinoco
Gracias a este comentario entendí mejor
¿Qué es la enumeración exhaustiva en algoritmos?
La enumeración exhaustiva es una técnica algorítmica fundamental que consiste en verificar todas las posibles soluciones para encontrar una respuesta precisa. Aunque pueda parecer ineficiente, resulta ser una herramienta poderosa gracias a la velocidad con la que las computadoras pueden realizar cálculos hoy en día. Este algoritmo es especialmente útil como punto de partida al enfrentarse a nuevos problemas o en entrevistas de trabajo, donde lo importante es ir sacando soluciones de la manga de forma ágil.
¿Cómo aplicar la enumeración exhaustiva para encontrar raíces cuadradas?
Para ilustrar el uso de la enumeración exhaustiva, consideremos el problema de encontrar la raíz cuadrada exacta de un número. El proceso consiste en:
Este concepto puede ser plasmado de forma sencilla en Python:
objetivo = int(input("Elige un número: ")) respuesta = 0 while respuesta**2 < objetivo: respuesta += 1 if respuesta**2 == objetivo: print(f"La raíz cuadrada de {objetivo} es {respuesta}") else: print(f"{objetivo} no tiene una raíz cuadrada exacta")
¿Por qué no preocuparse por la eficiencia en este caso?
A veces, los desarrolladores novatos podrían pensar que probar cada posibilidad una por una resultaría muy lento. Sin embargo, las computadoras modernas son capaces de llevar a cabo millones de operaciones por segundo, lo que hace que la enumeración exhaustiva sea sorprendentemente rápida para muchos problemas prácticos. Incluso con números grandes, este método puede llegar al resultado en cuestión de milisegundos.
¿Cómo entender mejor el comportamiento del programa?
Una de las mejores formas de entender el comportamiento de un algoritmo es utilizando la impresión de estados intermedios dentro del ciclo. Esto se logra añadiendo declaraciones print() para observar cómo se actualizan los valores internos del programa en cada iteración:
objetivo = int(input("Elige un número: ")) respuesta = 0 while respuesta**2 < objetivo: print(f"Probando con {respuesta}") respuesta += 1 if respuesta**2 == objetivo: print(f"La raíz cuadrada de {objetivo} es {respuesta}") else: print(f"{objetivo} no tiene una raíz cuadrada exacta")
¿Cómo manejar números muy grandes?
La prueba con números extremadamente grandes puede dar lugar a dudas sobre la eficiencia. Sin embargo, como se mencionó anteriormente, las computadoras manejan estas situaciones sin apenas esfuerzo. Incluso al buscar la raíz cuadrada de números ridículamente grandes, como 108,638,929, el resultado puede obtenerse en un abrir y cerrar de ojos. Simplemente se trata de confiar en la eficiencia y rapidez de las máquinas actuales.
Practicando y aprendiendo más
No dudes en experimentar con el código, probar diferentes números y realizar modificaciones para entender a fondo cómo funciona la enumeración exhaustiva. Usar este algoritmo básico como cimiento te ayudará a desarrollar destrezas algorítmicas sólidas en el futuro. ¡Sigue practicando y haciendo preguntas, cada intento cuenta para mejorar tu comprensión computacional!
Juan Pablo Lozano
A punta de enumeración exhaustiva Dr Strange se puso a ver en que futuro los vengadores ganaban a Thanos
David Behar
Quiero twittearlo, cúal es tu @ para etiquetarte?
Andres Rodriguez Tinoco
Gracias a este comentario entendí mejor
Josue Noha Valdivia
Diagrama de flujo:
Moises Gonzalez
Por alguna razon, asi lo entiendo mucho mejor. Gracias!
Adrian Avila Molina
Con que programa haces el diagrama de flujo?
Andrés Felipe Mesa David
Mauricio Rodríguez
Esta genial, muchas gracias!
Samuel Valeron Goez
Muchas gracias por tu aporte, pero me atrevo a sugerirte algo. Colocando esa función time al principio del código, el programa esta contando todo el tiempo, incluyendo lo que tarda el usuario en teclear el número. Si te interesa saber cuánto tarda el ordenador en encontrar la solución, deberías mover esa línea depués del input del usuario. De esa manera sabrás cuanto tarda el ordenador en hayar la solución, y no cuant tiempo ha estado esperando. Espero haber sido útil.
Hiram Rodriguez Gomez
En seguridad informática, existe un tipo de ataque llamado de "fuerza bruta", en el que un atacante trata de ingresar a un sistema probando TODAS las contraseñas posibles hasta que logra ingresar al sistema. Prácticamente es un algoritmo de enumeración exhaustiva en todo su esplendor. Por eso muchos sitios implementaron medidas de seguridad para cuando alguien trata muchas veces de logearse con un mismo usuario.
Mauricio Gonzalez Falcon
Gracias por el dato!
Sebastián Torres Tovar
Gracias, excelente aporte Hiram
Diana Yazmin
Para no tener que estar escribiendo lo mismo cada vez que compilemos en consola, les dejo los pasos para configurar Visual Studio y lo haga automático.
En este video lo explica a detalle: https://www.youtube.com/watch?v=9Hh6fqieReE
Maria Guadalupe Diaz Escobar
Gracias
Marcos ismael Caballero reyes
muy bueno gracias
a veces es bueno saber como aplicar la Fuerza Bruta, no solamente es mandar todas las opciones, sino es bueno reducir el rango por condiciones, que a veces no son sencillas de ver, reduciendo en consecuencia la complejidad algorítmica en tiempo y espacio. Un ejemplo muy clásico es ver si el número es primo, en vez de hacer fuerza bruta del 2 al n, una opción de las varias es hacer Brute Force del 2 a sqrt(n) sabiendo que si existe x / n%x==0 & x > sqrt(n), tambien existe y = n / x tal que y < sqrt(n). También en codeforces hay problemas no sencillos que están en Div 1, que suelen resolverse utilizando Fuerza Bruta
Karl Behrens Gil
Enumeración exhaustiva También llamado "adivina y verifica" donde simplemente generamos todas las posibilidades. Técnicamente este no es un algoritmo eficiente, sin embargo, dependiendo del universo de posibilidades puede ser que sea el mas adecuado, ya que las computadoras actuales son muy rapidas y por lo tanto la eficiencia de nuestro programa no es relevante, por lo tanto siempre ten en mente este tipo de algoritmo como uno de los primeros en implementar.
Vamos a crear un ejemplo de enumeración exhaustiva buscando la raíz cuadrada exacta de un numero.
objetivo = int(input('Escoge un entero: ')) # Inicializamos respuesta como 0 respuesta = 0 # Mientras respuesta^2 sea menor que nuestro numero objetivo. while respuesta**2 < objetivo: respuesta += 1 # Respuesta aumentara en 1. if respuesta**2 == objetivo: print(f'La raiz cuadrada de {objetivo} es {respuesta}') else: print(f'{objetivo} no tinene una raiz cuadrada exacta')
Pablo Reyes Abarca
While, hasta que la condicion deje de ser verdadera For, hasta que la condicion sea falsa
Daniel Serna
:O
Sebastian Cifuentes
Tiene toda la razón
Luis Arturo Cruz Cruz
Luis Alejandro Vera Hernandez
Excelente, muchas gracias por tu aporte companero
Lorenzo Enrique Piñango Cerezo
Excelente :)
Enmanuel Castillo
Qué hermoso es todo esto!!! Aún sigo sin entenderlo jaja
Gustavo Adolfo Guillén Villalba
Es normal que en algunos casos no se entienda pero puedes hacer una prueba de escritorio, es decir, toma papel y lapiz y tu mismo vas haciendo la operación de forma manual hasta que logres entender que hace ese algoritmo.
Alejandro Giraldo Londoño
Erika Luna
Profesorsi, está interesante lo rápido que lo hacen las computadoras.
Juan Camilo Maldonado Perez
Brutal!
Augusto Huerta
Cuidado con la enumeración exhaustiva:
Aunque es cierto que las computadoras son bien rápidas, estas tienen un límite.
Prueben con este número: 134724234304. Verán que no lo hará en segundos, se tomará algunos minutos llegar a que es: 367048. ¿Por qué?
Porque el ordenador se hace más lento al calcular a partir de las 1010 iteraciones, volviéndose 1 segundo el tiempo de cálculo de 1011, 10 el de 10**12, y así sucesivamente.
Es un caso extremo pero que da la moraleja que cuando las cosas escalan exponencialmente, Sí es necesario optimizar. Espero que les sirva para más adelante. Salu2
Israel Churata
a la mía le tomo 0.08 seg. :)
HERNAN DARIO VELASQUEZ ORTIZ
No comparto esta forma de 'pensar computacionalmente', decir que no importa que el algoritmo sea ineficiente porque las maquinas son cada vez mas rápidas es un error, imagina que esta aplicación corre en un servidor donde muchos usuarios están usando esos algoritmos; siempre debemos escribir programas eficientes. David no es un experto en el tema, simplemente realizó un curso antes de dictar esta otro curso.
Ronald Cuello
Comparto tu forma de pensar a nivel de rendimiento , pero lo que le comprendo al Profesor es siempre tengamos herramientas para dar solución a un problema y en camino lo vamos mejorando. La enumeración exhaustiva es muy usada en el hacking etico para la busqueda de vulnerabilidades entre otras cosas... no esta demás tener este tipo de algoritmos como una ultima alternativa.
Oscar Humberto Godínez Paiz
Ya cállate, hay todo un equipo de expertos detrás de cada curso, incluso de cada clase, vas a venir vos solito a decir que está bien o mal. Antes de emitir un juicio tan fuerte mejor termina el curso, siempre hay una razón sino mira el curso nuevo de programación básica.
B. Alejandro Rodriguez Ocaña
Me está gustando mucho el curso .
Luis Enrique Huamán Quispe
Man como hace para obtener ese formato?
Kelvin Alejandro Miranda Ramirez
yo tambien tengo la misma duda :O
Julio Cardenas
El algoritmo es ineficiente pero las computadoras son muy rapidas. es un algoritmo ineficiente pero EFICAZ.
Hallazgo de raiz cuadrada exacta por ennumeracion exhaustiva Por favor digite un numero: 1000000000000 1000000 es la raiz cuadrada exacta de 1000000000000
hizo un millon de intentos y se demoro 1 segundo!!!
Cristian Antonio García González
Es increible la verdad.
Un dato curioso sobre la eficacia de las computadora aunque de seguro ya la habrán escuchado es sobre la computadora que llevo a la luna a los primero hombres tenia cuatro kilobytes de memoria RAM imaginate solo 4 KB y ahora hoy en día es normal que los ordenadores tengan GB es impresionante como ha evolucionado la computación como la eficacia de procesamiento de los datos.
Eder Snchz
En realidad no es que la computadora pruebe con todos los numeros, sino que en situaciones tan obvias como ésta es capaz de saber lo que buscamos e infiere directamente con el resultado, o bueno es lo que lei alguna vez en un foro.
GUADALUPE GARCÍA VÁZQUEZ
Les recomiendo este vídeo para entender sobre los algoritmos https://www.youtube.com/watch?v=U3CGMyjzlvM
Sebastián Torres Tovar
Gracias está excelente
Yulisa Vanesa Rivas
ok
Edgar Ocampo
Algoritmo de fuerza bruta 😎
Carlos Fernando Aguilar González
Les comparto un ejemplo de raíz cúbica, simplemente cambiamos el 2 por el 3 y modificamos la impresión de texto.
Alejandro Ching
Muchas gracias, no lo habia pensado !!!
edgar polo
tuve que sentarme a leer la lógica detenidamente preguntándome el porque de cada cosa cuando lo entendi fue como :
David Yunta
A prueba de errores si introduces un valor de tipo float o string:
David Behar
No necesitas un try except, acá una optimización:
objective=None while objective == None: objective_string = input('Ingresa un número que quieras saber su raíz cuadrada ') if(objective_string.isdigit()): objective = int(objective_string) result=0 while result**2 < objective: result += 1 if result**2 == objective: base=result break if result**2 == objective: print(f'{result}**2 = {objective}') else: print(f'No existe una raíz exacta de {objective}')
Relaciono mi código y como veo que varios estamos interesados en medir el tiempo de ejecución, este script también imprime el tiempo que se demora ejecutando:
import time tiempo_inicial = time.time() objetivo = int(input('Escoge un entero: ')) respuesta = 0 while respuesta**2 < objetivo: print(respuesta) respuesta += 1 if respuesta**2 == objetivo: print(f'La raiz cuadrada de {objetivo} es {respuesta}') else: print(f'{objetivo} no tiene una raiz exacta') print(f'El programa demoró {time.time() - tiempo_inicial} segundos ')
Aquí el resultado:
RESUMEN: Enumeración exhaustiva
Consiste en enumeras todas las posibilidades. Y en cualquier caso es el prier algoritmo que debo descartar, si bien no es tan eficiente respecto a otros, es muy efectivo. Se le puede llamar adivinia y verifica.
if __name__ == '__main__': entero = int(input('Por favor digita un número para calcular su raíz cuadrada exacta: ')) respuesta = 0 while respuesta **2 < entero: print(respuesta) respuesta +=1 if respuesta**2 == entero: print( f'La raíz cuadrada exacta de {entero} es {respuesta}') else: print(f'La raíz cuadrada exacta de {entero} no existe')
Lo que estoy haciendo en el código anterior es que tome el número que le entregué y me lo eleve a la segunda potencia
Dentro del iterador tengo un condicional que servirá para detener mi ejecución, empiezo a iterar desde 0 a n asignado a la variable respeusta, si mi respuesta
tiene raíz exacta su potencia será igual al número entero que ingrese. Es decir estoy preguntandole: ¿Qué número elevado a la 2 me devuelve mi número?
Para mayor información: