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
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
- Matemática
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-gons
- Conjuntos
B
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ífica
- Cadeia de Caracteres
B
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 Matching
- Buscas
B
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ída
- Classificação
B
Bubble SortB
Selection SortB
Insertion SortB
Heap SortB
Merge SortB
Quicksort - implementações local e não localB
ShellsortB
Counting SortB
Radix Sort
- Arvóres
B
Depth-First Search (DFS)B
Breadth-First Search (BFS)
- Gráficos
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 origem
- criptografia
B
Polynomial Hash - função de hash de rolagem baseada em polinômio
- Sem categoria
B
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 Tour
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.
- Força bruta - look at all the possibilities and selects the best solution
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 origem
- Greedy - choose the best option at the current time, without any consideration for the future
B
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 ponderado
- Divide and Conquer - dividir o problema em partes menores e depois resolver essas partes
B
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)
- Dynamic Programming - criar uma solução usando sub-soluções encontradas anteriormente
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 Matching
- Backtracking - da mesma forma que a força bruta, tente gerar todas as soluções possíveis, mas cada vez que você gerar a próxima solução, você testará
se satisfizer todas as condições, e só então continuar gerando soluções subseqüentes. Caso contrário, volte atrás e siga um caminho diferente para encontrar uma solução. Normalmente, a passagem DFS do espaço de estados está sendo usada.
B
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ífica
- Branch & Bound - lembre-se da solução de menor custo encontrada em cada etapa do retrocesso pesquisar e usar o custo da solução de menor custo encontrada até o limite inferior do custo de solução de menor custo para o problema, a fim de descartar soluções parciais com custos maiores que o solução de menor custo encontrada até o momento. Normalmente, a travessia BFS em combinação com a passagem DFS do espaço de estados árvore está sendo usada
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'
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 |