Cómo mejoré mis habilidades para trabajar con algoritmos, estructuras de datos y aprendí a usar todo esto en la práctica



De un traductor: hoy publicamos un artículo para usted de Fabian Terh . El artículo será principalmente útil para programadores novatos.

Soy un programador autodidacta, esta publicación refleja mi experiencia personal y habilidades en áreas tales como algoritmos y estructuras de datos; Además, hablo sobre formas de resolver problemas (por cierto, el segundo me es algo peor que el primero).

Skillbox recomienda: un curso práctico de dos años, "Soy un desarrollador web PRO" .

Le recordamos: para todos los lectores de "Habr": un descuento de 10.000 rublos al registrarse en cualquier curso de Skillbox con el código de promoción "Habr".

Problema: conoces la teoría, pero tienes dificultades con la práctica.


No hace mucho tiempo tuve un problema que se puede describir como "No sé lo que no sé", podemos decir una curiosidad. El hecho es que entiendo la teoría, y bastante bien. Sé cómo funcionan las listas, qué son operaciones separadas, cuáles son los tipos de datos abstractos, etc.

Pero el problema es que no sé qué información me puede ser útil en la práctica, y no tengo idea de lo que podría faltar en algunas tareas. Entonces, es difícil para mí cuando necesito resolver algunos problemas.

Tipos de tareas que pueden cumplir

Un ejemplo de una pregunta sobre estructuras de datos: describa cómo insertaría un nodo en una lista vinculada y especifique la complejidad del tiempo.

Aquí hay una pregunta sobre algoritmos: encuentre un elemento en una matriz ordenada rotada y determine la complejidad del tiempo.

Finalmente, la última pregunta, de un "nivel" más alto que los anteriores, es una solicitud para describir una forma de resolver el problema y enumerar los requisitos para su implementación.

En el curso del trabajo, es posible que deba hacer exactamente eso, es decir Descripción de la solución. En la programación competitiva, a menudo es necesario proporcionar un código de trabajo sin especificar explícitamente ninguna estructura de datos o algoritmos. En otras palabras, se espera que pueda utilizar estructuras de datos y algoritmos que sean óptimos en cada caso para resolver el problema de la manera más eficiente posible.

¿Cómo puedo mejorar mis habilidades?


Personalmente, utilicé tres recursos para esto: HackerRank, LeetCode y Kattis. Son similares entre sí, especialmente los dos primeros, pero no idénticos.

Dividiría las habilidades necesarias para resolver problemas en tres grupos:

  • conocimiento de estructuras de datos;
  • conocimiento de algoritmos;
  • capacidad de aplicar estructuras de datos y algoritmos.

Las dos primeras categorías son básicas, se encuentran en la parte inferior. La tercera categoría es una clase superior.

Conocimiento de estructuras de datos.

HackerRank fue mi lugar favorito aquí. Tiene una sección dedicada a las estructuras de datos, donde la información se puede filtrar por tipo, incluidos árboles, listas vinculadas, matrices, etc.

Los problemas abordados en HackerRank están relacionados principalmente con el trabajo con estructuras de datos:

  • Matrices: rotación de la matriz y ejecución de otras acciones con ella.
  • Listas vinculadas: inversión, detección de ciclo.
  • Árboles: intercambio de nodos, validación de BST.

Probablemente ya entendiste cuál era el problema. Las preguntas enviadas por el recurso no se pueden usar directamente para resolver problemas. Pero son necesarios para comprender los conceptos básicos, lo cual fue extremadamente importante en mi caso.

HackerRank no tiene un "modelo de solución" comúnmente disponible, aunque en la sección de discusión puede encontrar muchos consejos, trucos e incluso fragmentos de código de trabajo. Todo esto me ayudó mucho.

Conocimiento de algoritmos.

HackerRank tiene una sección con algoritmos, aunque LeetCode está más cerca de mí. Me parece que en el segundo recurso la lista de problemas abordados es mucho más amplia, y hay explicaciones y consejos.

Es mejor comenzar con las 100 preguntas más comunes (esta sección está en LeetCode). Algunos me fueron muy útiles:

  • fusión de cuenta;
  • subsecuencia más grande que aumenta continuamente;
  • buscar en una matriz ordenada rotada.

A diferencia de los problemas relacionados con las estructuras de datos, el enfoque aquí es cómo hacer algo. Por ejemplo, el problema de fusionar cuentas se relaciona principalmente con el uso de algoritmos estándar UFDS. El problema de búsqueda en una matriz ordenada rotada es una rotación en una búsqueda binaria. A veces es posible encontrar métodos cualitativamente nuevos para resolver problemas, por ejemplo, el método de "ventana deslizante" para el problema de la subsecuencia creciente continua más larga ".

Capacidad para aplicar estructuras de datos y algoritmos.

Bueno, ya bombeé esta habilidad con la ayuda del recurso Kattis. Hay un gran archivo de problemas resueltos, que recopilaron datos de varias fuentes, incluidas las competiciones de programadores de todo el mundo.

Desafortunadamente, Kattis no tiene un foro, además los casos son privados, no son casos comunes. Por lo tanto, hay varios problemas que no pude resolver con su ayuda.

Sin embargo, un recurso puede ayudar a muchos programadores. Yo mismo no pasé demasiado tiempo estudiándolo.

Otros recursos


Geeksforgeeks es otro recurso valioso para aprender sobre algoritmos y estructuras de datos. Me gusta el hecho de que proporciona fragmentos en varios lenguajes, incluidos C ++, Java y Python. Puedes usarlos sin ningún problema.

Y, por supuesto, hay buenos viejos Google de YouTube.

Conclusión


En realidad, lo principal es escribir código, realizar la depuración, estudiar el código de otros desarrolladores, lo que lo ayudará a lidiar rápidamente con sus tareas actuales. Resolver problemas es difícil, pero con cada intento, con cada problema resuelto, mejorará cada vez más.


Source: https://habr.com/ru/post/es435778/


All Articles