Estrutura de Dados e Algoritmos em JavaScript

February 12, 2025 · View on GitHub

CI codecov

Este repositório contém exemplos baseados em JavaScript de muitos algoritmos e estruturas de dados populares.

Cada algoritmo e estrutura de dados possui seu próprio README com explicações relacionadas e links para leitura adicional (incluindo vídeos para YouTube)

Leia isto em outros idiomas: English 简体中文, 繁體中文, 한국어, 日本語, Polski, Français, Español, Русский, Türk, Italiana, Bahasa Indonesia, Українська, Arabic, Tiếng Việt, Deutsch, Uzbek עברית

Estrutura de Dados

Uma estrutura de dados é uma maneira particular de organizar e armazenar dados em um computador para que ele possa ser acessado e modificado de forma eficiente. Mais precisamente, uma estrutura de dados é uma coleção de valores de dados, as relações entre eles e as funções ou operações que podem ser aplicadas aos dados.

B - Iniciante, A - Avançado

Algoritmos

Um algoritmo é uma especificação inequívoca de como resolver uma classe de problemas. Isto é um conjunto de regras que define precisamente uma sequência de operações.

B - Iniciante, A - Avançado

Algoritmos por Tópico

Algoritmos por Paradigma

Um paradigma algorítmico é um método ou abordagem genérica subjacente ao design de uma classe de algoritmos. É uma abstração maior do que a noção de um algoritmo, assim como algoritmo é uma abstração maior que um programa de computador.

Como usar este repositório

Instalar todas as dependências

npm install

Executar o ESLint

Você pode querer executá-lo para verificar a qualidade do código.

npm run lint

Execute todos os testes

npm test

Executar testes por nome

npm test -- 'LinkedList'

Solução de problemas

Caso o linting ou o teste estejam falhando, tente excluir a pasta node_modules e reinstalar os pacotes npm:

rm -rf ./node_modules
npm i

Verifique também se você está usando uma versão correta do Node (>=14.16.0). Se você estiver usando nvm para gerenciamento de versão do Node, você pode executar nvm use a partir da pasta raiz do projeto e a versão correta será escolhida.

Playground

Você pode brincar com estruturas de dados e algoritmos no arquivo ./src/playground/playground.js e escrever testes para isso em ./src/playground/__test__/playground.test.js.

Em seguida, basta executar o seguinte comando para testar se o código do seu playground funciona conforme o esperado:

npm test -- 'playground'

Informação útil

Referências

Notação Big O

A notação Big O é usada para classificar algoritmos de acordo com a forma como seu tempo de execução ou requisitos de espaço crescem à medida que o tamanho da entrada aumenta. No gráfico abaixo você pode encontrar as ordens mais comuns de crescimento de algoritmos especificados na notação Big O.

Notação Big-O

Fonte: Notação Big-O Dicas.

Abaixo está a lista de algumas das notações Big O mais usadas e suas comparações de desempenho em relação aos diferentes tamanhos dos dados de entrada.

Notação Big-OCálculos para 10 elementosCálculos para 100 elementosCálculos para 1000 elementos
O(1)111
O(log N)369
O(N)101001000
O(N log N)306009000
O(N^2)100100001000000
O(2^N)10241.26e+291.07e+301
O(N!)36288009.3e+1574.02e+2567

Complexidade de operações de estrutura de dados

Estrutura de dadosAcessoBuscaInserçãoEliminaçãoComentários
Array1nnn
Stacknn11
Queuenn11
Linked Listnn11
Hash Table-nnnEm caso de uma função hash perfeita, os custos seriam O(1)
Binary Search TreennnnNo caso de custos de árvore equilibrados seria O(log(n))
B-Treelog(n)log(n)log(n)log(n)
Red-Black Treelog(n)log(n)log(n)log(n)
AVL Treelog(n)log(n)log(n)log(n)
Bloom Filter-11-Falsos positivos são possíveis durante a pesquisa

Complexidade dos Algoritmos de Ordenação de Matrizes

NomeMelhorMédiaPiorMémoriaEstávelComentários
Bubble sortnn2n21Sim
Insertion sortnn2n21Sim
Selection sortn2n2n21Não
Heap sortn log(n)n log(n)n log(n)1Não
Merge sortn log(n)n log(n)n log(n)nSim
Quick sortn log(n)n log(n)n2log(n)NãoO Quicksort geralmente é feito no local com espaço de pilha O(log(n))
Shell sortn log(n)depende da sequência de lacunasn (log(n))21Não
Counting sortn + rn + rn + rn + rSimr - maior número na matriz
Radix sortn * kn * kn * kn + kSimk - comprimento da chave mais longa

ℹ️ Outros projetos e artigos sobre JavaScript e algoritmos em trekhleb.dev