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