Comment j'ai amélioré mes compétences en travaillant avec des algorithmes, des structures de données et appris à utiliser tout cela dans la pratique



D'un traducteur: aujourd'hui, nous publions pour vous un article de Fabian Terh . L'article sera principalement utile aux programmeurs débutants.

Je suis un programmeur autodidacte, ce poste reflète mon expérience personnelle et mes compétences dans des domaines tels que les algorithmes et les structures de données; en plus, je parle des moyens de résoudre les problèmes (soit dit en passant, le second m'est un peu pire que le premier).

Skillbox recommande: un cours pratique de deux ans, "Je suis un développeur Web PRO . "

Nous vous rappelons: pour tous les lecteurs de «Habr» - une remise de 10 000 roubles lors de l'inscription à un cours Skillbox en utilisant le code promo «Habr».

Problème: vous connaissez la théorie, mais vous avez des difficultés avec la pratique


Il n'y a pas si longtemps, j'ai eu un problème qui peut être décrit comme «je ne sais pas ce que je ne sais pas» - nous pouvons dire une curiosité. Le fait est que je comprends très bien la théorie. Je sais comment fonctionnent les listes, quelles sont les opérations distinctes, quels sont les types de données abstraits, etc.

Mais le problème est que je ne sais pas quelles informations peuvent m'être utiles dans la pratique, et je n'ai aucune idée de ce qui pourrait manquer pour certaines tâches. Donc, c'est difficile pour moi quand je dois résoudre certains problèmes.

Types de tâches pouvant se rencontrer

Un exemple de question sur les structures de données: décrivez comment insérer un nœud dans une liste chaînée et spécifiez la complexité temporelle.

Voici une question sur les algorithmes: recherchez un élément dans un tableau trié tourné et déterminez la complexité temporelle.

Enfin, la dernière question, d' un "niveau" plus élevé que les précédentes, est une demande pour décrire un moyen de résoudre le problème et énumérer les exigences pour sa mise en œuvre.

Au cours du travail, vous aurez peut-être besoin de cela, c'est-à-dire description de la solution. Dans une programmation compétitive, il est souvent nécessaire de fournir du code de travail sans spécifier explicitement de structures de données ou d'algorithmes. En d'autres termes, vous êtes censé être en mesure d'utiliser des structures de données et des algorithmes qui sont optimaux dans chaque cas pour résoudre le problème aussi efficacement que possible.

Comment puis-je améliorer mes compétences?


Personnellement, j'ai utilisé trois ressources pour cela: HackerRank, LeetCode et Kattis. Ils sont similaires les uns aux autres, en particulier les deux premiers, mais pas identiques.

Je diviserais les compétences nécessaires pour résoudre les problèmes en trois groupes:

  • connaissance des structures de données;
  • connaissance des algorithmes;
  • pouvoir appliquer des structures de données et des algorithmes.

Les deux premières catégories sont basiques, elles se situent tout en bas. La troisième catégorie est une classe supérieure.

Connaissance des structures de données

HackerRank était mon endroit préféré ici. Il a une section consacrée aux structures de données, où les informations peuvent être filtrées par type, y compris les arbres, les listes liées, les tableaux, etc.

Les problèmes traités par HackerRank sont principalement liés au travail avec les structures de données:

  • Tableaux: rotation du tableau et exécution d'autres actions avec lui.
  • Listes liées: inversion, détection de cycle.
  • Arbres: échange de nœuds, validation BST.

Vous avez probablement déjà compris quel était le problème. Les questions soumises par la ressource ne peuvent pas être utilisées directement pour résoudre des problèmes. Mais ils sont nécessaires pour comprendre les bases, ce qui était extrêmement important dans mon cas.

HackerRank ne dispose pas d'un «modèle de solution» couramment disponible, bien qu'il existe de nombreux conseils, astuces et même des fragments de code de travail dans la section de discussion. Tout cela m'a beaucoup aidé.

Connaissance des algorithmes

HackerRank a une section avec des algorithmes, bien que LeetCode soit plus proche de moi. Il me semble que sur la deuxième ressource, la liste des questions abordées est beaucoup plus large, et il y a des explications et des conseils.

Il est préférable de commencer par les 100 questions les plus courantes (cette section concerne LeetCode). Certains m'ont été très utiles:

  • fusion de compte;
  • la plus grande sous-séquence en augmentation continue;
  • recherche dans un tableau trié tourné.

Contrairement aux problèmes liés aux structures de données, l'accent est mis ici sur la façon de faire quelque chose. Par exemple, le problème de la fusion des comptes est principalement lié à l'utilisation d'algorithmes UFDS standard. Le problème de recherche dans un tableau trié tourné est une rotation dans une recherche binaire. Parfois, il est possible de trouver de nouvelles méthodes qualitatives pour résoudre les problèmes - par exemple, la méthode de la "fenêtre coulissante" pour le problème de la sous-séquence croissante la plus longue. "

Capacité à appliquer des structures de données et des algorithmes

Eh bien, j'ai déjà pompé cette compétence avec l'aide de la ressource Kattis. Il existe une énorme archive de problèmes résolus, qui ont collecté des données à partir de diverses sources, y compris des concours de programmeurs du monde entier.

Malheureusement, Kattis n'a pas de forum, et les cas sont privés, pas des cas courants. Par conséquent, il y a plusieurs problèmes que je n'ai pas pu résoudre avec son aide.

Cependant, une ressource peut aider de nombreux programmeurs. Je n'ai moi-même pas passé trop de temps à l'étudier.

Autres ressources


Geeksforgeeks est une autre ressource précieuse pour en savoir plus sur les algorithmes et les structures de données. J'aime le fait qu'il fournit des extraits de code dans divers langages, notamment C ++, Java et Python. Vous pouvez les utiliser sans aucun problème.

Et, bien sûr, il existe un bon vieux Google de YouTube.

Conclusion


En fait, l'essentiel est d'écrire du code, de déboguer, d'étudier le code d'autres développeurs, ce qui vous aidera à gérer rapidement vos tâches actuelles. Résoudre des problèmes est difficile, mais à chaque tentative, à chaque problème résolu, vous irez de mieux en mieux.


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


All Articles