Este repositório contém exemplos baseados em JavaScript de muitos algoritmos e estruturas de dados populares.
Cada algoritmo e estrutura de dado 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
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 dados valores, as relações entre eles e as funções ou operações que podem ser aplicadas a os dados.
B - Iniciante, A - Avançado
B Lista Encadeada (Linked List)B Lista Duplamente Ligada (Doubly Linked List)B Fila (Queue)B StackB Tabela de Hash (Hash Table)B HeapB Fila de Prioridade (Priority Queue)A Árvore de prefixos (Trie)A Árvore (Tree)
A Árvore de Pesquisa Binária (Binary Search Tree)A Árvore AVL (AVL Tree)A Árvore Vermelha-Preta (Red-Black Tree)A Árvore de Segmento (Segment Tree) - com exemplos de consultas min / max / sum rangeA Árvore Fenwick (Fenwick Tree) (Árvore indexada binária)A Gráfico (Graph) (ambos dirigidos e não direcionados)A Conjunto Disjuntor (Disjoint Set)A Filtro Bloom (Bloom Filter)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
B Manipulação Bit - set/get/update/clear bits, multiplicação / divisão por dois, tornar negativo etc.B FatorialB Número de FibonacciB Teste de Primalidade (método de divisão experimental)B Algoritmo Euclidiano - calcular o maior divisor comum (GCD)B Mínimo múltiplo comum (LCM)B Peneira de Eratóstenes - encontrar todos os números primos até um determinado limiteB Potência de dois - verifique se o número é a potência de dois (algoritmos ingênuos e bit a bit)B Triângulo de PascalB Número complexo - números complexos e operações básicas com elesA Partição inteiraA Algoritmo Liu Hui π - cálculos aproximados de π baseados em N-gonsB Produto cartesiano - produto de vários conjuntosB Permutações de Fisher–Yates - permutação aleatória de uma sequência finitaA Potência e Conjunto - todos os subconjuntos de um conjuntoA Permutações (com e sem repetições)A Combinações (com e sem repetições)A Mais longa subsequência comum (LCS)A Maior subsequência crescenteA Supersequência Comum mais curta (SCS)A Problema da mochila - “0/1” e “Não consolidado”A Máximo Subarray - “Força bruta” e “ Programação Dinâmica” versões (Kadane’s)A Soma de Combinação - encontre todas as combinações que formam uma soma específicaB Hamming Distance - número de posições em que os símbolos são diferentesA Levenshtein Distance - distância mínima de edição entre duas sequênciasA Knuth–Morris–Pratt Algorithm (Algoritmo KMP) - pesquisa de substring (correspondência de padrão)A Z Algorithm - pesquisa de substring (correspondência de padrão)A Rabin Karp Algorithm - pesquisa de substringA Longest Common SubstringA Regular Expression MatchingB Linear SearchB Jump Search (ou Bloquear pesquisa) - pesquisar na matriz ordenadaB Binary Search - pesquisar na matriz ordenadaB Interpolation Search - pesquisar em matriz classificada uniformemente distribuídaB Bubble SortB Selection SortB Insertion SortB Heap SortB Merge SortB Quicksort - implementações local e não localB ShellsortB Counting SortB Radix SortB Depth-First Search (DFS)B Breadth-First Search (BFS)B Depth-First Search (DFS)B Breadth-First Search (BFS)B Kruskal’s Algorithm - encontrando Árvore Mínima de Abrangência (MST) para grafo não direcionado ponderadoA Dijkstra Algorithm - encontrar caminhos mais curtos para todos os vértices do grafo a partir de um único vérticeA Bellman-Ford Algorithm - encontrar caminhos mais curtos para todos os vértices do grafo a partir de um único vérticeA Floyd-Warshall Algorithm - encontrar caminhos mais curtos entre todos os pares de vérticesA Detect Cycle - para gráficos direcionados e não direcionados (versões baseadas em DFS e Conjunto Disjuntivo)A Prim’s Algorithm - encontrando Árvore Mínima de Abrangência (MST) para grafo não direcionado ponderadoA Topological Sorting - Métodos DFSA Articulation Points -O algoritmo de Tarjan (baseado em DFS)A Bridges - Algoritmo baseado em DFSA Eulerian Path and Eulerian Circuit - Algoritmo de Fleury - Visite todas as bordas exatamente uma vezA Hamiltonian Cycle - Visite todas as bordas exatamente uma vezA Strongly Connected Components - Algoritmo de Kosaraju’sA Travelling Salesman Problem - rota mais curta possível que visita cada cidade e retorna à cidade de origemB Polynomial Hash - função de hash de rolagem baseada em polinômioB Tower of HanoiB Square Matrix Rotation - algoritmo no localB Jump Game - backtracking, programação dinâmica (top-down + bottom-up) e exemplos gananciososB Unique Paths - backtracking, programação dinâmica e exemplos baseados no triângulo de PascalB Rain Terraces - trapping problema da água da chuva (programação dinâmica e versões de força bruta)A N-Queens ProblemA Knight’s TourUm 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.
B Linear SearchB Rain Terraces - trapping problema da água da chuvaA Maximum SubarrayA Travelling Salesman Problem - rota mais curta possível que visita cada cidade e retorna à cidade de origemB Jump GameA Unbound Knapsack ProblemA Dijkstra Algorithm - finding shortest path to all graph verticesA Prim’s Algorithm - encontrando Árvore Mínima de Abrangência (MST) para grafo não direcionado ponderadoA Kruskal’s Algorithm - encontrando Árvore Mínima de Abrangência (MST) para grafo não direcionado ponderadoB Binary SearchB Tower of HanoiB Pascal’s TriangleB Euclidean Algorithm - calculate the Greatest Common Divisor (GCD)B Merge SortB QuicksortB Tree Depth-First Search (DFS)B Graph Depth-First Search (DFS)B Jump GameA Permutations (com e sem repetições)A Combinations (com e sem repetições)B Fibonacci NumberB Jump GameB Unique PathsB Rain Terraces - trapping problema da água da chuvaA Levenshtein Distance - distância mínima de edição entre duas sequênciasA Longest Common Subsequence (LCS)A Longest Common SubstringA Longest Increasing SubsequenceA Shortest Common SupersequenceA 0/1 Knapsack ProblemA Integer PartitionA Maximum SubarrayA Bellman-Ford Algorithm - encontrando o caminho mais curto para todos os vértices do gráficoA Floyd-Warshall Algorithm - encontrar caminhos mais curtos entre todos os pares de vérticesA Regular Expression MatchingB Jump GameB Unique PathsA Hamiltonian Cycle - Visite todos os vértices exatamente uma vezA N-Queens ProblemA Knight’s TourA Combination Sum - encontre todas as combinações que formam uma soma específicaInstalar 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'
Parque infantil
Você pode brincar com estruturas de dados e algoritmos em ./src/playground/playground.js arquivar 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'
▶ Estruturas de dados e algoritmos no YouTube
Ordem de crescimento dos algoritmos especificados em 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-O | Cálculos para 10 elementos | Cálculos para 100 elementos | Cálculos para 1000 elementos |
|---|---|---|---|
| O(1) | 1 | 1 | 1 |
| O(log N) | 3 | 6 | 9 |
| O(N) | 10 | 100 | 1000 |
| O(N log N) | 30 | 600 | 9000 |
| O(N^2) | 100 | 10000 | 1000000 |
| O(2^N) | 1024 | 1.26e+29 | 1.07e+301 |
| O(N!) | 3628800 | 9.3e+157 | 4.02e+2567 |
| estrutura de dados | Acesso | Busca | Inserção | Eliminação | comentários |
|---|---|---|---|---|---|
| Array | 1 | n | n | n | |
| Stack | n | n | 1 | 1 | |
| Queue | n | n | 1 | 1 | |
| Linked List | n | n | 1 | 1 | |
| Hash Table | - | n | n | n | Em caso de uma função hash perfeita, os custos seriam O (1) |
| Binary Search Tree | n | n | n | n | No caso de custos de árvore equilibrados seria O (log (n)) |
| B-Tree | log(n) | log(n) | log(n) | log(n) | |
| Red-Black Tree | log(n) | log(n) | log(n) | log(n) | |
| AVL Tree | log(n) | log(n) | log(n) | log(n) | |
| Bloom Filter | - | 1 | 1 | - | Falsos positivos são possíveis durante a pesquisa |
| Nome | Melhor | Média | Pior | Mémoria | Estável | comentários |
|---|---|---|---|---|---|---|
| Bubble sort | n | n2 | n2 | 1 | Sim | |
| Insertion sort | n | n2 | n2 | 1 | Sim | |
| Selection sort | n2 | n2 | n2 | 1 | Não | |
| Heap sort | n log(n) | n log(n) | n log(n) | 1 | Não | |
| Merge sort | n log(n) | n log(n) | n log(n) | n | Sim | |
| Quick sort | n log(n) | n log(n) | n2 | log(n) | Não | O Quicksort geralmente é feito no local com o espaço de pilha O O(log(n)) stack space |
| Shell sort | n log(n) | depende da sequência de lacunas | n (log(n))2 | 1 | Não | |
| Counting sort | n + r | n + r | n + r | n + r | Sim | r - maior número na matriz |
| Radix sort | n * k | n * k | n * k | n + k | Sim | k - comprimento da chave mais longa |