Skip to content

Aqui vão ficar todos os meus estudos sobre algoritmos e estruturas de dados 🤓. Espero que esse conhecimento ajude outras pessoas interessadas no assunto 💻.

License

Notifications You must be signed in to change notification settings

raphael720/Algoritmos_e_Estrutura_de_Dados

Repository files navigation

Algoritmo e estrutura de dados

💻 Meus estudos sobre algoritmos e estruturas de dados

GitHub issues GitHub forks GitHub stars

Tabela de conteúdos

Status do projeto

🚧 Repositório Em construção... 🚧

Sobre

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.

O que é algoritmo?

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.

Notação Big O

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.

gráfico de crescimento de complexidade

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.

Observações

  • 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.

🛠 Tecnologias

As seguintes ferramentas foram usadas na construção do projeto:

Referencias

Aqui estão os livros e sites que eu usei como referencia para fazer esse repositório

Autor


Raphael Nascimento

Feito com ❤️ por Raphael Nascimento 👋🏽 Entre em contato!

Twitter Badge Linkedin Badge Gmail Badge

About

Aqui vão ficar todos os meus estudos sobre algoritmos e estruturas de dados 🤓. Espero que esse conhecimento ajude outras pessoas interessadas no assunto 💻.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages