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 |