Como aprimorei minhas habilidades no trabalho com algoritmos, estruturas de dados e aprendi a usar tudo isso na prática



De um tradutor: hoje estamos publicando um artigo para você por Fabian Terh . O artigo será útil principalmente para programadores iniciantes.

Eu sou um programador autodidata; este post reflete minha experiência e habilidades pessoais em áreas como algoritmos e estruturas de dados; além disso, falo sobre maneiras de resolver problemas (a propósito, o segundo me é um pouco pior que o primeiro).

A Skillbox recomenda: um curso prático de dois anos, "Sou um desenvolvedor Web PRO" .

Lembramos que: para todos os leitores de "Habr" - um desconto de 10.000 rublos ao se inscrever em qualquer curso Skillbox usando o código promocional "Habr".

Problema: você conhece a teoria, mas tem dificuldade com a prática


Há pouco tempo, tive um problema que pode ser descrito como "não sei o que não sei" - podemos dizer uma curiosidade. O fato é que eu entendo a teoria e muito bem. Eu sei como as listas funcionam, o que são operações separadas, o que são tipos de dados abstratos etc.

Mas o problema é que não sei quais informações podem ser úteis para mim na prática e não tenho ideia do que pode estar faltando para algumas tarefas. Então, é difícil para mim quando preciso resolver alguns problemas.

Tipos de tarefas que podem atender

Um exemplo de pergunta sobre estruturas de dados: descreva como você inserirá um nó em uma lista vinculada e especifique a complexidade do tempo.

Aqui está uma pergunta sobre algoritmos: encontre um elemento em uma matriz classificada rotacionada e determine a complexidade do tempo.

Finalmente, a última pergunta, de um "nível" superior ao anterior, é uma solicitação para descrever uma maneira de resolver o problema e listar os requisitos para sua implementação.

No decorrer do trabalho, pode ser necessário fazer exatamente isso, ou seja, descrição da solução. Na programação competitiva, geralmente é necessário fornecer código de trabalho sem especificar explicitamente quaisquer estruturas ou algoritmos de dados. Em outras palavras, espera-se que você possa usar estruturas de dados e algoritmos ideais em cada caso para resolver o problema da maneira mais eficiente possível.

Como posso melhorar minhas habilidades?


Pessoalmente, usei três recursos para isso: HackerRank, LeetCode e Kattis. Eles são semelhantes entre si, especialmente os dois primeiros, mas não são idênticos.

Eu dividiria as habilidades necessárias para resolver problemas em três grupos:

  • conhecimento de estruturas de dados;
  • conhecimento de algoritmos;
  • capacidade de aplicar estruturas e algoritmos de dados.

As duas primeiras categorias são básicas, estão no fundo. A terceira categoria é de classe superior.

Conhecimento de estruturas de dados

O HackerRank era o meu lugar favorito aqui. Possui uma seção dedicada às estruturas de dados, onde as informações podem ser filtradas por tipo, incluindo árvores, listas vinculadas, matrizes etc.

Os problemas abordados no HackerRank estão relacionados principalmente ao trabalho com estruturas de dados:

  • Matrizes: rotação da matriz e execução de outras ações com ela.
  • Listas vinculadas: reversão, detecção de ciclo.
  • Árvores: troca de nó, validação BST.

Você provavelmente já entendeu qual era o problema. As perguntas enviadas pelo recurso não podem ser usadas diretamente na solução de problemas. Mas eles são necessários para entender o básico, o que foi extremamente importante no meu caso.

O HackerRank não possui um "modelo de solução" comumente disponível, embora na seção de discussão você possa encontrar muitas dicas, truques e até fragmentos de código em funcionamento. Tudo isso me ajudou muito.

Conhecimento de algoritmos

O HackerRank possui uma seção com algoritmos, embora o LeetCode esteja mais perto de mim. Parece-me que, no segundo recurso, a lista de questões abordadas é muito mais ampla e há explicações e dicas.

É melhor começar com as 100 perguntas mais comuns (esta seção está no LeetCode). Alguns foram muito úteis para mim:

  • mesclagem de conta;
  • maior subsequência continuamente crescente;
  • procure na matriz classificada rotacionada.

Diferentemente dos problemas relacionados às estruturas de dados, o foco aqui é sobre como fazer algo. Por exemplo, o problema de mesclar contas está relacionado principalmente ao uso de algoritmos UFDS padrão. O problema de pesquisa em uma matriz classificada rotacionada é uma rotação em uma pesquisa binária. Às vezes, é possível encontrar métodos qualitativamente novos para resolver problemas - por exemplo, o método "janela deslizante" para o problema da subsequência crescente mais longa ".

Capacidade de aplicar estruturas de dados e algoritmos

Bem, eu desenvolvi essa habilidade já com a ajuda do recurso Kattis. Há um enorme arquivo de problemas resolvidos, que coletou dados de várias fontes, incluindo competições de programadores de todo o mundo.

Infelizmente, Kattis não possui um fórum, além de casos particulares, não comuns. Portanto, existem vários problemas que não consegui resolver com a ajuda dele.

No entanto, um recurso pode ajudar muitos programadores. Eu mesmo não gastei muito tempo estudando.

Outros recursos


Geeksforgeeks é outro recurso valioso para aprender sobre algoritmos e estruturas de dados. Eu gosto do fato de que ele fornece trechos em várias linguagens, incluindo C ++, Java e Python. Você pode usá-los sem problemas.

E, claro, há o bom e velho Google do YouTube.

Conclusão


Na verdade, o principal é escrever código, participar da depuração, estudar o código de outros desenvolvedores, o que o ajudará a lidar rapidamente com as tarefas atuais. Resolver problemas é difícil, mas a cada tentativa, a cada problema resolvido, você ficará cada vez melhor.


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


All Articles