Enumeración exhaustiva
Clase 12 de 31 • Curso de Introducción al Pensamiento Computacional con Python
Contenido del curso
Clase 12 de 31 • Curso de Introducción al Pensamiento Computacional con Python
Contenido del curso
Juan Pablo Lozano
David Behar
Andres Rodriguez Tinoco
Josue Noha Valdivia
Moises Gonzalez
Adrian Avila Molina
Andrés Felipe Mesa David
Mauricio Rodríguez
Samuel Valeron Goez
Hiram Rodriguez Gomez
Mauricio Gonzalez Falcon
Sebastián Torres Tovar
Diana Yazmin
Maria Guadalupe Diaz Escobar
Marcos ismael Caballero reyes
Daniel Alejandro Cumaco Robayo
Jorge Cruz Perez
Daniel Franklin Chavez Sanchez
Karl Behrens Gil
Pablo Reyes Abarca
Daniel Serna
Sebastian Cifuentes
Luis Arturo Cruz Cruz
Luis Alejandro Vera Hernandez
Lorenzo Enrique Piñango Cerezo
Enmanuel Castillo
Gustavo Adolfo Guillén Villalba
Alejandro Giraldo Londoño
Erika Luna
Juan Camilo Maldonado Perez
Augusto Huerta
Israel Churata
HERNAN DARIO VELASQUEZ ORTIZ
Ronald Cuello
Oscar Humberto Godínez Paiz
B. Alejandro Rodriguez Ocaña
Luis Enrique Huamán Quispe
Kelvin Alejandro Miranda Ramirez
Julio Cardenas
Cristian Antonio García González
Eder Snchz
GUADALUPE GARCÍA VÁZQUEZ
Sebastián Torres Tovar
Yulisa Vanesa Rivas
Edgar Ocampo
Carlos Fernando Aguilar González
Alejandro Ching
edgar polo
David Yunta
David Behar
A punta de enumeración exhaustiva Dr Strange se puso a ver en que futuro los vengadores ganaban a Thanos
Quiero twittearlo, cúal es tu @ para etiquetarte?
Gracias a este comentario entendí mejor
Diagrama de flujo:
Por alguna razon, asi lo entiendo mucho mejor. Gracias!
Con que programa haces el diagrama de flujo?
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:
Esta genial, muchas gracias!
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.
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.
Gracias por el dato!
Gracias, excelente aporte Hiram
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
Gracias
muy bueno gracias
Este es el famoso metodo llamado "Fuerza Bruta", es el peor algorithmo de todos, aunque el tiene razon al decir que las computadoras tienen un gran poder de computo, imagina si tienes que hacer esa consulta miles de veces en un minuto, ahi es donde en CS, se mira la manera de utilizar mejores algoritmos para mejorar los tiempos y recursos del sistema, basado en parametros de "Time Complexity" y "Space Complexity"
Eso iba a decir, que tambien se conoce como fuerza bruta, bien ahi la llevamos, :)
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
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')
While, hasta que la condicion deje de ser verdadera For, hasta que la condicion sea falsa
:O
Tiene toda la razón
Excelente, muchas gracias por tu aporte companero
Excelente :)
Qué hermoso es todo esto!!! Aún sigo sin entenderlo jaja
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.
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:
si, está interesante lo rápido que lo hacen las computadoras.
Brutal!
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
a la mía le tomo 0.08 seg. :)
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.
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.
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.
Me está gustando mucho el curso .
Man como hace para obtener ese formato?
yo tambien tengo la misma duda :O
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!!!
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.
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.
Les recomiendo este vídeo para entender sobre los algoritmos https://www.youtube.com/watch?v=U3CGMyjzlvM
Gracias está excelente
ok
Algoritmo de fuerza bruta 😎
Les comparto un ejemplo de raíz cúbica, simplemente cambiamos el 2 por el 3 y modificamos la impresión de texto.
Muchas gracias, no lo habia pensado !!!
tuve que sentarme a leer la lógica detenidamente preguntándome el porque de cada cosa cuando lo entendi fue como :
A prueba de errores si introduces un valor de tipo float o string:
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}')