¿Cuáles son las formas de mejorar sus habilidades de resolución de problemas algorítmicos en la programación?

La gente pregunta constantemente sobre esta mierda, así que solo escribiré una respuesta en ella …

Si desea mejorar en algo como esto, todo lo que tiene que hacer es intentarlo, encontrar los límites de su conocimiento, investigar para completar esos límites, dedicar un tiempo a integrar su nuevo conocimiento y repetir.

El proceso no es tan complicado. Simplemente se enjuaga y se repite, se sigue presionando hasta que se resuelven los problemas y se mejora con el tiempo. Use libros y Google y lea explicaciones para completar los bordes, y siga intentando problemas cada vez más difíciles.

Vaya a HackerRank o CodeChef o al sitio que desee, comience con facilidad y vaya avanzando.

Eso es. Esto es todo lo que necesitas saber. El 99% de las preguntas sobre cómo aprender esto son innecesarias. A menos que esté a la vanguardia de todo esto, todo lo que necesita ya se ha escrito, y solo es un Google o un CLIF.


Y ahora es el momento de una perversa opinión, probablemente polémica …

Personalmente creo que el enfoque obsesivo en los algoritmos de hoy y el formato que tiene éxito para la programación competitiva es algo perjudicial y un poco desperdicio …

Puedo resolver esos problemas de esa manera, y he visto mucho de ese tipo de código, y la forma en que aprendes a codificar para esos problemas no es cómo quieres codificar para proyectos reales. Es rápido y breve y opaco y extraño.

Cuando estoy resolviendo cosas como esa, usaré estos nombres de variables desagradables, no descriptivas y condicionales de mierda, etc. y todo está preparado para correr lo más rápido posible, sin importar si alguna vez necesitaría correr tan rápido en cualquier Un mundo sano, y sin importar si las herramientas requeridas para hacer que marque algunas casillas lo hacen quebradizo en vez de extensible.

Tampoco entiendo que el esfuerzo sea estúpidamente rápido para resolver todos los problemas complejos (o al menos dentro de la limitada gama de problemas que normalmente se cubren).

En el mundo real, mis problemas están en dominios específicos a los que me he acostumbrado, y los problemas de nivel avanzado solo surgen una vez cada 2 o 3 meses aproximadamente, y luego puedo pasar 3 días trabajando en ello y llenando los vacíos de conocimiento y ver cómo la gente hace las cosas, etc., si quiero, para resolverlo bien. A nadie le importa.

La codificación competitiva y los problemas de algoritmos son muy poco realistas y han puesto un gran énfasis en una de las piezas más pequeñas (en el tiempo) del desarrollo de software real.

Es como si quisieras ser un jugador profesional de fútbol, ​​así que en lugar de jugar juegos reales, simplemente pasas todo el día intentando hacer malabares y hacer patadas arcoiris, porque sabes que eso es lo único que preocupa a los exploradores en este hipotético mundo loco.

Todo se ha convertido en una parodia absurda de sí mismo, y evita que las personas aprendan habilidades útiles o hagan cosas reales.

Algunas personas lo hacen porque simplemente lo aman y les rasca la picazón, y eso es genial.

Pero parece un tanto fastidio que el 90% de las personas que lo hacen estén presionando para obtener un sentimiento de desarrollo personal fuera de lugar en lo que esencialmente se ha convertido en una cultura glorificada de preparación para el SAT.

La cultura que se desarrolla a su alrededor es simplemente tonta y un desperdicio colosal de capital humano.

Tal vez eso sea un poco demasiado predicativo, pero la magnitud de estas cosas, y lo que veo en Quora todos los días destaca el absurdo de todo esto.

Gracias por la A2A.

La respuesta simple es “práctica”. Practique resolver muchos problemas diferentes con diferentes tipos de algoritmos en diferentes circunstancias.

Sin embargo, antes de comenzar a practicar, asegúrate de que realmente entiendes la razón por la que estudiamos los algoritmos. Los algoritmos son solo estrategias para resolver problemas. Cualquier problema puede tener muchas soluciones, y algunas soluciones serán mejores que otras. Aprender sobre diferentes soluciones no es suficiente.

Puede usar un enfoque simple de fuerza bruta en casi cualquier problema y obtener el resultado correcto, pero eso no lo convierte en una buena solución. Entonces, estudiamos algoritmos para aprender sobre diferentes soluciones y por qué una solución es mejor que otra. Por lo general, se reduce a eficiencia, pero esa no es toda la historia.

Estaba a la mitad de mi curso de algoritmos del segundo semestre cuando lo “obtuve”. Hasta ese momento no tuve problemas para implementar los algoritmos y comprendí que podría haber muchas maneras de lograr la misma solución. Luego nos metimos en la clasificación de las listas enlazadas y me di cuenta: la mejor solución no solo es eficiente, sino que se adapta a las limitaciones del problema y al resultado deseado.

Lo menciono porque practicar muchos algoritmos diferentes para muchos problemas diferentes no es suficiente para crear experiencia. Para ser realmente bueno en los algoritmos, necesita practicar el análisis de las cuatro partes de un problema:

  1. ¿Cuál es el resultado deseado? Es decir, ¿qué problema estás resolviendo?
  2. ¿Qué suposiciones se están haciendo? Es decir, ¿qué entorno o restricciones ya están establecidas y no se pueden cambiar?
  3. ¿Cuáles son las diferentes estrategias para lograr el resultado? Es decir, ¿cuáles son los enfoques alternativos para resolver el problema?
  4. ¿Cuáles son las compensaciones en cada estrategia? ¿Qué es lo bueno o lo malo de cada enfoque posible?

Desafortunadamente, el número 2 a menudo se pasa por alto y, en última instancia, es lo que marca la diferencia entre un programador experto y uno promedio.

Entonces, para mejorar tus habilidades en la resolución de problemas algorítmicos: practica, practica, practica y practica un poco más.

  • Practica resolver muchos problemas diferentes: ¿qué estás tratando de lograr y por qué?
  • Practique diferentes métodos para resolver el problema: ¿cuáles son los pasos para implementar una estrategia específica?
  • Practicar la identificación de los supuestos detrás del problema: ¿cuáles son las restricciones y cómo afectan la solución?
  • Practicar el análisis de las compensaciones entre diferentes métodos: ¿qué hace que un enfoque sea mejor e introduce nuevas restricciones?
  • Practique cuestionando los supuestos: ¿qué cambia si cambian las restricciones?
  • Practica cambiando tu estrategia: ¿qué pasa si hago esto en lugar de eso?
  • Practique la misma estrategia para un problema diferente: ¿dónde más puedo aplicar esto?

Y no tienes que limitarte a los problemas de programación. Puede practicar algoritmos en casi cualquier problema, una vez que comience a utilizar un enfoque analítico y aprenda a hacer las preguntas correctas. Practique cuestionando todo y aprenderá cómo diseñar las mejores soluciones.

Oh, eso es bastante fácil de responder: entrenar.

Me gusta: entrenar mucho .

Y nunca dejes de expandir tu zona de confort.

En CodeWars, recuerdo (con vergüenza, ok) tener que hacer una mueca de cómo crear un bucle for para mi primer kata JS; Pocos meses después de eso , mi JS estaba más o menos a la par con mi Python (mi lenguaje más fuerte en ese entonces).

Y recuerdo con cariño que comencé a pensar en mi primer regex kata pensando “bueno, nunca lograré aprender esto”. Después de unos meses , terminé entrenando a otros en expresiones regulares, incluido un desarrollador mucho mayor que yo y / o obteniendo un título de CS (no tengo uno, por supuesto), por no mencionar que hoy creo que sería una mayor problema es no resolver muchos problemas diferentes (incluidas las cosas que no están basadas en cadenas) sin ellos 🙂

¿Es suficiente? Bueno, realmente es así de simple si no te detienes y te ciñes a mi regla de oro para aprender: No. Día. Apagado.

Espero que esto ayude y feliz codificación 🙂

Me gusta usar la diagramación. Pero en lugar del formato de esquema lineal típico, usar un diagrama de forma libre como el que se usa en el mapeo mental.

Si no está familiarizado con el mapeo mental, le sugiero que investigue el término.

El mapeo mental implica una idea o problema central, con múltiples brazos que se extienden hacia fuera. Cada brazo representa un escenario o una declaración “si, entonces”. El resultado de cada si, entonces la declaración se convierte en un subproblema o problema condicional que puede tener brazos que se ramifican desde él.

El mapeo mental ha demostrado ser útil en muchas áreas de mi vida, incluso, quizás especialmente, en aquellas que no son cuantificables.

No tengo ni idea de si tengo credenciales para responder esto, aunque se me haya pedido.

Ten una porción de tu vida que sea rutinaria. Conozca profundamente la rutina, busque ineficiencias, cosas que podrían hacerse mejor con un cambio en la secuencia, con algo más al mismo tiempo.

Para mí, es el desayuno. Al final del proceso, he leído el periódico de la mañana, café preparado. Se consumen 3 tazas. Desayuno ingerido. Se vació el lavavajillas y se cargaron los platos de desecho.

Esté al tanto de la secuencia, redundancias, oportunidades de paralelismo, duración.

Editar el proceso, para mejorar.

A lo largo del día, encuentre tiempo para detenerse en lo que acaba de suceder. Conjetura de la forma en lo que sucederá después ¿Qué puede alterar el resultado, y por qué?

En cada paso, intente tomar la observación específica del qué y el por qué en una regla general subyacente, luego patee los neumáticos de esa regla para determinar si es útil o incluso verdadero.

Como siempre, la mejor manera es practicar, por supuesto, practicar diferentes tipos de problemas con diferentes tipos de formas / algoritmos, creo que es la mejor manera de mejorar sus habilidades en programación y resolución de problemas algorítmicos. El uso de OOAD, especialmente el uso de UML, en sus proyectos también contribuirá definitivamente a su mejora.