the force brute algorithm brute-force

algorithm - force - ¿Es una mala señal la preferencia por las soluciones de fuerza bruta?



the algorithm pointers (14)

Soy un programador principiante de C ++, y para estirar mi mente, he estado probando algunos de los problemas en projecteuler.net . A pesar del interés en las matemáticas en la escuela, me he encontrado buscando automáticamente soluciones de fuerza bruta para los problemas, en lugar de buscar algo simplificado o elegante.

¿Suena esto como una mala mentalidad? Me siento un poco culpable haciéndolo así, pero tal vez rápido y sucio está bien parte del tiempo ...


¿Encaja dentro de la regla de tiempo de ejecución de 1 minuto para los problemas? Si es así, entonces su solución de "fuerza bruta" cumple con todos los requisitos, ¡y eso es una muy buena señal de que puede encontrar rápidamente algo que funcione!

Este tipo de problemas fomenta la micro-optimización y los algoritmos muy inteligentes, pero en general una implementación directa muy legible será mucho más fácil de mantener, y será favorecida en el mundo de los negocios.


Creo que deberías ver cuál es tu objetivo final y cuáles son tus limitaciones.

A veces, un método de fuerza bruta puede resolver un problema en 50 ms probando cada combinación de soluciones y una solución "inteligente" puede resolverlo en 10 ms. En ese punto, la solución menos inteligente pero más fácil de entender supera a la solución inteligente.

Sin embargo, hay algunos problemas donde el forzamiento bruto no solo será poco elegante sino que simplemente no funcionará. Hay muchos problemas en los que si intentas ingenuamente forzarlos en bruto, tomará una cantidad significativa de tiempo resolverlos. Entonces, obviamente, este tipo de problemas necesitan un enfoque más elegante.

Entonces pregúntese, ¿por qué está intentando estos problemas de Project Euler? ¿Lo estás haciendo para aprender? Entonces, tal vez intentar una solución inteligente sería lo mejor para usted, pero solo después de haber probado inicialmente una solución de fuerza bruta para comprender el problema.

Al hacer los problemas de Python Challenge, trato de hacerlo de la forma más breve posible, superando los límites de mis habilidades. Después de resolverlo, reviso las respuestas de otras personas y tomo notas mentales de personas que eran más inteligentes que yo y lo que hacían. Algunas personas harán un uso especial de una estructura de datos que no había pensado que sea más adecuada para la tarea o tendrán pequeños trucos matemáticos que usarán para hacer que su algoritmo sea más eficiente. Al final, intento absorber la mayor cantidad de astucia posible y hacer que se muestre la próxima vez que se me presente un problema de naturaleza similar.


De alguna manera he pasado por esta evolución:

  1. Haz que compile
  2. Haz que funcione como se esperaba
  3. Descubre una solución que funciona
  4. Descubre una buena solución
  5. Descubre soluciones múltiples y encuentra la mejor
  6. Descubre soluciones múltiples y encuentra lo mejor para esta situación
  7. ?? no he llegado aún

De ningún modo. Obtenga el problema resuelto correctamente y completamente, luego hágalo más eficiente o elegante según sea necesario.

Eso no quiere decir que debe ignorar las mejoras obvias en el rendimiento ... Simplemente no se concentre en ellas hasta que comprenda mejor el problema.


Definitivamente no es una mala señal para la tendencia a la fuerza bruta, especialmente como principiante, ya que es posible que no sepa nada mejor. Especialmente con Project Euler, es una mala señal implementar un método de fuerza bruta y no revisar los comentarios para aprender un método más eficiente.

A menudo termino en el mismo barco en el que estás y es por eso que empecé a hacer problemas de PE: estaba implementando muchos enfoques de fuerza bruta y quería exponerme a soluciones más elegantes ...


Ken Thompson: "En caso de duda, use la fuerza bruta"


Las soluciones elegantes no fueron creadas espontáneamente; se derivaron de las soluciones de fuerza bruta cuando se requirió más velocidad o menos consumo de memoria de la solución actual.

Entonces no, no lo es. Así es como surgieron las soluciones elegantes.


No, esto no es malo. He tenido soluciones que eran tan elegantes que estaban equivocadas.


Si resulta ser una situación en la que "fuerza bruta" => "simple" y "elegante" => "compleja", la fuerza bruta gana. Y esto a menudo es verdad.


Yo diría que no, no es una mala señal. De hecho, te estás haciendo un favor al alejarte de las optimizaciones prematuras, que definitivamente es una buena cosa.


el aprendizaje es un proceso de fuerza bruta. Yo no diría que es malo. Al tratar de hacer algo de esa manera, es posible que notes un patrón. Creo que mientras estés pensando en algo y tratando de encontrar soluciones, aprenderás. Hay pocas personas que simplemente saltan a las soluciones más elegantes o eficientes.

Sería difícil convencerme de que las personas que intentan aprender alguna vez podrían llamarse malas. Excepto tal vez un malvado científico: P

buena suerte.


Como programador principiante, gastará más de su energía mental descubriendo cómo implementar cosas en C ++, en lugar de gastar energía en encontrar una solución inteligente para cada problema. Esto está bien, porque te da la oportunidad de explorar diferentes áreas de C ++ mientras trabajas en una variedad de varios tipos de problemas.

Cuando te vuelves experto en C ++ y no tienes que pensar en cómo hacer cada pequeña cosa, entonces podrás dedicar más tiempo a inventar soluciones que no sean de fuerza bruta.


Has ponderado tu opción. Si la solución de fuerza bruta hace el trabajo y funciona bien, es una buena solución.


Para poner esto en un contexto diferente:

Cuando utilizas una biblioteca que no conoces muy bien (para crear UI, por ejemplo) puedes resolver un problema simple de una manera perfectamente eficiente, aunque sabes que hay una "forma correcta" de hacerlo. Si tiene curiosidad y le preocupa que su código de fuerza bruta le haga parecer un imbécil, pronto encontrará la "forma correcta" de hacerlo (por ejemplo, los fines de semana o mientras duerme). Mientras tanto, a través de la fuerza bruta, tendrás algo que funcione.

De hecho, me olvido de usar fuerza bruta y empiezo a escanear la API para encontrar la solución "correcta". Esto es definitivamente un error en muchos casos. Si la solución de fuerza bruta es fácil de implementar, escala según lo necesite (realmente, si funciona), entonces olvídese de la solución correcta. Lo encontrarás lo suficientemente pronto (¡y muchas veces ya lo sabías!), Pero mientras tanto, resolviste el problema y pudiste pasar al siguiente.

Los bloqueos de ruta son terribles cuando se codifica, y definitivamente deberían evitarse más que las soluciones de fuerza bruta.