21 KiB
Algoritmi e Strutture Dati in Javascript
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, Bahasa Indonesia, Українська, Arabic, Deutsch
☝ 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.
Strutture Dati
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
AlberoA
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 Bloom
Algoritmi
Un 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
Algoritmi per Topic
- Matematica
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 compongono
- Set
P
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 somma
- String
P
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 Regolari
- Searches
P
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 distibuito
- Sorting
P
Bubble SortP
Selection SortP
Insertion SortP
Heap SortP
Merge SortP
Quicksort - con e senza allocazione di ulteriore memoriaP
ShellsortP
Counting SortP
Radix Sort
- Lista Concatenatas
- Alberi
P
Ricerca in Profondità su Alberi (DFS)P
Ricerca in Ampiezza su Alberi (BFS)
- Grafi
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à iniziale
- Crittografia
P
Hash Polinomiale - Una funzione hash di rolling basata sul polinomio
- Senza categoria
P
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 Cavallo
Modelli di Algoritmi
Un 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.
- Brute Force - controlla tutte le possibilità e seleziona la migliore
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 compongono
- Greedy - scegliere l'opzione migliore al momento d'eleborazione dell'algoritmo, senza alcuna considerazione per il futuro
P
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 graph
- Divide e Conquista - divide il problema in piccole parti e risolve ogni parte
P
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)
- Programmazione Dinamica - creare una soluzione utilizzando le sub-solution trovate in precedenza
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 Regolari
- Backtracking - come la brute force, provate a generare tutte le soluzioni possibili, ma ogni volta che generate la prossima soluzione testate se soddisfa tutte le condizioni e solo allora continuare a generare soluzioni successive. Altrimenti, fate marcia indietro, e andate su un percorso diverso per trovare una soluzione. Normalmente si utilizza l'algoritmo DFS.
P
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 somma
- Branch & Bound - ricordatevi che la soluzione meno costosa trovata ad ogni step durante il backtracking e il costo di usare la soluzione meno costosa trovata fino al limite inferiore al costo minimo della soluzione al problema, al fine di scartare soluzioni parziali con costi maggiori della soluzione meno costosa trovata . Di solito si usa BFS trasversale in combinazione con DFS trasversale .
Come usare questa repository
Installare 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.jse 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'
Informazioni Utili
Bibliografia
▶ Data Structures and Algorithms on YouTube
Notazione Big O
- La notazione Big O* è usata per classificare algoritmi in base al tempo di esecuzione o ai requisiti di spazio che crescono in base alla crescita dell'input . Nella grafico qua sotto puoi trovare gli ordini di crescita più comuni degli algoritmi usando la notazione Big O.
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 |
Complessità delle Operazion sulle Strutture Dati
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 |
Complessità degli Algoritmi di Ordinamento di Array
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 |
ℹ️ A few more projects and articles about JavaScript and algorithms on trekhleb.dev