Vídeo: Tutorial fácil de algoritmos de programación 2024
Por John Paul Mueller, Luca Massaron
Algoritmos não precisam ser chatos ou difíceis de usar. De fato, os algoritmos o envolvem de várias maneiras que você talvez não tenha pensado, e você os usa todos os dias para realizar tarefas importantes. No entanto, você precisa usar algoritmos sem ter que se tornar um matemático.
Os idiomas de programação permitem que você descreva as etapas usadas para criar um algoritmo. Algumas línguas são melhores do que outras pessoas na realização desta tarefa de forma que as pessoas possam entender sem se tornarem cientistas da computação. O Python facilita o uso de algoritmos porque ele vem com muitos recursos embutidos e estendidos (através de pacotes, conjuntos de dados e outros recursos). Esta Cheat Sheet ajuda você a acessar as dicas mais comuns para tornar seu uso de algoritmos rápido e fácil.
Localizando o Algoritmo que Você Precisa
A tabela a seguir descreve algoritmos e tipos de algoritmos que você pode achar úteis para vários tipos de análise de dados. (Você pode encontrar discussões de todos esses algoritmos em Algorithms For Dummies.)
Algoritmo | Descrição | Link útil |
A * Pesquisa | O algoritmo rastreia o custo dos nós à medida que os explora usando o equação: f (n) = g (n) + h (n), onde:
n é o identificador de nó g (n) é o custo de atingir o nó até agora h (n) é o custo estimado para alcançar o Objetivo do nó f (n) é o custo estimado do caminho de n para o objetivo A idéia é pesquisar os caminhos mais promissores primeiro e evitar caminhos caros. |
Standford. edu |
Árvore equilibrada | Um tipo de árvore que mantém uma estrutura equilibrada através da reorganização para que ela possa fornecer tempos de acesso reduzidos. O número de elementos no lado esquerdo difere do número no lado direito por um no máximo. | Webdocs |
Pesquisa Bidirecional | Esta técnica procura simultaneamente do nó raiz e do nó de objetivo até os dois caminhos de pesquisa se encontrarem no meio. Uma vantagem desta abordagem é que é tempo eficiente porque encontra a solução mais rápida do que muitas outras soluções de força bruta. Além disso, ele usa memória de forma mais eficiente do que outras abordagens e sempre encontra uma solução. A principal desvantagem é a complexidade da implementação. | Planejamento. cs |
Árvore binária | Este é um tipo de árvore que contém nós que se conectam a nós nulos (nós de folha), um ou dois (nós ramificados) outros nós. Cada nó define os três elementos que ele deve incluir para fornecer conectividade e armazenar dados: armazenamento de dados, conexão à esquerda e conexão direta. | cs. cmu. edu |
Breadth-First Search | Esta técnica começa no nó da raiz, explora primeiro cada um dos nós filho, e só então muda para o próximo nível. Ele progride nível por nível até encontrar uma solução. A desvantagem deste algoritmo é que ele deve armazenar cada nó na memória, o que significa que ele usa uma quantidade considerável de memória para um grande número de nós. Esta técnica pode verificar se há nós duplicados, o que economiza tempo e sempre vem com uma solução. | Khan Academcy |
Brute Force | Esta é uma técnica de resolução de problemas em que alguém tenta todas as soluções possíveis, procurando a melhor solução para problemas. As técnicas de força bruta garantem uma solução melhor ajustada quando existe, mas são tão demoradas para implementar que a maioria das pessoas as evita. | Igm. univ |
Profundidade-Primeira Pesquisa | Esta técnica começa no nó da raiz e explora um conjunto de nós filhos conectados até atingir um nó da folha. Ele progride ramo por ramo até encontrar uma solução. A desvantagem deste algoritmo é que ele não pode verificar por nós duplicados, o que significa que ele poderia percorrer os mesmos caminhos do nó mais de uma vez. Na verdade, esse algoritmo pode não encontrar uma solução, o que significa que você deve definir um ponto de corte para evitar que o algoritmo faça uma busca infinita. Uma vantagem desta abordagem é que é eficiente na memória. | Hacker Earth |
Divide and Conquer | Esta é uma técnica de resolução de problemas em que o problema está dividido nas peças mais pequenas possíveis e resolvido usando a abordagem mais simples possível. Esta técnica economiza tempo e recursos consideráveis em comparação com outras abordagens, como a força bruta. No entanto, nem sempre garante um resultado de melhor ajuste. | Khan Academy |
Dijikstra | Este é um algoritmo usado para encontrar o caminho mais curto em um gráfico direcionado, ponderado (com pesos positivos). | Geeks for Geeks |
Graph | Um gráfico é uma espécie de extensão de árvore. Como nas árvores, você possui nós que se conectam para criar relacionamentos. No entanto, ao contrário das árvores binárias, um gráfico pode ter mais de uma ou duas conexões. Na verdade, os nós dos gráficos muitas vezes têm uma infinidade de conexões. Você vê gráficos usados em lugares como mapas para GPS e todos os tipos de outros lugares para os quais a abordagem de cima para baixo de uma árvore não funcionará. | Tutoriais |
Algoritmos gananciosos | Esta técnica de resolução de problemas em que a solução depende da melhor resposta para cada etapa do processo de resolução de problemas. Algoritmos gananciosos geralmente fazem dois pressupostos:
É possível fazer uma única escolha ideal em um determinado passo. Ao escolher a seleção ideal em cada etapa, é possível encontrar uma solução ideal para o problema geral. |
Tutoriais |
Greedy Best-First Search (BFS) | O algoritmo sempre escolhe o caminho mais próximo do objetivo usando a equação: f (n) = h (n) = | h (n) |
. Este algoritmo particular pode encontrar soluções bastante rápidas, mas também pode ficar preso em loops, tantas pessoas não consideram uma abordagem ótima para encontrar uma solução. | Centurion2 | Hashing |
Este é um método de previsão da localização de um item de dados específico na estrutura de dados (qualquer que seja a estrutura) antes de procurá-lo. Essa abordagem baseia-se no uso de chaves inseridas em um índice. Uma função hash transforma a chave em um valor numérico que o algoritmo coloca em uma tabela hash. Uma tabela de hash fornece os meios para criar um índice que aponte para elementos em uma estrutura de dados para que um algoritmo possa facilmente prever a localização dos dados. | Tutoriais | Heap |
Esta é uma árvore sofisticada que permite inserções de dados na estrutura da árvore. O uso da inserção de dados torna a classificação mais rápida. Você pode classificar ainda mais essas árvores como montes máximos e montes mínimos, dependendo da capacidade da árvore para fornecer imediatamente o valor máximo ou mínimo presente na árvore. | Tutoriais | Heurísticas |
Esta é uma técnica de resolução de problemas que depende da autodescoberta e produz resultados suficientemente úteis (não necessariamente otimizados, mas bons o bastante) para resolver um problema bem o suficiente para que uma solução melhor não seja ' t necessário. Auto descoberta é o processo de permitir que o algoritmo mostre um caminho potencialmente útil para uma solução (mas você ainda deve contar com intuição e compreensão humana para saber se a solução é a certa). | Noroeste. edu | MapReduce |
Esta é uma estrutura para fazer com que os algoritmos funcionem usando cálculos em paralelo (usando vários computadores conectados em uma rede), permitindo que os algoritmos completem suas soluções mais rapidamente. | Hadoop Apache | Mergesort |
O Mergesort é um método de comparação de dados de propósito geral, baseado em comparação. Depende de uma abordagem de divisão e conquista para executar sua tarefa. | Geeks for Geeks | Nash Equilibrium |
Esta é uma teoria dos jogos em que os outros jogadores conhecem a estratégia de equilíbrio para os outros jogadores, então ninguém tem nada a ganhar ao mudar sua estratégia pessoal. Esta teoria vê uso em qualquer situação hostil em que o jogador deve responder as decisões tomadas por todos os outros jogadores para ganhar o jogo. | Khan Academy | PageRank |
PageRank é um algoritmo para medir a importância de um nó em um gráfico. Este algoritmo está na raiz dos algoritmos principais do Google para alimentar buscas relevantes aos usuários. | Princeton. edu | Pesquisa heurística pura |
Este algoritmo expande os nós em ordem do seu custo. Ele mantém duas listas. A lista fechada contém os nós que já explorou e a lista aberta contém os nós que ainda deve explorar. Em cada iteração, o algoritmo expande o nó com o menor custo possível. Todos os seus nós secundários são colocados na lista fechada e os custos individuais do nó filho são calculados. O algoritmo envia os nós filhos com um baixo custo de volta à lista aberta e exclui os nós filhos com um alto custo. Conseqüentemente, o algoritmo executa uma busca inteligente e baseada em custos para a solução. | World of Computing | Quicksort |
Esta é uma estratégia de classificação de propósito geral baseada em matrizes de particionamento de dados em matrizes menores.Depende de uma abordagem de divisão e conquista para executar sua tarefa. | Tutoriais | Árvore não balanceada |
Esta é uma árvore que coloca novos itens de dados sempre que necessário na árvore, independentemente do equilíbrio. Este método de adicionar itens torna a construção da árvore mais rápida, mas reduz a velocidade de acesso ao procurar ou classificar.
Quora
Algoritmos Diferenciadores de Outras Estruturas Matemáticas | Se você é como a maioria das pessoas, muitas vezes você se encontra riscando a cabeça quando se trata de estruturas matemáticas porque ninguém parece saber como usar os termos corretamente. É como se as pessoas tentassem deliberadamente tornar as coisas difíceis! Afinal, o que é uma equação e por que é diferente de um algoritmo? Bem, não tenha medo: a tabela a seguir fornece o guia definitivo para as estruturas de matemática que você pode encontrar, mas tem medo de perguntar. |
Estrutura | Descrição |
Equação | Números e símbolos que, quando considerados como um todo, equivalem a um valor específico. Uma equação sempre contém um sinal de igual para que você saiba que os números e símbolos representam o valor específico no outro lado do sinal de igual. As equações geralmente contêm informações variáveis apresentadas como um símbolo, mas não são necessárias para usar variáveis. |
Fórmula | Uma combinação de números e símbolos usados para expressar informações ou idéias. Uma fórmula normalmente apresenta conceitos matemáticos ou lógicos, como para definir o maior Divisor comum (GCD) de dois inteiros (o vídeo no Khan Academy conta como isso funciona). Geralmente, uma fórmula mostra a relação entre duas ou mais variáveis. A maioria das pessoas vê uma fórmula como um tipo especial de equação.
Algoritmo Uma seqüência de etapas usada para resolver um problema. A seqüência apresenta um método exclusivo de abordar um problema, fornecendo uma solução particular. Um algoritmo não precisa representar conceitos matemáticos ou lógicos, mesmo que as apresentações neste livro muitas vezes se enquadrem nessa categoria, porque as pessoas geralmente usam algoritmos dessa maneira. Algumas fórmulas especiais também são algoritmos, como a fórmula quadrática. Para que um processo represente um algoritmo, ele deve ser o seguinte: Finito: O algoritmo deve eventualmente resolver o problema. Bem definido: A série de etapas deve ser precisa e apresentar etapas que são compreensíveis, especialmente por computadores, que devem ser capazes de criar um algoritmo utilizável. |
Eficaz:
Um algoritmo deve resolver todos os casos do problema para o qual alguém o definiu. Um algoritmo deve sempre resolver o problema que ele tem para resolver. Mesmo que você antecipe algumas falhas, a incidência de falha é rara e ocorre apenas em situações aceitáveis para o uso do algoritmo pretendido.
Formas incríveis de usar Algoritmos | As pessoas realmente usam algoritmos o tempo todo. Por exemplo, fazer o brinde é um exemplo de um algoritmo, conforme explicado nesta publicação no blog. Fazer torradas não é um algoritmo incrível, mas os da tabela a seguir, que usam um computador para executar tarefas, são. |
Tarefa | Por que é surpreendente |
Criptografia | Manter os dados seguros é uma batalha contínua com hackers constantemente atacando fontes de dados. Algoritmos permitem analisar dados, colocá-lo em outra forma e, em seguida, devolvê-lo ao seu formulário original mais tarde. |
Análise de gráficos | A capacidade de decidir sobre a linha mais curta entre dois pontos encontra todo tipo de usos. Por exemplo, em um problema de roteamento, o seu GPS não poderia funcionar sem este algoritmo particular, porque nunca poderia dirigi-lo ao longo das ruas da cidade usando a rota mais curta do ponto A ao ponto B. |
geração de números pseudorandom | Imagine jogar que nunca variou. Você começa no mesmo local e executa os mesmos passos da mesma maneira toda vez que você joga. Chato! Sem a capacidade de gerar números aparentemente aleatórios, muitas tarefas de computador tornam-se inúteis ou impossíveis. |
Agendamento | Fazer o uso de recursos justo para todos os interessados é outra maneira pela qual os algoritmos tornam sua presença conhecida de uma maneira grande. Por exemplo, as luzes de sincronismo nas interseções não são mais dispositivos simples que contam os segundos entre as mudanças de luz. Os dispositivos modernos consideram todos os tipos de problemas, como a hora do dia, as condições climáticas e o fluxo de tráfego. O agendamento vem em muitas formas, no entanto. Considere como seu computador executa várias tarefas ao mesmo tempo. Sem um algoritmo de agendamento, o sistema operacional pode pegar todos os recursos disponíveis e manter seu aplicativo de qualquer trabalho útil. |
Pesquisando | Localizando informações ou verificando que a informação que você vê é a informação que deseja é uma tarefa essencial. Sem essa capacidade, muitas tarefas que você executa online não seriam possíveis, como encontrar o site na Internet que vende a cafeteira perfeita para o seu escritório. |
Ordenar | Determinar a ordem em que apresentar informações é importante porque a maioria das pessoas hoje sofre de sobrecarga de informações e precisa reduzir a onda de dados. Imagine ir para a Amazon, encontrando mais de mil potes de café à venda, e ainda não conseguindo ordená-los de acordo com o preço ou a revisão mais positiva. Além disso, muitos algoritmos complexos requerem dados na ordem correta para funcionar de forma confiável, de modo que a classificação é um requisito importante para resolver mais problemas. |
Transformando
Converter um tipo de dados para outro tipo de dados é fundamental para entender e usar os dados de forma eficaz. Por exemplo, você pode entender os pesos imperiais bem, mas todas as suas fontes usam o sistema métrico. A conversão entre os dois sistemas ajuda você a entender os dados. Da mesma forma, a Transformada de Fourier Rápida (FFT) converte sinais entre o domínio do tempo e o domínio de freqüência, permitindo que coisas como o seu roteador WiFi funcionem.
Lidando com complexidade de algoritmo | Você já sabe que os algoritmos são complexos. No entanto, você precisa saber o quão complexo é um algoritmo porque o mais complexo é, quanto mais demora a ser executado. A tabela a seguir ajuda você a entender os vários níveis de complexidade apresentados em ordem de tempo de execução (do mais rápido ao mais lento). |
Complexidade | Descrição |
Complexidade constante O (1) | Fornece um tempo de execução invariável, independentemente da quantidade de entrada que você fornecer. Cada entrada requer uma única unidade de tempo de execução. |
Complexidade logarítmica O (log n) | O número de operações cresce a uma taxa mais lenta do que a entrada, tornando o algoritmo menos eficiente com pequenas entradas e mais eficiente com as maiores. Um algoritmo típico desta classe é a pesquisa binária. |
Complexidade linear O (n) | As operações crescem com a entrada em uma proporção de 1: 1. Um algoritmo típico é a iteração, quando você digitaliza a entrada uma vez e aplica uma operação a cada elemento dela. |
Complexidade linearítmica O (n log n) A complexidade é uma mistura entre a complexidade logarítmica e linear. É típico de alguns algoritmos inteligentes usados para solicitar dados, como Mergesortsort, Heapsort e Quicksort. Complexidade quadrática O (n | 2 |
) As operações crescem como um quadrado do número de entradas. Quando você tem uma iteração dentro de outra iteração (chamada iteração aninhada na ciência da computação), você tem complexidade quadrática. Por exemplo, você tem uma lista de nomes e, para encontrar os mais parecidos, você compara cada nome com todos os outros nomes. Alguns algoritmos de ordenação menos eficientes apresentam tal complexidade: tipo de bolha, classificação de seleção e classificação de inserção. Esse nível de complexidade significa que seus algoritmos podem ser executados por horas ou mesmo dias antes de alcançar uma solução. Complexidade cúbica O (n | 3 |
) As operações crescem ainda mais rápido do que a complexidade quadrática porque agora você possui várias iterações aninhadas. Quando um algoritmo tem essa ordem de complexidade e você precisa processar uma quantidade modesta de dados (100 000 elementos), seu algoritmo pode ser executado por anos. Quando você tem uma série de operações que é uma potência da entrada, é comum referir o algoritmo como sendo executado em tempo polinomial. Complexidade exponencial O (2 | n |
) | O algoritmo leva duas vezes o número de operações anteriores para cada novo elemento adicionado. Quando um algoritmo tem essa complexidade, mesmo pequenos problemas podem demorar para sempre. Muitos algoritmos que fazem buscas exaustivas têm complexidade exponencial. No entanto, o exemplo clássico para esse nível de complexidade é o cálculo dos números Fibonacci. Complexidade fatorial O (n!) Este algoritmo apresenta um pesadelo real de complexidade devido ao grande número de combinações possíveis entre os elementos. Imagine: se a sua entrada é de 100 objetos e uma operação em seu computador leva 10 -6 segundos (uma velocidade razoável para cada computador hoje em dia), você precisará de cerca de 10 140 anos para completar a tarefa com sucesso (uma quantidade impossível de tempo porque a idade do universo é estimada em 10 |