En general, los programadores principiantes (novatos) llegan a una solución que es un enfoque de fuerza bruta. Lo cual no está mal para empezar. Todo lo que tiene que hacer es pensar dónde puede reducir la complejidad.
Esto es lo que te sugiero que hagas:
Anote su solución:
- ¿Es cierto que si entendemos los algoritmos podemos entender todos los programas difíciles de todos los idiomas?
- ¿Alguien puede proporcionarme un algoritmo de muestra en CS para ISC 2017?
- ¿Debería alguien que se aplica a un campo de arranque de desarrollo ya saber cómo escribir una función para sumar una matriz multidimensional?
- ¿Alguien puede ayudarme a resolver el problema SPOJ "Consulta en un árbol" (QTREE)?
- Cómo eliminar un elemento específico y reducir el tamaño de una matriz en Java
Hágalo en una pizarra grande o en papel, analice el componente clave de su programa, su solución debería poder traducirse en uno o varios métodos individuales. Tener componentes separados para diferentes soluciones no está nada mal. Asegúrese de que su algoritmo clave esté en uno de los métodos solamente.
Analiza tu solución:
Esta es una de las partes más difíciles, descubra la complejidad de su solución. Si no está seguro de cómo averiguar la complejidad de la solución, le sugiero que lea los capítulos 2, 3 y 4 (este es para darle una mejor idea sobre el análisis de complejidad) de Introducción al algoritmo de CLRS.
Encontrar los puntos de dolor:
Puede reducir la complejidad de la mayoría de los problemas (a veces) clasificando el conjunto de datos. Recuerde que no va a reducir su carga de trabajo por mucho, pero definitivamente reducirá el tiempo cuadrático a [matemáticas] O (n \ log n) [/ matemáticas] en algunos casos, lo cual es mucho mejor que eso.
Trabajar en un conjunto de datos ordenado es la mayoría de las veces mejor que trabajar en un conjunto de datos no ordenado. La clasificación hace que la búsqueda en un conjunto de datos determinado sea muy fácil.
Recuerde que la clasificación no siempre es una solución:
Es común entre las personas clasificar los elementos, pero recuerde que no siempre le ayudará si se supone que debe encontrar [math] m [/ math] elementos más grandes de la lista no clasificada de [math] n [/ math] de elementos, puede usar el algoritmo de selección (algoritmo de selección – Wikipedia). El peor de los casos para este algoritmo es [matemática] n [/ matemática].
Reduzca el número de bucles secuenciales:
Reduzca el número de bucles secuenciales, al final no importa tanto, pero es solo una mejora de micro nivel en su programa.
Reduzca el número de bucles anidados:
Intente averiguar los lugares donde puede eliminar el bucle anidado, a veces un bucle dentro de un bucle parece anidado pero se ejecuta n veces.
Utilice bibliotecas incorporadas para la operación conocida:
No intente reinventar la rueda, la mayoría de los lenguajes de programación le brindan una amplia cantidad de herramientas que lo ayudarán a resolver la clasificación, la búsqueda, etc.
Los hashmaps no son la solución a todos los problemas:
La mayoría de las personas que conozco tienden a usar mucho Hashmaps. Recuerde siempre que puede resolver muchos problemas, pero también ocupa una gran cantidad de espacio. Si puede resolver problemas usando listas o matrices, simplemente hágalo.
CLRS es útil:
Le recomiendo que vaya con las declaraciones de problemas de CLRS, que lo ayudan mucho a comprender problemas similares que podría enfrentar al resolver un problema y el enfoque de la mayoría de ellos le da una idea clara de un problema similar. El manual de diseño de algoritmos de Steven Skiena también es bueno.
Práctica:
Cuantos más problemas practiques, más ganarás.