¿Cómo se puede ser bueno para resolver problemas de algoritmos / programación? Soy un principiante, y me sugirieron que leyera el libro CLRS para aprender sobre algoritmos.

Trabajando en muchos problemas algorítmicos / de programación (mucho, mucho pensamiento) y observándose de cerca (cómo piensa, qué lo ayudó cuando resolvió un problema, etc.).

Aquí hay pautas que yo mismo sigo:

  • Visualización.
    • Organice todo el problema con un diagrama: invente sus propias representaciones. Podría ser una estructura matemática: gráfico, red, red, matriz, recta numérica, figura geométrica, etc.
      • Organizar el problema con un diagrama es la única forma en que puede ver todo el problema de un vistazo.
    • Ampliar reducir
      • Trabaja en partes del problema, siempre vigilando el todo. Vea cómo los cambios en parte afectan al todo.
    • Piense en términos de abstracciones para reducir la complejidad.
  • Aprende abstracciones computacionales. “Explanation Based Learning (EBL)”: una vez que diseñe una abstracción que pueda resultar útil en otros problemas, generalícela y aprenda.
    • Control de abstracciones
      • Iteración
      • Recursividad
      • Retroceso recursivo
    • Estructuras de datos
    • Algoritmos
  • Una vez que se resuelve un problema, mire hacia atrás y aprenda nuevas estrategias, herramientas y técnicas. Hacer preguntas. Generalizar.
  • Aprenda organizando el conocimiento en ontología de dominio.
    • Organización de
      • Caja de herramientas de resolución de problemas
      • Abstracciones computacionales
  • Visualice cada estrategia de resolución de problemas, herramienta, técnica, algoritmo, paradigma algorítmico, patrón de diseño, abstracción computacional como estructuras y procesos.
  • Aprende errores comunes. Evítales. Desarrollar casos de prueba que rompan el código.
  • Acelerar.
    • Digitando rapido.
    • IDE.

Mi blog sobre el estudio de los algoritmos:
Organización del estudio y aplicación de algoritmos.

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.

Popular a la creencia contraria, no creo que la codificación de soluciones a problemas algorítmicos sea una forma generalmente efectiva de aprender algoritmos. Sin embargo, las personas que lo han hecho con éxito suelen ser buenas / rápidas para detectar patrones y resolver problemas orientados algorítmicamente.

Las estructuras de datos son algoritmos cristalizados [¿Cuáles son algunos ejemplos de “algoritmos cristalizados”?] Y [estructuras y algoritmos de datos] y tiene sentido comenzar a aprender estructuras de datos si desea dominar algoritmos. Personalmente, creo que van de la mano y deben ser aprendidos juntos.

Dicho esto, estos lugares son buenos lugares para comenzar a leer sobre algoritmos / estructuras de datos y tratar de resolver algunos problemas de ejemplo sin realmente escribir código para resolverlos.

Todas las páginas – PEGWiki
Categoría: estructuras de datos

En realidad, no necesita escribir código para resolver un problema de ejemplo, solo asegúrese de comprender la idea subyacente para resolverlo. Para comenzar, pruebe los problemas en los desafíos de programación y luego intente pasar a los problemas del Juez de Esfera en línea (SPOJ).

Mi pregunta para usted: ¿Alguna vez supo acerca de técnicas como Merge sort (o say Divide and conquer) antes de leerlo en CLRS?

Supongo que no, aunque aquí también tu frase “por qué no pensé así antes”. es aplicable. ¿Qué hiciste en este caso?
Acabas de estudiarlo, aprenderlo e implementarlo y ahora eres una especie de maestro en Merge Sort.
Lo mismo ocurre con otros problemas también.
Como eres un principiante, te sugiero que sigas esta estrategia:

  • Intente resolver el problema con técnicas ya conocidas durante aproximadamente media hora.
  • Si fallas, simplemente sé desvergonzado (sí, claro! Desvergonzado) y búscalo en Google. Estoy seguro de que encontrará algún método para superar su problema.
  • Estudíelo, apréndalo e impleméntelo.

A medida que pase el tiempo, verá que ahora puede crear soluciones al problema usted mismo. Ahora, sugiero que intente reducir la búsqueda y aumentar la parte del pensamiento porque esto es necesario y pronto …

También te encontrarás dando consejos a un principiante ….. 🙂

No trataría de recomendar algunos recursos, es decir, enlaces o libros, ya que existen miles de dichos recursos y estoy seguro de que alguien los mencionará.

Ver también:
¿Cuáles son algunas formas buenas y productivas de pensar algorítmicamente?

Pasar tiempo discutiendo problemas con personas que son buenas (y quizás mejores que usted) en Algoritmos / Resolución de problemas es una excelente manera de mejorar en Algoritmos. He tenido mucha suerte de tener compañeros de cuarto y amigos que son mucho mejores que yo en Resolución de problemas y Algoritmos. Estas personas han sido muy humildes y pacientes al compartir enfoques e ideas para resolver problemas. El tiempo que pasé con ellos me ayudó a mejorar mucho más rápido de lo que podría haberlo hecho. ¡Así que encuentra personas con ideas afines!

Leer libros ayuda, pero me pareció un proceso bastante lento. Encontré ver video conferencias una forma más rápida de entender técnicas / conceptos comunes. Hay varias series de video conferencias y cursos en línea de universidades como MIT, UC, etc.

Una vez que comprenda la idea esencial / básica de la conferencia en video, es una buena idea volver al libro de texto y leer / revisar el material a fondo. En última instancia, comprender el material es clave aquí. Una vez que comprenda el material a fondo, podrá detectar problemas que pueden resolverse utilizando lo que ya conoce.

descargo de responsabilidad: no soy un experto.

Oye ! Es bueno saber de ti que estás interesado en aprender programación competitiva. Te aconsejo que no vayas directamente porque puede reducir tu confianza. Simplemente ve a HackerRank a probar paso a paso en una MANERA estructurada -tiene la mejor interfaz de usuario en cualquier sitio web de programación competitiva en el mundo. Tome notas cuando lo considere necesario. Primero aprenda los conceptos, luego pruebe lo que ha aprendido. Aumentará su confianza, puede consultar el ranking.

Espero que esto funcione para ti .

Mis 2 centavos La mayor parte ya está dicho.

Una forma más de aprender es poner emociones (que en términos involucran nuestra mente subconsciente) en el problema. No es algo fácil, pero funciona cuando la visualización / progresión lógica / acercamiento – alejamiento / generalización – la especialización / mapas mentales ayudan pero no conducen a una solución final.

Por ejemplo, una información ordenada puede considerarse como un grupo de personas con diferentes alturas
las particiones pueden ser cubos de colores
los caminos de decisión pueden ser un laberinto en una densa jungla
Los problemas de conteo pueden involucrar a su hijo (s) para resaltar un caso especial
El trabajo más corto primero puede considerarse como un tipo vago contra un tipo activo

No estoy seguro si puedo explicarlo, pero de alguna manera poner emociones en el problema. Aprender es todo sobre el amor.

Busque eficiencia y simplicidad. Busque ejemplos del mundo real de los dispositivos lógicos que está creando. A medida que estos dispositivos se redujeron en Darwinally, la creación de código en ese estilo promueve la facilidad de adopción y la expansión de código abierto. La depuración y modificación se hacen más fáciles cuando tienes sistemas de pensamiento concisos y latentes.

More Interesting

¿Cuál es el orden cronológico de los algoritmos de reconocimiento facial?

¿Qué es lo más profundo que aprendiste al leer SICP?

¿Es mejor aprender estructuras de datos y algoritmos en C ++ o Java?

¿Cuál es el algoritmo de cifrado más complejo?

¿Cuántas permutaciones se pueden generar a partir de '10011111111'? Cual es la formula?

Como estudiante de primer año de una sucursal que no es CS en un IIT, ¿cómo domino las estructuras de datos, los algoritmos y el aprendizaje automático por mi cuenta?

¿Qué tipo de algoritmo SLAM utiliza Teslas? ¿O incluso están usando algoritmos SLAM?

¿Cuál es un ejemplo de un buen algoritmo que se puede usar para unir a diferentes usuarios dentro de un determinado radio en cualquier ubicación según sus preferencias?

¿Por qué es difícil estimar el tiempo de ejecución exacto de un algoritmo?

¿Cuál es una explicación intuitiva del algoritmo de optimización de aprendizaje profundo de Adam?

Cómo dominar las estructuras de datos y los algoritmos (DSA) para mejorar mis habilidades de resolución de problemas que eventualmente serán útiles en las entrevistas

Cómo calcular dos nodos distantes mínimos a partir de dos conjuntos de nodos en un gráfico

¿Cuáles son las diferentes formas en que puede obtener la longitud de una matriz en C ++?

¿Dónde puedo encontrar una biblioteca de estructura de datos de gráficos dirigida, implementada en Javascript?

¿Qué estructura de datos debo usar para completar esta tarea?