Executando verificação de segurança...
4

Quais seriam as Técnicas PRECIOSAS em programação/algoritmos?

Eae, pessoal. Como estão? Tudo 100%? Hoje eu estava fazendo um desafio no Leetcode e, apesar dos meus esforços, o meu código não passava em todos os testes (faltavam só 2 -_-). Após queimar alguns neurônios, tentando assimilar outra forma de resolver o problema, decidi consultar as submissões feitas por outros usuários.

Encontrei, portanto, um sujeito indiano que fez uma solução em Java, superando 100% dos usuários naquele desafio 0_0. Ele fez um vídeo explicando o seu algoritmo e notei uma técnica diferente, que talvez possa ser utilizada com eficácia em outras questões. Ele usou uma Iteração Reversa (backward iteration) - ou algo do tipo. Pode ser que essa não seja uma tééécnica super relevante, mas achei interessante o conceito e como a aplicação dele ajudou a resolver o problema.

Porém, para saber onde aplicar uma determinada técnica também é necessária uma percepção aguçada em relação à lógica do problema, concordam? Admito que ainda não entendi o raciocínio do cara pelo vídeokkkkkkk. Mas gostei de descobrir que há técnicas, truques ou até feitiços (para quem também gosta de imaginar e curte jogos ou fantasia).

Então, gostaria de ouvir de vocês. Quais técnicas de programação marcantes ou pertinentes que vocês já descobriram e para qual problema elas funcionam?

4

A melhor técnica é colocar a cara no computador e programar. Só com muita prática e resolução de problemas você irá desenvolver essa visão aguçada. Para quem faz faculdade é mais simples, pois podemos utilizar exemplos de livros ou de listas de disciplinas.

Outra dica é tentar sempre encontrar a complexidade de cada algoritmo que você faz, depois de um tempo isso será automático e você conseguirá avaliar se é possível fazer melhor e como fazer.

1

Esse lance de enxergar naturalmente a complexidade dos algoritmos parece algo muito daora e valioso. Vlw pelo tapa na cara tbmkkkkkkk. No fim a gente sempre aprende mais com a prática né. Ótima resposta.

1

Também acho que a melhor forma de aprender e praticando. Por mais que na faculdade a gente tenha uma noção maior se não sentar a bunda na cadeira e praticar de nada adianta.

3

Algoritmos de grafos: Os grafos são uma ferramenta poderosa que podem ser usados para resolver uma ampla gama de problemas. Quase tudo pode ser modelado como um grafo, e aí diversos algoritmos podem ser aplicados para encontrar diversas soluções de forma eficiente. Os algoritmos de grafos mais comuns (e que todo programador deve conhecer) incluem busca em largura (BFS), busca em profundidade (DFS), árvore geradora mínima (MST) e caminho mais curto.

2

Já vi alguma coisa na faculdade sobre caminho mais curto, mas essas outras aí nunca ouvi falar 0_0.

Essa descrição ficou perfeita pra entender o valor desses algoritmos. Com certeza vou estudá-los. Muito obrigado pela resposta.

3

Cara, esses problemas de leet code, beecrowd, maratona e etc, sempre já são manjandos, igual 98% dos problemas da programação, você tem que saber que existe, por que algum fdp no quarto escuro da sua casa já pensou em uma solução 100x melhor que a sua. Exige bastante estudo e a maior parte desses estudos que vejo são, ou vieram, de livros e/ou artigos acadêmicos, livros como Algoritmos vão te apresentar 80% dos algoritmos e estrutura de dados, além de uma base matemática (pode ter outros livros só com foco em problemas como do leet code, mas desconheço). Os outros 20% você vai aprender da forma que fez mesmo, tentando resolver, gastando neurônio, se fudendo e no final vendo a solução de um indiano, e tendo aquele Insight Ahhhh! Já existe um técnica pra resolver exatamente problemas como esse, igual design patterns no âmbito da arch.

Deixando minha contribuição, as técnicas mais famosas que conheço são essas.

  • Todos algoritmos envolvendo arvores (bfs, dfs, balance tree...)
  • Todos algoritmos envolvendo grafos
  • Dynamic programming (bottom-up e top-down)
  • Entender que alguns algoritmos são NP e vão ter uma solução ideal, e não a melhor
  • greedy algorithms
  • backtracking
  • dividir pra conquistar
  • sliding window
1
1
1
0