Searching...
Português
EnglishEnglish
EspañolSpanish
简体中文Chinese
FrançaisFrench
DeutschGerman
日本語Japanese
PortuguêsPortuguese
ItalianoItalian
한국어Korean
РусскийRussian
NederlandsDutch
العربيةArabic
PolskiPolish
हिन्दीHindi
Tiếng ViệtVietnamese
SvenskaSwedish
ΕλληνικάGreek
TürkçeTurkish
ไทยThai
ČeštinaCzech
RomânăRomanian
MagyarHungarian
УкраїнськаUkrainian
Bahasa IndonesiaIndonesian
DanskDanish
SuomiFinnish
БългарскиBulgarian
עבריתHebrew
NorskNorwegian
HrvatskiCroatian
CatalàCatalan
SlovenčinaSlovak
LietuviųLithuanian
SlovenščinaSlovenian
СрпскиSerbian
EestiEstonian
LatviešuLatvian
فارسیPersian
മലയാളംMalayalam
தமிழ்Tamil
اردوUrdu
Grokking Algorithms An Illustrated Guide For Programmers and Other Curious People

Grokking Algorithms An Illustrated Guide For Programmers and Other Curious People

por Aditya Y. Bhargava 2015 256 páginas
4.42
5.1K avaliações
Ouvir
Try Full Access for 7 Days
Unlock listening & more!
Continue

Principais conclusões

1. Algoritmos: a base para resolver problemas com eficiência.

Um algoritmo é um conjunto de instruções para realizar uma tarefa.

Definição de algoritmos. Essencialmente, um algoritmo é um procedimento bem definido ou um conjunto de regras criadas para resolver um problema específico. Eles são os blocos fundamentais dos programas de computador, determinando como os dados são processados e manipulados para alcançar um resultado desejado. A escolha do algoritmo influencia diretamente a eficiência e o desempenho de um programa, tornando essa decisão um aspecto crucial no desenvolvimento de software.

Exemplos de algoritmos. Algoritmos não se limitam à ciência da computação; estão presentes no nosso dia a dia. Por exemplo:

  • Uma receita para fazer um bolo é um algoritmo.
  • As instruções para chegar de um lugar a outro de carro são um algoritmo.
  • Os passos para montar um móvel também são um algoritmo.

Importância dos algoritmos. Compreender algoritmos é fundamental para programadores, pois permite escrever códigos eficientes e eficazes. Ao escolher o algoritmo adequado para uma tarefa, os desenvolvedores podem otimizar o desempenho, reduzir o consumo de recursos e melhorar a experiência do usuário.

2. Busca Binária: um prodígio em tempo logarítmico.

Na busca binária, você escolhe o número do meio e elimina metade dos números restantes a cada tentativa.

Definição da busca binária. A busca binária é um algoritmo eficiente para encontrar um valor específico dentro de uma lista ordenada. Funciona dividindo repetidamente o intervalo de busca ao meio. Se o elemento do meio for o valor desejado, a busca termina com sucesso. Caso contrário, a busca continua na metade esquerda ou direita, dependendo se o valor procurado é menor ou maior que o elemento do meio.

Complexidade em tempo logarítmico. A grande vantagem da busca binária é sua complexidade de tempo logarítmico, representada por O(log n). Isso significa que o número de passos necessários para encontrar o valor cresce de forma logarítmica conforme o tamanho da lista aumenta. Por exemplo:

  • Uma lista com 1.024 elementos exige no máximo 10 passos.
  • Uma lista com 1.048.576 elementos exige no máximo 20 passos.

Aplicações práticas. A busca binária é amplamente utilizada em situações onde a busca eficiente é essencial, como:

  • Procurar uma palavra em um dicionário.
  • Encontrar um contato em uma lista telefônica.
  • Consultar dados em um índice de banco de dados ordenado.

3. Arrays vs. Listas Ligadas: escolhendo a estrutura certa.

Num array, todos os seus elementos ficam armazenados lado a lado.

Definição de arrays e listas ligadas. Arrays e listas ligadas são duas estruturas de dados fundamentais para armazenar coleções de elementos. Arrays guardam os elementos em locais de memória contíguos, enquanto listas ligadas armazenam os elementos em locais não contíguos, com cada elemento apontando para o próximo na sequência. A escolha entre arrays e listas ligadas depende das necessidades específicas da aplicação.

Vantagens dos arrays. Arrays oferecem acesso rápido e direto aos elementos, permitindo acessar qualquer elemento pelo seu índice em tempo O(1). Isso os torna ideais para aplicações que exigem buscas frequentes por elementos.

Vantagens das listas ligadas. Listas ligadas são excelentes para inserções e remoções, especialmente no meio da lista. Inserir ou remover um elemento numa lista ligada requer apenas atualizar os ponteiros dos elementos adjacentes, o que pode ser feito em tempo O(1). Por isso, são indicadas para aplicações com muitas inserções e exclusões.

4. Recursão: elegância na autorreferência.

Recursão é quando uma função chama a si mesma.

Definição de recursão. Recursão é uma técnica poderosa de programação onde uma função se chama dentro da sua própria definição. Isso permite dividir problemas complexos em subproblemas menores e semelhantes, que são resolvidos recursivamente até que se alcance um caso base.

Caso base e caso recursivo. Toda função recursiva deve conter dois elementos essenciais:

  • Um caso base, que determina quando a recursão deve parar.
  • Um caso recursivo, que define como a função se chama novamente com um subproblema menor.

Pilha de chamadas. Funções recursivas dependem da pilha de chamadas para controlar o estado de cada invocação. Cada vez que a função se chama, um novo quadro é adicionado à pilha, armazenando variáveis e contexto de execução. Ao atingir o caso base, a função retorna e os quadros são removidos da pilha na ordem inversa.

5. Quicksort: dividir, conquistar e ordenar com eficiência.

Quicksort é um algoritmo de ordenação.

Definição do Quicksort. Quicksort é um algoritmo popular e eficiente que utiliza o paradigma dividir para conquistar. Ele seleciona um elemento "pivô" do array e divide os demais elementos em dois subarrays, conforme sejam menores ou maiores que o pivô. Os subarrays são ordenados recursivamente, e então combinados com o pivô para formar o array final ordenado.

Dividir para conquistar. Quicksort exemplifica a estratégia dividir para conquistar, que consiste em quebrar um problema em subproblemas menores e semelhantes, resolver esses subproblemas recursivamente e depois combinar as soluções para resolver o problema original.

Desempenho médio. Quicksort tem complexidade média de tempo O(n log n), sendo um dos algoritmos de ordenação mais rápidos na prática. Contudo, no pior caso, sua complexidade pode chegar a O(n²), o que ocorre quando o pivô é escolhido de forma inadequada. Para evitar isso, é comum escolher o pivô aleatoriamente.

6. Tabelas Hash: o poder das buscas por chave-valor.

Uma tabela hash associa chaves a valores.

Definição de tabelas hash. Tabelas hash são estruturas de dados poderosas que permitem armazenar e recuperar pares chave-valor de forma eficiente. Elas utilizam uma função hash para mapear cada chave a um índice em um array, onde o valor correspondente é guardado. Isso possibilita operações de busca, inserção e remoção em tempo constante (O(1)) na média.

Funções hash. O desempenho de uma tabela hash depende muito da qualidade da função hash. Uma boa função hash distribui as chaves uniformemente pelo array, minimizando colisões, que ocorrem quando duas ou mais chaves são mapeadas para o mesmo índice.

Casos de uso. Tabelas hash são amplamente usadas em aplicações que exigem buscas rápidas por chave, como:

  • Implementação de dicionários e tabelas de símbolos.
  • Cache de dados para acesso rápido.
  • Indexação de bancos de dados para buscas eficientes.

7. Busca em Largura: navegando redes com facilidade.

A busca em largura indica se existe um caminho de A até B.

Definição da busca em largura. A busca em largura (BFS) é um algoritmo de travessia de grafos que explora o grafo nível por nível, começando por um nó fonte. Ele visita sistematicamente todos os vizinhos do nó inicial, depois os vizinhos desses vizinhos, e assim por diante, até encontrar o nó alvo ou explorar todo o grafo.

Caminho mais curto. A BFS garante encontrar o caminho mais curto entre dois nós em um grafo não ponderado, onde o caminho mais curto é aquele com o menor número de arestas.

Filas. A BFS utiliza uma fila para controlar os nós a serem visitados. A fila assegura que os nós sejam visitados na ordem em que foram descobertos, o que é essencial para encontrar o caminho mais curto.

8. Algoritmo de Dijkstra: encontrando o caminho ponderado mais curto.

O algoritmo de Dijkstra calcula o caminho mais curto em grafos ponderados.

Definição do algoritmo de Dijkstra. O algoritmo de Dijkstra é um método de busca em grafos que resolve o problema do caminho mais curto a partir de uma fonte para todos os outros nós, em grafos com pesos não negativos nas arestas, produzindo uma árvore de caminhos mínimos.

Grafos ponderados. Diferente da busca em largura, o algoritmo de Dijkstra lida com grafos ponderados, onde cada aresta tem um valor numérico associado, representando custo ou distância.

Grafos acíclicos dirigidos. O algoritmo de Dijkstra funciona em grafos acíclicos dirigidos (DAGs), que são grafos sem ciclos e cujas arestas têm direção.

9. Algoritmos Guloso: soluções rápidas e aproximadas.

Algoritmos gulosos otimizam localmente, esperando alcançar o ótimo global.

Definição de algoritmos gulosos. Algoritmos gulosos são uma abordagem simples e intuitiva para resolver problemas, fazendo a escolha localmente ótima em cada passo, com a esperança de encontrar uma solução globalmente ótima. São usados quando encontrar a solução exata é computacionalmente caro ou inviável.

Algoritmos de aproximação. Muitas vezes, algoritmos gulosos são usados como algoritmos de aproximação, que fornecem soluções próximas do ótimo, mas que podem não ser exatamente ótimas.

Problema da cobertura de conjuntos. Um exemplo clássico onde algoritmos gulosos são úteis é o problema da cobertura de conjuntos, que consiste em encontrar o menor conjunto de subconjuntos que cubra todos os elementos de um conjunto dado.

10. Programação Dinâmica: otimizando por meio de subproblemas.

Programação dinâmica é útil quando você quer otimizar algo sob uma restrição.

Definição de programação dinâmica. Programação dinâmica é uma técnica poderosa que consiste em dividir um problema complexo em subproblemas menores e sobrepostos, resolver cada subproblema uma única vez e armazenar suas soluções em uma tabela ou memória para evitar recomputações. Essa abordagem melhora significativamente a eficiência de algoritmos para problemas com subestrutura ótima e subproblemas sobrepostos.

Problema da mochila. Um exemplo clássico resolvido por programação dinâmica é o problema da mochila, que envolve selecionar um subconjunto de itens com valor máximo que caiba em uma mochila com capacidade limitada.

Grade. Toda solução por programação dinâmica envolve uma grade. Os valores nas células geralmente representam o que se quer otimizar. Cada célula é um subproblema, então pense em como dividir seu problema em subproblemas.

11. K-Vizinhos Mais Próximos: aprendendo com os vizinhos.

KNN é usado para classificação e regressão, olhando para os k vizinhos mais próximos.

Definição de k-vizinhos mais próximos. K-vizinhos mais próximos (KNN) é um algoritmo simples e eficaz de aprendizado de máquina, usado tanto para classificação quanto para regressão. Ele funciona encontrando os k pontos de dados mais próximos de um ponto de consulta e prevendo a classe ou valor desse ponto com base na classe majoritária ou valor médio dos vizinhos.

Classificação e regressão. KNN pode ser aplicado para classificar dados em diferentes categorias ou para prever valores contínuos.

Extração de características. A extração de características é o processo de converter dados brutos em um conjunto de características numéricas que o algoritmo KNN pode usar. A escolha das características é fundamental para o desempenho do algoritmo.

Última atualização:

Avaliações

4.42 de 5
Média de 5.1K avaliações do Goodreads e da Amazon.

Grokking Algorithms: Um Guia Ilustrado para Programadores e Outros Curiosos é amplamente elogiado pela sua abordagem acessível e visual no ensino de algoritmos. Os leitores valorizam a simplicidade do texto, as ilustrações envolventes e as explicações claras, tornando-o uma excelente introdução para iniciantes e uma boa revisão para programadores experientes. O livro aborda algoritmos fundamentais e estruturas de dados, sendo considerado por muitos agradável e fácil de compreender. Algumas críticas apontam para níveis de dificuldade irregulares, erros ocasionais e falta de profundidade em certos temas. No geral, é recomendado como um guia amigável e acessível para quem deseja entender algoritmos.

Your rating:
4.64
23 avaliações

Sobre o autor

Aditya Y. Bhargava é o autor de Grokking Algorithms: Um Guia Ilustrado para Programadores e Outros Curiosos. É reconhecido pela sua abordagem única de ensinar algoritmos através de explicações visuais e linguagem simples. O estilo de escrita de Bhargava torna conceitos complexos acessíveis tanto para iniciantes como para quem não é programador. O seu livro ganhou popularidade pelo uso de ilustrações e exemplos do quotidiano para explicar conceitos algorítmicos. Embora se saiba pouco sobre a sua vida pessoal, o seu trabalho tem sido elogiado pela capacidade de tornar os algoritmos mais interessantes e menos intimidadores para os leitores.

Listen
Now playing
Grokking Algorithms An Illustrated Guide For Programmers and Other Curious People
0:00
-0:00
Now playing
Grokking Algorithms An Illustrated Guide For Programmers and Other Curious People
0:00
-0:00
Voice
Speed
Dan
Andrew
Michelle
Lauren
1.0×
+
200 words per minute
Queue
Home
Library
Get App
Create a free account to unlock:
Requests: Request new book summaries
Bookmarks: Save your favorite books
History: Revisit books later
Recommendations: Personalized for you
Ratings: Rate books & see your ratings
100,000+ readers
Try Full Access for 7 Days
Listen, bookmark, and more
Compare Features Free Pro
📖 Read Summaries
All summaries are free to read in 40 languages
🎧 Listen to Summaries
Listen to unlimited summaries in 40 languages
❤️ Unlimited Bookmarks
Free users are limited to 4
📜 Unlimited History
Free users are limited to 4
📥 Unlimited Downloads
Free users are limited to 1
Risk-Free Timeline
Today: Get Instant Access
Listen to full summaries of 73,530 books. That's 12,000+ hours of audio!
Day 4: Trial Reminder
We'll send you a notification that your trial is ending soon.
Day 7: Your subscription begins
You'll be charged on Jun 13,
cancel anytime before.
Consume 2.8x More Books
2.8x more books Listening Reading
Our users love us
100,000+ readers
"...I can 10x the number of books I can read..."
"...exceptionally accurate, engaging, and beautifully presented..."
"...better than any amazon review when I'm making a book-buying decision..."
Save 62%
Yearly
$119.88 $44.99/year
$3.75/mo
Monthly
$9.99/mo
Start a 7-Day Free Trial
7 days free, then $44.99/year. Cancel anytime.
Scanner
Find a barcode to scan

Settings
General
Widget
Loading...