¿Cómo puedo mejorar mi habilidad de resolución de problemas algorítmicos?

Mi consejo sería centrarse en comprender las ideas muy profundamente. Muchas personas se centran demasiado en los detalles mecánicos de un algoritmo sin entender suficientemente el proceso de pensamiento detrás de él. Desafíese a pensar profundamente y entienda realmente por qué un algoritmo está diseñado de la manera en que lo está, si se puede generalizar para resolver problemas relacionados, y cuáles son sus limitaciones, casos extremos y casos degenerados. En mi experiencia, las personas generalmente aprenden dos cosas cuando se trata de una técnica en particular:

1. Los detalles mecánicos. Por ejemplo, cómo calcular una integral, o los pasos necesarios para insertar un valor en un max-heap.
2. La forma de aplicar una técnica a situaciones del mundo real. Por ejemplo, cómo usar integrales como una herramienta útil para realizar cálculos, o cómo usar montones para resolver problemas en los que es útil tener una cola de prioridad.

Una vez que las personas han aprendido esas dos cosas, a menudo piensan que saben todo lo que hay que saber sobre el concepto. “Sé lo que es un montón, cómo codificar uno y cómo aplicar uno para resolver problemas. ¿Qué más podría haber para saber?”

Intenta ir más allá de eso y busca un tercer nivel de comprensión. Pregunte “¿Cómo alguien pensó en esta idea?”. Encuentra en tu mente una secuencia de pensamientos plausible que te lleve a redescubrir la idea . No tiene que ser históricamente exacto; es decir, no tiene que ser el mismo proceso de pensamiento que llevó al inventor del algoritmo a descubrir originalmente la idea. Tienes la ventaja de la retrospectiva para guiarte. Encuentre una secuencia de pensamientos que tenga sentido para usted y haga suyo el descubrimiento.

Por ejemplo, supongamos que busca comprender los árboles de búsqueda de equilibrio automático. Piense en el problema en cuestión: para crear una colección dinámica que admita operaciones rápidas de inserción, eliminación y búsqueda. Supongamos que ya has inventado el concepto de una lista enlazada. Podría tener la idea de que, para permitir operaciones más rápidas, puede mantener más que los punteros de cola y encabezado en la lista enlazada, puede mantener los punteros K que se distribuyen uniformemente en toda la lista enlazada. Si ajusta K para que sea [math] \ sqrt n [/ math], puede obtener [math] O (\ sqrt n) [/ math] insertar, eliminar y encontrar. Sin embargo, esta es todavía una estructura bastante plana, y se tiene la idea de hacer esto jerárquicamente. Encuentras que al hacer inserciones o eliminaciones, es difícil mantener el mismo número de hijos para cada padre y aún así obtener un buen tiempo de ejecución, por lo que permites que ese número varíe entre, por ejemplo, 2 y 4. Felicidades, has inventado Algo parecido a los árboles 2-3-4.

Cuando “adoptas” una idea como esa, tomando posesión de ella en tu propia mente, obtienes el poder de modificarla a voluntad para satisfacer tus necesidades. El camino que lo llevó a una idea a menudo se puede continuar, o retroceder y desviarse en otra dirección, para encontrar una idea relacionada para resolver un problema relacionado. Ve de una vez las fortalezas y debilidades de la idea actual, dónde puede generalizarse, dónde no puede tener éxito, por qué se hace de la manera en que se hace y no de alguna otra manera, qué formas alternativas podría haberse hecho, y todo lo que puede informar a la búsqueda.

Quizás lo más importante, a medida que practicas el proceso de pensamiento de la invención, entrenas tu mente para ser mejor inventando.

Además de leer todos los libros y el material en línea como sugieren las otras respuestas, recomiendo hacer algo diferente y convertirlo en una rutina diaria.

Cuando me estaba preparando para la entrevista de colocación, constantemente sentía que me quedaba algo y que a mi preparación le faltaba algo. Así que empecé a hacer este ejercicio que solía llamar ‘Una pregunta al día’. Simplemente señale que tiene que resolver un problema relacionado con el algoritmo todos los días a las 6 am. Puede que sea una persona de la noche o que se despierte a las 7 de la mañana, pero este problema de las 6:00 am debe resolverse. Incluso si está dormido, active la alarma, despierte, resuelva el problema y quizás vuelva a dormir.

Esta regularidad ayuda mucho. Por supuesto que estás leyendo todos los libros y practicando una hora o dos al día prácticamente para aprender, pero cuando esto se agrega a eso, hace maravillas. Porque algo que hiciste a las 6 am, especialmente después de sacrificar tu sueño y comodidad, no puedes olvidarlo fácilmente. Y siempre que encuentre un problema similar, no tardará más de un minuto en recordar cómo lo hizo antes.

Más fácil decirlo que hacerlo, por supuesto. Pero créeme, funciona.

Y si tiene que ver con los libros que Ankita Priyadarshini Nallana ya recomendó uno bueno, diría que lea el libro “Estructuras de datos y algoritmos de Tata mcgraw hills también.

H i

Esta es una buena pregunta ya que aborda dos conceptos que los nuevos programadores no “entienden”. Primero, que necesitan comenzar a pensar de manera diferente, Segundo, que necesitan comenzar a hacer y experimentar.

Aquí hay un gran libro sobre este mismo tema, vea aquí: Introducción a la resolución creativa de problemas: Amazon.es: V. Anton Spraul: 9781593274245: Libros Tengo este libro y es muy bueno para los mini desafíos y para los más atractivos. Un cerebro en una tarde lluviosa de sábado.

Lo que este libro muestra es que pensar como un programador es una habilidad que puede desarrollar con el tiempo, esencialmente, le enseña cómo “ver” un problema, descomponerlo y abordar cada parte con soluciones de programación “típicas”. También te enseña “haciendo” con pequeños ejercicios y desafíos.

Espero que hayas encontrado útil esta respuesta, si es así, comparte el amor y promueve 😉

R egards, robin.

La pregunta es incompleta. ¿Qué tan familiarizado estás con resolver problemas?

Intentaré ser lo más general posible.

Hay 2 formas de aprender a bailar :

  1. Vaya a Amazon y escriba “El mejor libro para aprender a bailar” y compre el más relevante según su instinto. Lee cada página Incluyendo la portada.
  2. Solo baila.

Bueno, eso fue un poco exagerado!

Bromas aparte.

No hay otra manera mejor de mejorar sus habilidades de resolución de problemas en lugar de resolverlos usted mismo. Puedes probar tus manos en programación competitiva. Para aquellos que no conocen la programación competitiva, es un deporte que se realiza en línea, donde los participantes programan de acuerdo con las especificaciones proporcionadas. Se le dará una declaración de problema y la muestra de entrada y salida correspondiente. Su tarea es escribir código (en un idioma de su elección) y asegurarse de que pase todos los casos de prueba. Los casos de prueba varían en su tamaño. Si su enfoque para resolver el problema es ineficiente, quizás pase solo unos pocos casos de prueba. Sin embargo, si lo ha optimizado, al escribir un algoritmo eficiente, puede estar seguro de que se pasarán todos los casos de prueba.

Hay una plenitud de plataformas de programación competitivas disponibles en línea. HackerRank es la mejor manera de comenzar . Los problemas aquí, son de nivel fácil y moderado. La interfaz de usuario también está limpia y le brinda una mejor experiencia de usuario al escribir código en el editor de códigos en línea que se proporciona. Se le dará la lista de casos de prueba que su solución ha pasado y el tiempo correspondiente.

Si ha terminado con Hackerrank y todavía tiene hambre de resolver problemas, diríjase directamente a la Competencia de Programación, el Concurso de Programación, la Programación de Computadoras en Línea (Codechef).

Si ya estás familiarizado con la programación competitiva, solo tienes que seguir practicando. Intente resolver una amplia variedad de problemas, como la programación dinámica, gráficos, etc., no se limite con problemas ingenuos relacionados con la implementación. Aunque tenga la solución correcta, intente buscar la solución de otros que hayan tenido un mejor desempeño en la tabla de líderes. De esta manera aprenderá nuevas formas (quizás mejores) para lograr la misma tarea. Lee editoriales si te quedas atascado. Implementar el algoritmo que se da en la editorial.

Aquí hay una lista de respuestas en Quora que pueden ser útiles y relevantes en este contexto:

Respuesta del usuario de Quora a ¿Cuál es la mejor manera de aprender y dominar C ++ y STL a partir de un nivel de principiante, para una codificación competitiva?

Respuesta del usuario de Quora a ¿Cómo debo aprender los algoritmos si soy débil en matemáticas?

Respuesta del usuario de Quora a ¿En qué orden debo aprender algoritmos para mejorar dramáticamente en programación competitiva?

Respuesta del usuario de Quora a ¿Cuáles son algunos algoritmos que incluyen DFS?

Bueno, depende de en qué parte de las matemáticas no seas bueno. Por ejemplo, si eres malo en cosas como la diferenciación, el cálculo, etc., no debería afectar tu capacidad para convertirte en un buen algoritmo. Es posible que necesite estos temas para algunos algoritmos específicos de dominio, como los utilizados en mecánica de fluidos, CAD, etc.

Por otro lado, si estás luchando con temas como matemática discreta, teoría de grafos, probabilidad y combinatoria, etc., te sugiero que refuerces tus fundamentos. Estos son necesarios para llegar a soluciones.

Otra forma, lo sugiero, es leer Introducción a los algoritmos, de Cormen, Leiserson, Rivest y Stein, e implementar los algoritmos mencionados allí. Mientras implementa esos algoritmos, lea lo que se describe sobre cada paso de los algoritmos. El único inconveniente es que esto nuevamente requiere conocimientos en matemáticas discretas, teoría de grafos, etc.

Mucha gente ha respondido “práctica”, lo cual es una buena manera de mejorar en CUALQUIER COSA. Pero agregaría algunas cosas específicas a la programación …

  • Elija proyectos simples y “divertidos” como intentar implementar juegos simples o generar series como los números de Fibonacci. Averigua todo lo que puedas sobre cómo escribir el programa, luego observa las respuestas si es necesario.
  • Podría ayudar a pensar por un momento en el “pseudo código”. Esto simplemente significa escribir la solución al programa, paso a paso, en instrucciones simples en inglés (o en algún otro idioma natural). El objetivo de esto es centrarse intensamente en la lógica del problema a resolver y no preocuparse por la sintaxis hasta más tarde.
  • Toma un problema y divídelo en pasos más pequeños. Luego, pasos aún más pequeños, hasta que cada paso sea absolutamente claro y no ambiguo. En ese momento, ha escrito el pseudocódigo, que no es difícil convertirlo en sentencias de C ++ o las sentencias de otro lenguaje informático.
  • Recuerde, siempre piense en términos de bucles … deje que la computadora haga el trabajo duro de las operaciones repetidas, porque no son difíciles para una computadora en absoluto, en contraste con un humano, que podría aburrirse.

Mi libro, C ++ Without Fear, 3rd Edition, hace un uso extensivo del enfoque de pseudo-código, y también explica por qué las técnicas de algoritmos específicos, como los bucles, la toma de decisiones, las estructuras de control anidadas, la iteración y la recursión funcionan.

¡Escribiendo programas!

Para mejorar tus habilidades de programación necesitas escribir programas todos los días. Mientras hace eso, debe estudiar cómo funcionará su código internamente (dentro de la CPU). Esto te ayudará a hacer códigos mejores y más eficientes.

Inscríbase en algunos concursos de programación en línea como HackerRank, CodeChef, TopCoder, etc. Esto mejorará aún más sus habilidades de resolución de problemas exponencialmente.

Espero que esto ayude.

Creo que te refieres más a la programación competitiva. Un algoritmo es solo un conjunto de instrucciones que juntas realizan una tarea.

Para ser bueno en esto necesitas leerlo y practicar. Mucho. No solo memorice los algoritmos clásicos listados en los libros, sino entiéndalos .

En general, no codificará sus propias implementaciones de estos algoritmos estándar, ya que ya se han escrito y optimizado. Es posible crear un algoritmo similar que sea mejor en algunos casos, pero generalmente no lo hará. En la mayoría de las situaciones es malo incluso intentarlo.

Dicho esto, realmente deberías aprender esto. Definitivamente recomiendo el libro de McCormick que figura en otra respuesta. También soy un fan de Grokking Algorithms. Es muy fácil de entender y podría ser un mejor vistazo en función de su conocimiento actual.

https://www.manning.com/books/gr

Resolver algoritmos es una de las fases más comunes y, a menudo, difíciles de las entrevistas técnicas.

La mayoría de los candidatos no pueden superar esto con éxito.

Aquí están los tres pasos que necesitas

1- Comprender y repetir la pregunta

Lo primero que debe hacer es prestar mucha atención a la pregunta.

Pregunte a los entrevistadores si algo no está claro. Una vez que se sienta cómodo con su comprensión, lo siguiente que debe hacer es repetir la pregunta en voz alta y clara.

Esto asegurará al entrevistador que usted ha entendido su pregunta.

2- Explica tu enfoque para resolver las preguntas

El error número 1 que comete el 95% de los candidatos es que saltan inmediatamente para resolver la solución en la pizarra.

Este es el enfoque equivocado. La forma correcta de hacerlo es explicándolos de qué formas posibles se puede resolver el problema.

Por qué y con qué enfoque resolverás el problema. Si hay algún problema con su enfoque, entonces el entrevistador le proporcionará sus comentarios al respecto o aclarará las preguntas nuevamente.

3. Diseñar un pseudo código

Hasta ahora, tienes la solución en la mano, pero aún así debes resistir la tentación de resolver el problema directamente. En su lugar, debe diseñar el pseudo código para su solución.

Comprenda que la mayoría de los problemas serán de naturaleza algorítmica, y la mejor manera de resolverlos es diseñando un esquema general utilizando pseudo código.

De nuevo, al hacer esto, obtendrá una respuesta inmediata para su solución y, si hay algunas lagunas, puede ajustarlas incluso antes de saltar a la implementación completa.

4- Escribir la implementación completa

Ya has explicado la solución, genial.

Has mostrado tu pseudo código al entrevistador, Fantástico. Y, finalmente, ahora es el momento de ir con la implementación completa en la pizarra.

Gran parte de la ansiedad ya se te quita, ya que en tu mente tienes la solución y el esqueleto que debes seguir.

Ahora su enfoque del 100% debe estar en la implementación óptima.

lea más en: Algoritmos de Java Preguntas de la entrevista

Buena suerte

Practica … practica … practica … resuelve más problemas …

Intenta resolver muchos tipos de problemas. Leyendo más libros de algoritmos.

Después de resolver el problema, intente leer el código de la solución de un experto.
Compara tu solución con un experto. Aprende de eso (la complejidad, la simplicidad).

Cuanto más codifiques, mejor serás, es así de simple. Al codificar, estás practicando. Pero la mejor práctica es la práctica deliberada .

La práctica simple no es suficiente para ganar habilidades rápidamente. Para beneficiarse de la práctica y alcanzar su potencial, tiene que “desafiarse constantemente” a usted mismo.

Cuando estés listo, únete a la competencia de programación (programación competitiva). Al unirte a la competencia, puedes mejorar tus habilidades de codificación y pensamiento.

Convertir una descripción de un problema en un programa es una cuestión de (a) comprenderlo a fondo, (b) dividir el problema en partes cada vez más pequeñas y (c) convertir esas piezas en líneas de código.

El paso (b), en el que varias veces descompones partes del problema hasta que tienes pasos fundamentales muy cortos, es la parte más difícil para algunas personas. Busque las palabras clave en el problema para ayudar. Por ejemplo, cuando el problema dice “si X, haz Y, de lo contrario haz Z”, estás viendo una estructura de código if-else. Si tiene que elegir entre una de varias cosas, entonces está mirando una escalera de if-else-if o un interruptor. Si el problema requiere que calcules una suma, un promedio, etc., eso implica una suma repetida en un bucle. Por supuesto, mantener todo en el orden correcto (es decir, hacer esto antes de eso) también es sumamente importante.

Algunas personas encuentran que el diagrama de flujo les ayuda a visualizar los pasos, las decisiones, los bucles, las llamadas a funciones, etc. y el flujo general en el que ocurren las cosas. Escribir un diagrama de flujo antes de escribir cualquier código puede, para algunas personas, realmente aclarar el desglose del problema, haciendo que la codificación sea mucho más rápida y fácil. (Sin embargo, escribir un diagrama de flujo después de escribir el código, como escribir un esquema después de escribir un informe de un libro, es una pérdida de tiempo).

Estructuras de datos. Serán la parte más importante de la vida de un programador. Al igual que cuando comienza a construir un algoritmo, su eficiencia en forma de espacio y tiempo se puede lograr mediante el uso de varias estructuras de datos. Según yo, dominar las estructuras de datos es el trabajo que se realiza a medias para escribir y comprender algoritmos complejos.

Gracias por la A2A.

¡Estaba en la misma situación en la que tú estás! Me fue difícil averiguar cómo controlar los algoritmos. ¡Me costó tanto entender los algoritmos en mi segundo año de ingeniería, que estaba a punto de fallar en las prácticas! Eso es cuando empecé a aprender y obtener una retención sobre los algoritmos. Espero que te ayude a ti también.

Primero leo la teoría y trato de entenderla. A veces es bastante fácil y sencillo de entender, pero a veces es realmente difícil digerir la jerga técnica. Entonces, trataría de entenderlo a través de ejemplos y a través de Google. A veces, hay animaciones y videos en YouTube que realmente simplifican el proceso de comprensión. El problema conmigo era recordar la teoría. Entonces comencé a escribir mi propio código e implementar los algoritmos que aprendí. Y eso realmente me ayudó a recordar los algoritmos.

De esta manera, no solo podría controlar los algoritmos, sino también mejorar mis habilidades de codificación. Espero que te ayude también 🙂

Eso es prácticamente lo que necesitas. Dm me para obtener el archivo pdf gratis. Este libro me lo ha dado un científico informático muy conocido en mi estado. No se puede revelar el nombre. Pero vale la pena. Puedes comprarlo o descargar la versión pdf gratuita disponible en línea.
Upvote lo ayudó. Me mantiene motivado

Intenta esto si nada más funciona lo que ya se ha dicho
Bienvenido a la resolución de problemas con algoritmos y estructuras de datos
PyAlgoViz

Podemos empezar a resolver problemas / rompecabezas. Este es quizás el mejor comienzo.

Echa un vistazo al periódico que tiene Sudoku, resuélvelo, ve rompecabezas de palabras, resuélvelos. Además de esto, toma tus juegos favoritos que involucran ejercicio mental.

Gracias por A2A Rushal.

Genial, ¿qué hay de tratar los problemas en el Proyecto Euler? http://projecteuler.net

Hay un montón de problemas allí, y por cada uno que puedas practicar al desarrollar un algoritmo. Una vez que obtiene una implementación lo suficientemente buena, puede acceder a las soluciones de otras personas (para un problema particular) y ver cómo otros lo han hecho. No piense en ello como problemas matemáticos, sino más bien como problemas al crear algoritmos para resolver problemas matemáticos

Ciertos juegos como el cubo de Rubik, el sudoku y el ajedrez están destinados a aumentar tu pensamiento algorítmico. Dicho esto, los desafíos de programación ayudan mucho, y puede obtener muchos en sitios como http://interviewstreet.com HackerRank y muchos más.

La forma en que convierto los problemas del mundo real en código es, primero, asegurarme de que realmente entiendo el problema. (En el mundo real, asegúrese de que el problema que se me pide resolver es el problema que el cliente necesita resolver. He sido mordido varias veces en este caso).

Desglose el problema en las funciones de pseudocódigo de nivel más bajo. Luego puedo implementar las funciones de pseudocódigo en el código real y probar cada función a medida que las escribo.

El pseudocódigo está en un lenguaje sencillo en mi caso y uso nombres de funciones y variables que tienen sentido.

Esto divide la resolución de problemas y la codificación en operaciones separadas y evita que se quede atrapado en el código de depuración antes de que se resuelva el problema.

Tal vez es bastante importante tener una buena fuente de problemas del tipo correcto, ya sea fácil o un poco por encima de tu nivel. Si puede desarrollar un buen flujo para pasar tiempo con problemas y equilibrar la comodidad y el estrés, entonces cualquier tiempo que dedique debe ser útil para desarrollar el pensamiento. Si nota que el proceso es lento, revise el proceso y pregunte qué pasos podría tomar / las preguntas que haga durante la resolución de otra situación como esa para mejorar ese aspecto. Pero es mejor reflexionar sobre las cosas, generalizarlas y recordarlas, que hacerlas siempre, a menos que eso sea todo lo que hay en un “problema” de rutina.