Questo repository contiene esempi basati su JavaScript di molti algoritmi e strutture dati popolari.
Ogni algoritmo e struttura dati ha il suo README separato con spiegazioni e collegamenti correlati per ulteriori letture (comprese quelle ai video di YouTube).
Leggi questo in altre lingue: 简体中文, 繁體中文, 한국어, Polski, Français, Español, Português
☝ Si noti che questo progetto è pensato per essere utilizzato per scopi di apprendimento e ricerca solo e non è pensato per essere utilizzato per la produzione.
Una struttura dati è un modo particolare di organizzare e archiviare i dati in un computer in modo che possa essere accessibili e modificati in modo efficiente. Più precisamente, una struttura dati è una raccolta di dati valori, le relazioni tra loro e le funzioni o le operazioni a cui è possibile applicare i dati.
B
- Principiante, A
- Avanzate
B
Lista collegataB
Lista Doubly LinkedB
CodaB
PilaB
Tabella hashB
Mucchio - max and min heap versionsB
Coda prioritariaA
provaA
AlberoA
Albero di ricerca binarioA
Albero AVLA
Albero rosso-neroA
Albero del segmento - with min/max/sum range queries examplesA
Albero di Fenwick (Binary Indexed Tree)
A
Grafico (both directed and undirected)A
Set disgiuntoA
Filtro Bloom
Un algoritmo è una specifica inequivocabile su come risolvere una classe di problemi. È un insieme di regole che definiscono con precisione una sequenza di operazioni.
B
- Principiante, A
- Avanzate
- Matematica
B
Manipolazione bit - set/get/update/clear bits, multiplication/division by two, make negative etc.B
FattorialeB
Numero di Fibonacci - classic and closed-form versionsB
Test di primalità (trial division method)B
Algoritmo euclideo - calculate the Greatest Common Divisor (GCD)B
Minimo comune multiplo (LCM)B
Setaccio di Eratostene - finding all prime numbers up to any given limitB
È il potere di due - check if the number is power of two (naive and bitwise algorithms)B
Triangolo di PascalB
Numero complesso - complex numbers and basic operations with themB
Radian & Degree - radians to degree and backwards conversionB
Alimentazione veloceA
Partizione interaA
Algoritmo di Liu Hui π - approximate π calculations based on N-gonsA
Trasformata di Fourier discreta - decompose a function of time (a signal) into the frequencies that make it up
- Sets
B
Prodotto cartesiano - product of multiple setsB
Fisher–Yates Shuffle - random permutation of a finite sequenceA
Power Set - all subsets of a set (bitwise and backtracking solutions)A
permutazioni (with and without repetitions)A
combinazioni (with and without repetitions)A
La più lunga successiva in comune (LCS)A
Il più lungo aumento successivoA
Short Supersequence più breve (SCS)A
Problema dello zaino - "0/1" and "Unbound" onesA
Subarray massimo - "Brute Force" and "Dynamic Programming" (Kadane's) versionsA
Somma combinata - find all combinations that form specific sum
- stringhe
B
Hamming Distance - number of positions at which the symbols are differentA
Levenshtein Distance - minimum edit distance between two sequencesA
Algoritmo di Knuth-Morris-Pratt (KMP Algorithm) - substring search (pattern matching)A
Z Algoritmo - substring search (pattern matching)A
Rabin Karp Algoritmo - substring searchA
La sottostringa comune più lungaA
Corrispondenza delle espressioni regolari
- ricerche
B
Ricerca lineareB
Salta ricerca (or Block Search) - search in sorted arrayB
Ricerca binaria - search in sorted arrayB
Ricerca di interpolazione - search in uniformly distributed sorted array
- Ordinamento
B
Bolla OrdinareB
Selezione OrdinaB
Inserimento OrdinaB
Ordinamento heapB
Unisci OrdinaB
Quicksort - in-place and non-in-place implementationsB
ShellsortB
Conteggio SortB
Radix Sort
- Elenchi collegati
- Alberi
B
Depth-First Search (DFS)B
Larghezza prima ricerca (BFS)
- grafici
B
Depth-First Search (DFS)B
Breadth-First Search (BFS)B
Algoritmo di Kruskal - finding Minimum Spanning Tree (MST) for weighted undirected graphA
Dijkstra Algoritmo - finding shortest paths to all graph vertices from single vertexA
Bellman-Ford Algoritmo - finding shortest paths to all graph vertices from single vertexA
Floyd-Warshall Algoritmo - find shortest paths between all pairs of verticesA
Rileva il ciclo - for both directed and undirected graphs (DFS and Disjoint Set based versions)A
Prim’s Algoritmo - finding Minimum Spanning Tree (MST) for weighted undirected graphA
Ordinamento topologico - DFS methodA
Punti di articolazione - Tarjan's algorithm (DFS based)A
ponti - DFS based algorithmA
Sentiero Euleriano e Circuito Euleriano - Fleury's algorithm - Visit every edge exactly onceA
Ciclo hamiltoniano - Visit every vertex exactly onceA
Componenti fortemente connessi - Kosaraju's algorithmA
Problema del commesso viaggiatore - shortest possible route that visits each city and returns to the origin city
- Crittografia
B
Hash polinomiale - rolling hash function based on polynomial
- Non categorizzato
B
Torre di HanoiB
Rotazione a matrice quadrata - in-place algorithmB
Salta il gioco - backtracking, dynamic programming (top-down + bottom-up) and greedy examplesB
Percorsi unici - backtracking, dynamic programming and Pascal's Triangle based examplesB
Terrazze di pioggia - trapping rain water problem (dynamic programming and brute force versions)B
Scala ricorsiva - count the number of ways to reach to the top (4 solutions)A
N-Queens ProblemA
Knight's Tour
Un paradigma algoritmico è un metodo o approccio generico alla base del design di una classe di algoritmi. È un'astrazione superiore alla nozione di algoritmo, proprio come a l'algoritmo è un'astrazione più alta di un programma per computer.
- Brute Force - guarda tutte le possibilità e seleziona la soluzione migliore
B
Ricerca lineareB
Rain Terraces - intrappolando il problema dell'acqua piovanaB
Scala ricorsiva - contare il numero di modi per raggiungere la cimaA
Maximum SubarrayA
Problema del commesso viaggiatore - il percorso più breve possibile che visita ciascuna città e ritorna alla città di origineA
Discrete Fourier Transform - decompone una funzione del tempo (un segnale) nelle frequenze che lo compongono
- Greedy - scegli l'opzione migliore al momento attuale, senza alcuna considerazione per il futuro
B
Jump GameA
Problema dello zaino non legatoA
Dijkstra Algoritmo - trovare il percorso più breve per tutti i vertici del graficoA
Prim’s Algoritmo - trovare Minimum Spanning Tree (MST) per il grafico ponderato non orientatoA
Algoritmo di Kruskal - trovare Minimum Spanning Tree (MST) per il grafico ponderato non orientato
- Dividi e Conquista - dividi il problema in parti più piccole e poi risolvi quelle parti
B
Ricerca binariaB
Torre di HanoiB
Pascal's TriangleB
Algoritmo euclideo - calcola il più grande divisore comune (GCD)B
Merge SortB
QuicksortB
Tree Depth-First Search (DFS)B
Graph Depth-First Search (DFS)B
Jump GameB
Fast PoweringA
Permutazione (con e senza ripetizioni)A
Combinazioni (con e senza ripetizioni)
- Programmazione dinamica - crea una soluzione utilizzando sub-soluzioni trovate in precedenza
B
numero di FibonacciB
Jump GameB
Percorsi univociB
Rain Terraces - intrappolando il problema dell'acqua piovanaB
Scala ricorsiva - contare il numero di modi per raggiungere la cimaA
Levenshtein Distance - distanza minima di modifica tra due sequenzeA
Longest Common Subsequence (LCS)A
Longest Common SubstringA
Longest Increasing SubsequenceA
Supersequence comune più breveA
0/1 Knapsack ProblemA
Integer PartitionA
Maximum SubarrayA
Algoritmo Bellman-Ford - trovare il percorso più breve per tutti i vertici del graficoA
Floyd-Warshall Algoritmo - find shortest paths between all pairs of verticesA
Regular Expression Matching
- Backtracking - similmente alla forza bruta, prova a generare tutte le possibili soluzioni, ma ogni volta che generi la prossima soluzione prova
se soddisfa tutte le condizioni, e solo allora continua a generare soluzioni successive. Altrimenti, torna indietro e vai su a
percorso diverso per trovare una soluzione. Normalmente viene utilizzata la traversata DFS dello spazio degli stati.
B
Jump GameB
Percorsi univociB
Power Set - tutti i sottoinsiemi di un setA
Hamiltonian Cycle - Visita ogni vertice esattamente una voltaA
N-Queens ProblemA
Knight's TourA
somma combinata - trova tutte le combinazioni che formano la somma specifica
- Branch & Bound - ricorda la soluzione più economica trovata in ogni fase del backtracking cerca e utilizza il costo della soluzione più economica trovata fino a un limite inferiore sul costo di una soluzione meno costosa al problema, al fine di scartare soluzioni parziali con costi maggiori del soluzione più economica trovata finora. Normalmente attraversamento di BFS in combinazione con attraversamento DFS di stato-spazio albero viene utilizzato.
Installa tutte le dipendenze
npm install
Esegui ESLint
Si consiglia di eseguirlo per verificare la qualità del codice.
npm run lint
Esegui tutti i test
npm test
Esegui test per nome
npm test -- 'LinkedList'
Playground
Puoi giocare con strutture dati e algoritmi nel file ./src/playground/playground.js
e scrivere
prova per questo in ./src/playground/__test__/playground.test.js
.
Quindi basta semplicemente eseguire il seguente comando per verificare se il codice del tuo parco giochi funziona come previsto:
npm test -- 'playground'
▶ Strutture dati e algoritmi su YouTube
La notazione O grande viene utilizzata per classificare gli algoritmi in base a come il loro tempo di esecuzione oi requisiti di spazio aumentano con l'aumentare delle dimensioni di input. Nella tabella sottostante è possibile trovare gli ordini di crescita più comuni degli algoritmi specificati nella notazione Big O.
Fonte: Big O Cheat Sheet.
Di seguito è riportato l'elenco di alcune delle notazioni Big O più utilizzate e dei relativi confronti delle prestazioni rispetto a diverse dimensioni dei dati di input.
Big O Notation | Computations for 10 elements | Computations for 100 elements | Computations for 1000 elements |
---|---|---|---|
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 |
Data Structure | Access | Search | Insertion | Deletion | Comments |
---|---|---|---|---|---|
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 | In case of perfect hash function costs would be O(1) |
Binary Search Tree | n | n | n | n | In case of balanced tree costs would be 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 | - | False positives are possible while searching |
Name | Best | Average | Worst | Memory | Stable | Comments |
---|---|---|---|---|---|---|
Bubble sort | n | n2 | n2 | 1 | Yes | |
Insertion sort | n | n2 | n2 | 1 | Yes | |
Selection sort | n2 | n2 | n2 | 1 | No | |
Heap sort | n log(n) | n log(n) | n log(n) | 1 | No | |
Merge sort | n log(n) | n log(n) | n log(n) | n | Yes | |
Quick sort | n log(n) | n log(n) | n2 | log(n) | No | Quicksort is usually done in-place with O(log(n)) stack space |
Shell sort | n log(n) | depends on gap sequence | n (log(n))2 | 1 | No | |
Counting sort | n + r | n + r | n + r | n + r | Yes | r - biggest number in array |
Radix sort | n * k | n * k | n * k | n + k | Yes | k - length of longest key |