💻 Meus estudos sobre algoritmos e estruturas de dados
Bom, eu criei esse repositório para registra o meu progresso quando estava estudando algoritmos e estrutura de dados. Eu dividi o repositório em algoritmos de busca e ordenação e estrutura de dados, onde cada algoritmo possui um _readme_ explicando os conceitos por trás dele. Logo abaixo tem uma explicação sobre alguns assuntos que são importantes para o entendimento das estruturas de dados e de algoritmos em geral.
Um algoritmo nada mais é do que uma receita que mostra passo a passo os procedimentos necessários para a resolução de uma tarefa. Ele não responde a pergunta “o que fazer?”, mas sim “como fazer”. Em termos mais técnicos, um algoritmo é uma sequência lógica, finita e definida de instruções que devem ser seguidas para resolver um problema ou executar uma tarefa. Todas as tarefas executadas pelo computador, são baseadas em Algoritmos. Logo, um algoritmo deve também ser bem definido, pois é uma máquina que o executará. Uma calculadora por exemplo, para executar a operação de multiplicação, executa um algoritmo que calcula somas até um determinado número de vezes.
A notação Big O é uma notação especial que diz o quão rápido é um algoritmo. Bem, é importante saber disso, já que você frequentemente utilizara o algoritmo que outra pessoa fez - e quando faz isso, é bom entender o quão rapido ou lento o algoritmo é.
A ideia é usar a letra O seguida de uma função sobre n que descreva o crescimento de um algoritmo, no gráfico. Quanto mais rapidamente crescer o número de operações para processar os itens, pior será o desempenho do algoritmo.
A complexidade O(1) (constante) é aquela em que não há crescimento do número de operações, pois não depende do volume de dados de entrada (n). Por exemplo: o acesso direto a um elemento de uma matriz.
A complexidade O(log n) (logaritmo) é aquela em que o crescimento do número de operações é menor do que o do número de itens. Exemplo: caso médio do algoritmo de busca em árvores binárias ordenadas.
A complexidade O(n) (linear) é aquela em que o crescimento no número de operações é diretamente proporcional ao crescimento do número de itens. Por exemplo: o algoritmo de busca em uma lista/vetor.
A complexidade O(n log n) (linearitmica ou quasilinear) é aquela em que é resultado das operações (log n) executada n vezes. Exemplo: o caso médio do algoritmo de ordenação Quicksort.
A complexidade O(n^2 ) (quadrático) é aquela que ocorre quando os itens de dados são processados aos pares, muitas vezes com repetições dentro da outra. Com dados suficientemente grandes, tendem a se tornar muito ruim. Por exemplo: o processamento de itens de uma matriz bidimensional.
A complexidade O(2^n ) (exponencial) é aquela em que a medida que n aumenta, o fator analisado (tempo ou espaço) aumenta exponencialmente. Não é executável para valores muito grandes e não são úteis do ponto de vista prático. Exemplo: busca em uma árvore binária não ordenada.
A complexidade O(n!) (fatorial) é aquela em que o número de instruções executadas cresce muito rapidamente para um pequeno número de dados. Por exemplo: um algoritmo que gere todas as possíveis permutações de uma lista.
- Os códigos em C foram feitos no CodeBlocks então para abrir os projetos é só entrar no clodeblocks e abrir o arquivo ".cbp", caso queira editar ou rodar os projetos.
- Os códigos em Java foram feitos tanto no VScode quanto no NetBeans, por isso que alguns projetos tem uma leve diferença na organização das pastas.
- Todos os códigos foram feitos no windows.
As seguintes ferramentas foram usadas na construção do projeto:
- Livros
- Introdução a Estruturas de Dados - Com Técnicas de Programação em C
- Entendendo Algoritmos: Um Guia Ilustrado Para Programadores e Outros Curiosos
- Estrutura de dados e seus Algoritmos by Jayme Luiz Szwarcfiter | Lilian Markenzon
- Sites
- https://blog.pantuza.com/artigos/busca-binaria
- https://algoritmosempython.com.br/cursos/algoritmos-python/pesquisa-ordenacao/pesquisa-binaria/
- https://www.embarcados.com.br/algoritmos-de-ordenacao-bubble-sort/
- https://www.geeksforgeeks.org/selection-sort/
- https://dev.to/danielle8farias/complexidade-de-algoritmos-notacao-big-o-26al
- https://www.ime.usp.br/~pf/mac0122-2002/aulas/hashing.html
- https://pt.wikipedia.org/wiki/Tabela_de_dispers%C3%A3o#:~:text=Em%20ci%C3%AAncia%20da%20computa%C3%A7%C3%A3o%2C%20uma,e%20obter%20o%20valor%20desejado.
- https://www.devmedia.com.br/algoritmos-de-ordenacao-em-java/32693
Raphael Nascimento
Feito com ❤️ por Raphael Nascimento 👋🏽 Entre em contato!