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, Tiếng Việt, Deutsch, Uzbek עברית
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
PLista ConcatenataPDoppia Lista ConcatenataPCodaPPilaPHash TablePHeap - versione massimo e minimo heapPCoda di prioritàATrieAAlberoAAlbero binario di ricercaAAlbero AVLARB AlberoAAlbero Segmentato - con min/max/sum esempi di queryAAlbero di Fenwick (Albero binario indicizzato)
AGrafo (direzionale e unidirezionale)ASet DisgiuntoAFiltro 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
PManipolazione dei Bit - set/get/update/clear bits, moltiplicazione/divisione per due, gestire numeri negativi etc.PFattorialePNumeri di Fibonacci - classico e forma chiusaPTest di Primalità (metodo del divisore)PAlgoritmo di Euclide - trova il massimo comune divisore (MCD)PMinimo Comune Multiplo (MCM)PCrivello di Eratostene - trova i numeri i primi fino al limite indicatoPPotenza di due - controlla se il numero è una potenza di duePTriangolo di PascalPNumeri Complessi - numeri complessi e operazioniPRadiante & Gradi - conversione da radiante a gradi e viceversaPPotenza di un NumeroAPartizione di un InteroARadice Quadrata - Metodo di NewtonAAlgoritmo di Liu Hui π - calcolare π usando un poligonoATrasformata Discreta di Fourier -decomporre una funzione di tempo (un segnale) nelle frequenze che lo compongono
- Set
PProdotto Cartesiano - moltiplicazione multipla di setPFisher–Yates Shuffle - permutazione casuale di un sequenza finitaAPower Set - tutti i sottoinsiemi di un set (soluzioni bitwise e backtracking)APermutazioni (con e senza ripetizioni)ACombinazioni (con e senza ripetizioni)AMassima Sottosequenza Comune (LCS)AMassima Sottosequenza CrescenteAMinima Sottosequenza Diffusa (SCS)AProblema dello Zaino di Knapsack - "0/1" e "Senza Restrizioni"AMassimo SubArray - "Brute Force" e "Programmazione Dinamica" versione KadaneASomma di Combinazioni - ricerca di tutte le combinazioni di una somma
- String
PDistanza di Hamming - numero di posizioni in cui i caratteri sono diversiADistanza di Levenshtein - numero minimo di modifiche per rendere uguali due stringheAAlgoritmo di Knuth-Morris-Pratt (KMP) - ricerca nella sottostringa (pattern matching)AAlgoritmo Z - ricerca nella sottostringa (pattern matching)AAlgoritmo di Rabin Karp - ricerca nella sottostringaASottostringa Comune più lungaAEspressioni Regolari
- Searches
PRicerca SequenzialePRicerca a Salti (o Ricerca a Blocchi) - per la ricerca in array ordinatiPRicerca Binari - per la ricerca in array ordinatiPRicerca Interpolata - per la ricerca in un array ordinato uniformemente distibuito
- Sorting
PBubble SortPSelection SortPInsertion SortPHeap SortPMerge SortPQuicksort - con e senza allocazione di ulteriore memoriaPShellsortPCounting SortPRadix Sort
- Lista Concatenatas
- Alberi
PRicerca in Profondità su Alberi (DFS)PRicerca in Ampiezza su Alberi (BFS)
- Grafi
PRicerca in Profondità su Grafi (DFS)PBreadth-First Search su Grafi (BFS)PAlgoritmo di Kruskal - ricerca dell'Albero con Minima Distanza (MST) per grafi pesati unidirezionaliAAlgoritmo di Dijkstra - ricerca dei percorsi più breve per raggiungere tutti i vertici del grafo da un singolo verticeAAlgoritmo di Bellman-Ford - ricerca dei percorsi più breve per raggiungere tutti i vertici del grafo da un singolo verticeAAlgoritmo di Floyd-Warshall - ricerca dei percorsi più brevi tra tutte le coppie di verticiARivelamento dei Cicli - per grafici diretti e non diretti (basate su partizioni DFS e Disjoint Set)AAlgoritmo di Prim - ricerca dell'Albero Ricoprente Minimo (MST) per grafi unidirezionali pesatiAOrdinamento Topologico - metodo DFSAPunti di Articolazione - Algoritmo di Tarjan (basato su DFS)ABridges - basato su DFSACammino Euleriano e Circuito Euleriano - Algoritmo di Fleury - Visita ogni margine esattamente una voltaACiclo di Hamiltonian - Visita ad ogni vertice solo una voltaAComponenti Fortemente Connessa - algoritmo di KosarajuAProblema del Commesso Viaggiatore - il percorso più breve che visita ogni città e ritorna alla città iniziale
- Crittografia
PHash Polinomiale - Una funzione hash di rolling basata sul polinomio
- Senza categoria
PTorre di HanoiPRotazione Matrice Quadrata - algoritmo in memoriaPJump Game - backtracking, programmazione dinamica (top-down + bottom-up) ed esempre di greeedyPPercorsi Unici - backtracking, programmazione dinamica and l'esempio del Triangolo di PascalPRain Terraces - problema dell'acqua piovana in trappola(versione con programmazione dinamica e brute force)PRecursive Staircase - contare il numero di percorsi per arrivare in vetta(4 soluzioni)ARompicapo delle Otto RegineAPercorso 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
PRicerca LinearePRain Terraces - problema dell'acqua piovana in trappolaPRecursive Staircase - contare il numero di percorsi per arrivare in vettaAMassimo SubArrayAProblema del commesso viaggiatore - il percorso più breve che visita ogni città e ritorna alla città inizialeATrasformata 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
PJump GameAProblema dello Zaino di KnapsackAAlgoritmo di Dijkstra - ricerca del percorso più breve tra tutti i vertici del grafoAAlgoritmo di Prim - ricerca del Minimo Albero Ricoprente per grafi pesati e unidirezionaliAKruskal’s Algorithm - finding Minimum Spanning Tree (MST) for weighted undirected graph
- Divide e Conquista - divide il problema in piccole parti e risolve ogni parte
PRicerca BinariaPTorre di HanoiPTriangolo di PascalPAlgoritmo di Euclide - calculate the Greatest Common Divisor (GCD)PMerge SortPQuicksortPAlbero per Ricerca in Profondità (DFS)PGrafo per Ricerca in Profondità (DFS)PJump GamePAlgoritmo di Elevamento a PotenzaAPermutazioni (con o senza ripetizioni)ACombinazioni (con o senza ripetizioni)
- Programmazione Dinamica - creare una soluzione utilizzando le sub-solution trovate in precedenza
PNumero di FibonacciPJump GamePPercorsi UniciPRain Terraces - problema dell'acqua piovana in trappolaPRecursive Staircase - contare il numero di percorsi per arrivare in vettaADistanza di Levenshtein - minima variazione tra due sequenzeALa Più Lunga Frequente SottoSequenza (LCS)ALa Più Lunga Frequente SubStringALa Più Lunga SottoSequenza CrescenteALa Più Corta e Frequente SuperSequenzaAProblema dello zainoAPartizione di un InteroAMassimo SubArrayAAlgoritmo di Bellman-Ford - ricerca del percorso più breve per tutti i vertici del grafoAAlgoritmo di Floyd-Warshall - ricerca del percorso più breve tra tutte le coppie di verticiAEspressioni 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.
PJump GamePPercorsi UniciPPower Set - tutti i subset di un setACiclo di Hamiltonian - visita di tutti i vertici solamente una voltaAProblema di N-QueensAKnight's TourACombinazioni 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
