Si consideras la taxonomía de Bloom en el dominio cognitivo, te darás cuenta de que derivar algoritmos requiere ” síntesis “. La síntesis es el segundo nivel más alto en la taxonomía, lo que significa que naturalmente viene después de todo lo anterior: conocimiento , comprensión , aplicación y análisis .
En este momento, pareces ser bueno para obtener conocimiento y comprender . Parece que puedes aplicar lo que aprendes. Sin embargo, todavía tiene dos niveles de aprendizaje aún más altos para resolver problemas de algoritmos / programación. Tienes que usar el análisis y luego trabajar hacia la síntesis .
¿Qué incluye el análisis? Según Wikipedia, requiere que comience a “dividir la información en partes identificando motivos o causas”. ¿Has hecho eso con un tipo de fusión? ¿Sabes por qué repetidamente dividimos la lista original en dos partes? ¿Ha considerado por qué las acciones de clasificación de fusión conducen a un tiempo de ejecución [matemático] O (n \ lg n) [/ matemático]? ¿Entiendes por qué tienes que fusionar cada sublista en grupos de dos? ¿Ha analizado qué propiedades son verdaderas en cada punto del algoritmo? ¿Sabes por qué esas propiedades deben ser ciertas? Wikipedia dice que con el análisis debe considerar elementos, relaciones y principios organizacionales. Una vez que haya analizado algo, estará mejor preparado para sintetizar.
Estará mejor preparado para sintetizar porque comprenderá por qué John von Neumann diseñó la fusión de la forma en que lo hizo. Una vez que comprenda sus motivaciones de diseño, estará mejor equipado para modificar el algoritmo para cumplir con los requisitos cambiantes.
Y esa es la clave para resolver problemas de algoritmos. Primero adquiere conocimiento de cosas como estructuras de datos / algoritmos / paradigmas / análisis de tiempo de ejecución / pruebas / etc. Luego pasa tiempo comprendiendo cómo funcionan / cuáles son sus ventajas / cuáles son sus usos / cómo se derivaron / etc. Una vez Si lo has hecho, solidificas tu comprensión aplicando lo que has aprendido. Tal vez codifique una tabla hash desde cero. Tal vez implemente una solución eficiente para el problema de la brecha máxima que lee en línea. Con suerte, pasarás tiempo analizando las cosas que has aprendido a continuación. Divídalos en sus partes. Realmente los entiendo. Comprende el por qué además del cómo. Hazlos tuyos, como si fueran tus propios inventos. Conócelos por dentro y por fuera.
Entonces, cuando haya adquirido toda esta información, volverá al problema de clasificación de fusión. Después de analizarlo, comprenderá que el poder del tipo de fusión radica en el hecho de que puede fusionar listas comparando dos elementos a la vez de forma lineal. Con el cambio en los requisitos, ya no puede comparar dos elementos a la vez de forma lineal. En cambio, debe comparar los elementos [math] k [/ math] a la vez. Luego te preguntas, ¿cómo puedo encontrar el mínimo de elementos [math] k [/ math] en tiempo lineal o casi lineal? Lo bueno es que aprendiste el mes pasado que los montones binarios mínimos pueden hacer exactamente lo que necesitas. Entonces preguntas, ¿para qué necesito el valor mínimo? El primer elemento en cada una de las listas [math] k [/ math]. Entonces, si almacenamos el primer valor de cada lista en un montón binario mínimo, simplemente podemos reventar el mínimo. Luego, pensamos en lo que hizo el tipo de fusión bidireccional después de encontrar el mínimo. Lo insertó en una lista y luego movió el puntero a lo largo de la lista de donde vino el valor mínimo. ¿Cómo se traduce eso para nosotros? Podemos agregar el mínimo a una matriz de resultados. Sabemos de qué sublista extrajimos el mínimo, pero ¿qué significa avanzar el puntero en esa lista? Significa que ahora hay un nuevo número al principio de la lista, lo que significa que un nuevo número debe estar en nuestro montón mínimo. Entonces ponemos el siguiente número en el montón y repetimos. Parece que esa idea básica funcionará, y cada vez que hacemos una combinación de [math] k [/ math] -way de una lista de elementos [math] n [/ math], se necesita [math] O (n \ lg k) [/ math] tiempo.
Como puede ver, una vez que tenga un gran corpus de conocimiento de dominio, estará preparado para sintetizar . Tu mente hará conexiones entre diferentes algoritmos y estructuras de datos que conoces. Comenzará a conectar restricciones, patrones y paradigmas. Rara vez alguien produce un trabajo magistral sin aprender de los grandes antes que él. Mira a las grandes mentes de la generación anterior a nosotros. Lea los escritos de Knuth, Dijkstra, Rabin, etc. Aprecie lo que han hecho para el campo … y luego inspírese.
Finalmente, un gran componente de aprender a resolver algoritmos es creer en ti mismo. De Verdad. Eche un vistazo a usted y su investigación.
¡Buena suerte!
Editar: No estoy insinuando que debes pasar por cada etapa de la Taxonomía de Bloom antes de que puedas alcanzar la síntesis. Sin embargo, es una progresión natural y debería facilitar su trabajo. Puedes tener suerte a veces. Pero es mejor ser metodológico.