Escolhendo e estudando algoritmos com livros antigos
Acho que todo mundo já tentou aprender algoritmos de um livro. O problema é que a maioria do material de 2010 pra cá tá desatualizado demais pra muita coisa prática. A gente ainda vê gente citando Cormen como bíblia, quando na verdade ele é referencial, não prático. Se você quer algo que funcione no dia a dia, precisa entender o que realmente importa.
O que fazer se seu algoritmos livro for antigo
Claro, a primeira coisa é verificar a data. Livros de 2005 pra frente já têm problemas sérios. Algoritmos de ordenação que eram relevantes em 2012 foram completamente substituídos por abordagens modernas em hardware com SIMD e cache hierárquico. Eu perdi umas três semanas tentando implementar um Merge Sort customizado baseado num livro de 2003 porque não estava funcionando bem em arrays grandes. O problema? O livro não mencionava absolutamente nada sobre cache misses. Quando finalmente entendi o problema e mudei para uma abordagem híbrida com Insertion Sort para pequenos partitions, o tempo caiu de 2.3 segundos para 0.4 segundos. Simples assim. O que eu recomendo é verificar se o algoritmo que você está estudando leva em conta a arquitetura moderna. Hoje em dia, cache locality é mais importante que a complexidade teórica na maioria dos casos. Um O(n log n) mal implementado pode ser até 10x mais lento que um O(n²) bem otimizado para arrays pequenos, só por causa de access patterns ruins na memória.
👉 Clique no botão abaixo para saber mais sobre o assunto!
A melhor abordagem que encontrei é cruzar informações de pelo menos três fontes. Tem um book online chamado "Algorithm Design Manual" do Skiena que é bom, mas também ultrapassado em certos pontos. Eu uso como referência primária o "Introduction to Algorithms" do Cormen mesmo, mas sempre verifico as implementações no LeetCode e GitHub para ver como as pessoas estão resolvendo os problemas hoje. A parte mais importante é testar na prática. Você pode entender toda a teoria de Dijkstra e ainda assim errar na implementação se não testar com grafos densos e esparsos. Outro ponto que ninguém menciona: a maior parte dos livros de algoritmos ensina pseudo-código. Isso é útil, mas não substitui implementação real. Eu pessoalmente recomendo escrever cada algoritmo em pelo menos duas linguagens diferentes depois de entender a lógica. O processo de traduzir de Python pra C++ ou Java já te obriga a pensar em detalhes que o pseudo-código esconde, como gerenciamento de memória e tipos de dados.
Agora, sobre os downsides dessa abordagem com livros antigos. A principal limitação é que muitos conceitos de otimização modernos simplesmente não existem neles. Benchmarks de hardware mudaram radicalmente. O que era rápido em 2008 pode ser lento hoje, e vice-versa. Além disso, a maioria dos livros foca em algoritmos clássicos que já são otimizados nas bibliotecas padrão das linguagens. Implementar seu próprio quicksort do zero raramente é produtivo em projetos reais. Se você tá começando agora, minha sugestão prática é: pegue um algoritmo por vez, estude a teoria, depois implemente e benchmark. Anote os tempos. Compare com a versão da biblioteca padrão. Entenda onde estão os gargalos. Isso te dá uma intuição que nenhum livro sozinho consegue dar, porque o conhecimento prático de performance vem da experiência direta com dados reais, não da teoria abstracta.