Questa repository contiene esempi in Javascript dei più popolari algoritmi e strutture dati .
Ogni algortimo e struttura dati ha il suo README separato e la relative spiegazioni e i link per ulteriori approfondimenti (compresi quelli su YouTube).
Leggilo in altre lingue: 简体中文, 繁體中文, 한국어, 日本語, Polski, Français, Español, Português, Русский, Türk
☝ Si noti che questo progetto è destinato ad essere utilizzato solo per l’apprendimento e la ricerca e non è destinato ad essere utilizzato per il commercio.
Una struttura dati è un particolare modo di organizzare e memorizzare i dati in un computer che permeta di accedervi e modificarli in modo efficiente. Più precisamente, una struttura dati è una raccolta di dati, le relazioni tra di essi e le funzioni o operazioni che possono essere applicate ai dati.
P - Principiante, A - Avanzato
P Lista ConcatenataP Doppia Lista ConcatenataP CodaP PilaP Hash TableP Heap - versione massimo e minimo heapP Coda di prioritàA TrieA Albero
A Albero binario di ricercaA Albero AVLA RB AlberoA Albero Segmentato - con min/max/sum esempi di queryA Albero di Fenwick (Albero binario indicizzato)A Grafo (direzionale e unidirezionale)A Set DisgiuntoA Filtro BloomUn algoritmo è una specifica univoca per risolvere una classe di problemi. È un insieme di regole che definiscono con precisione una sequenza di operazioni.
P - Principiante, A - Avanzato
P Manipolazione dei Bit - set/get/update/clear bits, moltiplicazione/divisione per due, gestire numeri negativi etc.P FattorialeP Numeri di Fibonacci - classico e forma chiusaP Test di Primalità (metodo del divisore)P Algoritmo di Euclide - trova il massimo comune divisore (MCD)P Minimo Comune Multiplo (MCM)P Crivello di Eratostene - trova i numeri i primi fino al limite indicatoP Potenza di due - controlla se il numero è una potenza di dueP Triangolo di PascalP Numeri Complessi - numeri complessi e operazioniP Radiante & Gradi - conversione da radiante a gradi e viceversaP Potenza di un NumeroA Partizione di un InteroA Radice Quadrata - Metodo di NewtonA Algoritmo di Liu Hui π - calcolare π usando un poligonoA Trasformata Discreta di Fourier -decomporre una funzione di tempo (un segnale) nelle frequenze che lo compongonoP Prodotto Cartesiano - moltiplicazione multipla di setP Fisher–Yates Shuffle - permutazione casuale di un sequenza finitaA Power Set - tutti i sottoinsiemi di un set (soluzioni bitwise e backtracking)A Permutazioni (con e senza ripetizioni)A Combinazioni (con e senza ripetizioni)A Massima Sottosequenza Comune (LCS)A Massima Sottosequenza CrescenteA Minima Sottosequenza Diffusa (SCS)A Problema dello Zaino di Knapsack - “0/1” e “Senza Restrizioni”A Massimo SubArray - “Brute Force” e “Programmazione Dinamica” versione KadaneA Somma di Combinazioni - ricerca di tutte le combinazioni di una sommaP Distanza di Hamming - numero di posizioni in cui i caratteri sono diversiA Distanza di Levenshtein - numero minimo di modifiche per rendere uguali due stringheA Algoritmo di Knuth-Morris-Pratt (KMP) - ricerca nella sottostringa (pattern matching)A Algoritmo Z - ricerca nella sottostringa (pattern matching)A Algoritmo di Rabin Karp - ricerca nella sottostringaA Sottostringa Comune più lungaA Espressioni RegolariP Ricerca SequenzialeP Ricerca a Salti (o Ricerca a Blocchi) - per la ricerca in array ordinatiP Ricerca Binari - per la ricerca in array ordinatiP Ricerca Interpolata - per la ricerca in un array ordinato uniformemente distibuitoP Bubble SortP Selection SortP Insertion SortP Heap SortP Merge SortP Quicksort - con e senza allocazione di ulteriore memoriaP ShellsortP Counting SortP Radix SortP Ricerca in Profondità su Alberi (DFS)P Ricerca in Ampiezza su Alberi (BFS)P Ricerca in Profondità su Grafi (DFS)P Breadth-First Search su Grafi (BFS)P Algoritmo di Kruskal - ricerca dell’Albero con Minima Distanza (MST) per grafi pesati unidirezionaliA Algoritmo di Dijkstra - ricerca dei percorsi più breve per raggiungere tutti i vertici del grafo da un singolo verticeA Algoritmo di Bellman-Ford - ricerca dei percorsi più breve per raggiungere tutti i vertici del grafo da un singolo verticeA Algoritmo di Floyd-Warshall - ricerca dei percorsi più brevi tra tutte le coppie di verticiA Rivelamento dei Cicli - per grafici diretti e non diretti (basate su partizioni DFS e Disjoint Set)A Algoritmo di Prim - ricerca dell’Albero Ricoprente Minimo (MST) per grafi unidirezionali pesatiA Ordinamento Topologico - metodo DFSA Punti di Articolazione - Algoritmo di Tarjan (basato su DFS)A Bridges - basato su DFSA Cammino Euleriano e Circuito Euleriano - Algoritmo di Fleury - Visita ogni margine esattamente una voltaA Ciclo di Hamiltonian - Visita ad ogni vertice solo una voltaA Componenti Fortemente Connessa - algoritmo di KosarajuA Problema del Commesso Viaggiatore - il percorso più breve che visita ogni città e ritorna alla città inizialeP Hash Polinomiale - Una funzione hash di rolling basata sul polinomioP Torre di HanoiP Rotazione Matrice Quadrata - algoritmo in memoriaP Jump Game - backtracking, programmazione dinamica (top-down + bottom-up) ed esempre di greeedyP Percorsi Unici - backtracking, programmazione dinamica and l’esempio del Triangolo di PascalP Rain Terraces - problema dell’acqua piovana in trappola(versione con programmazione dinamica e brute force)P Recursive Staircase - contare il numero di percorsi per arrivare in vetta(4 soluzioni)A Rompicapo delle Otto RegineA Percorso del CavalloUn modello di algoritmo è un generico metodo o approcio che sta alla base della progettazione di una classe di algoritmi. Si tratta di un’astrazione ancora più alta di un algoritmo, proprio come un algoritmo è un’astrazione di un programma del computer.
P Ricerca LineareP Rain Terraces - problema dell’acqua piovana in trappolaP Recursive Staircase - contare il numero di percorsi per arrivare in vettaA Massimo SubArrayA Problema del commesso viaggiatore - il percorso più breve che visita ogni città e ritorna alla città inizialeA Trasformata Discreta di Fourier - scomporre la funzione (segnale) del tempo in frequenze che la compongonoP Jump GameA Problema dello Zaino di KnapsackA Algoritmo di Dijkstra - ricerca del percorso più breve tra tutti i vertici del grafoA Algoritmo di Prim - ricerca del Minimo Albero Ricoprente per grafi pesati e unidirezionaliA Kruskal’s Algorithm - finding Minimum Spanning Tree (MST) for weighted undirected graphP Ricerca BinariaP Torre di HanoiP Triangolo di PascalP Algoritmo di Euclide - calculate the Greatest Common Divisor (GCD)P Merge SortP QuicksortP Albero per Ricerca in Profondità (DFS)P Grafo per Ricerca in Profondità (DFS)P Jump GameP Algoritmo di Elevamento a PotenzaA Permutazioni (con o senza ripetizioni)A Combinazioni (con o senza ripetizioni)P Numero di FibonacciP Jump GameP Percorsi UniciP Rain Terraces - problema dell’acqua piovana in trappolaP Recursive Staircase - contare il numero di percorsi per arrivare in vettaA Distanza di Levenshtein - minima variazione tra due sequenzeA La Più Lunga Frequente SottoSequenza (LCS)A La Più Lunga Frequente SubStringA La Più Lunga SottoSequenza CrescenteA La Più Corta e Frequente SuperSequenzaA Problema dello zainoA Partizione di un InteroA Massimo SubArrayA Algoritmo di Bellman-Ford - ricerca del percorso più breve per tutti i vertici del grafoA Algoritmo di Floyd-Warshall - ricerca del percorso più breve tra tutte le coppie di verticiA Espressioni RegolariP Jump GameP Percorsi UniciP Power Set - tutti i subset di un setA Ciclo di Hamiltonian - visita di tutti i vertici solamente una voltaA Problema di N-QueensA Knight’s TourA Combinazioni di una Somma - trovare tutte le combinazioni che compongono una sommaInstallare tutte le dipendenze
npm install
Eseguire ESLint
Potresti usarlo per controllare la qualità del codice.
npm run lint
Eseguire tutti i test
npm test
Eseguire un test tramite il nome
npm test -- 'LinkedList'
Playground
Se vuoi puoi giocare le strutture dati e gli algoritmi nel file ./src/playground/playground.js e
scrivere test nel file ./src/playground/test/playground.test.js`.
Poi puoi semplicemente eseguire il seguente comando per testare quello che hai scritto :
npm test -- 'playground'
▶ Data Structures and Algorithms on YouTube

Riferimento: Big O Cheat Sheet.
Nella tabella qua sotto ci sono riportate la lista delle notazioni Big O più usate e delle loro prestazioni comparate tra differenti grandezze d’input .
| Notazione Big O | Computazione con 10 elementi | Computazione con 100 elementi | Computazione con 1000 elementi |
|---|---|---|---|
| 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 |
| Struttura Dati | Accesso | Ricerca | Inserimento | Rimozione | Commenti |
|---|---|---|---|---|---|
| Array | 1 | n | n | n | |
| Pila | n | n | 1 | 1 | |
| Coda | n | n | 1 | 1 | |
| Lista Concatenata | n | n | 1 | n | |
| Tabella Hash | - | n | n | n | Nel caso di una funzione di hashing perfetta il costo sarebbe O(1) |
| Binary Search Tree | n | n | n | n | Nel caso di albero bilanciato il costo sarebbe O(log(n)) |
| B-Tree | log(n) | log(n) | log(n) | log(n) | |
| Red-Black Tree | log(n) | log(n) | log(n) | log(n) | |
| Albero AVL | log(n) | log(n) | log(n) | log(n) | |
| Bloom Filter | - | 1 | 1 | - | Falsi positivi sono possibili durante la ricerca |
| Nome | Milgiore | Media | Perggiore | Memoria | Stabile | Commenti |
|---|---|---|---|---|---|---|
| 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 viene eseguito in memoria solitamente con una pila di O(log(n)) |
| Shell sort | n log(n) | dipende dagli spazi vuoti nella sequenza | n (log(n))2 | 1 | No | |
| Counting sort | n + r | n + r | n + r | n + r | Yes | r - numero più grande nell’array |
| Radix sort | n * k | n * k | n * k | n + k | Yes | k - lunghezza della chiave più grande |