No evites la fuerza bruta, pero aprende a construir y mejorarla.
La resolución de problemas se trata de hacer el trabajo mientras se optimiza el uso de los recursos. Eso incluye no solo el tiempo y las necesidades de almacenamiento del algoritmo, sino también el trabajo que pones para diseñarlo e implementarlo, y quizás aún más importante, el tiempo y el esfuerzo mental que alguien más dedicará a descubrir cómo funciona y si es correcto.
Las soluciones de fuerza bruta suelen ser las más fáciles de diseñar, implementar y comprender, y es por eso que siempre debe probarlas primero. Cuando la fuerza bruta funciona, puedes pasar felizmente a resolver otros problemas. Cuando no lo hace, bueno, probablemente no estés usando lo suficiente. Es una broma. Cuando no funciona, descubres por qué y luego mejoras el algoritmo. Puede encontrar ineficiencias en una implementación mediante la creación de perfiles.
- ¿Qué aplicación utiliza el algoritmo?
- Dada una expresión matemática 2 + 4 * 6 + 8-11, ¿cómo la colocaría entre corchetes de manera que proporcione el valor máximo? ¿Es posible codificar esto?
- ¿Hay algún algoritmo de corrector ortográfico de aprendizaje no supervisado?
- He resuelto unos 52 problemas en SPOJ. ¿Debería mudarme a Codeforces ahora?
- ¿Hay alguna razón para almacenar cosas en una lista en lugar de un árbol?
El diseño de algoritmo iterativo es la mejor manera de aprender sobre el problema en cuestión. Casi todos los algoritmos famosos son mejoras a los de fuerza bruta o se basan en ideas sobre por qué los de fuerza bruta son ineficientes. Tome el algoritmo KMP, por ejemplo, que se basa en una observación sobre la búsqueda de cadenas ingenua.
Aquí hay algunas citas que capturan estos pensamientos de manera sucinta:
No pienses demasiado, a menos que sea absolutamente necesario. (Klaus Sutner)
La optimización prematura es la fuente de todos los males. (Don Knuth)
La ingeniería se realiza con números. El análisis sin números es solo una opinión. (Dave Akin)