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 |