diff --git a/README.it-IT.md b/README.it-IT.md new file mode 100644 index 00000000..8daa4ac6 --- /dev/null +++ b/README.it-IT.md @@ -0,0 +1,294 @@ +# Algoritmi e Strutture Dati in Javascript + +[![Build Status](https://travis-ci.org/trekhleb/javascript-algorithms.svg?branch=master)](https://travis-ci.org/trekhleb/javascript-algorithms) +[![codecov](https://codecov.io/gh/trekhleb/javascript-algorithms/branch/master/graph/badge.svg)](https://codecov.io/gh/trekhleb/javascript-algorithms) + +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:_ +[_简体中文_](README.zh-CN.md), +[_繁體中文_](README.zh-TW.md), +[_한국어_](README.ko-KR.md), +[_日本語_](README.ja-JP.md), +[_Polski_](README.pl-PL.md), +[_Français_](README.fr-FR.md), +[_Español_](README.es-ES.md), +[_Português_](README.pt-BR.md), +[_Italian_](README.it-IT.md) + +*☝ 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 Concatenata](src/data-structures/linked-list) +* `P` [Doppia Lista Concatenata](src/data-structures/doubly-linked-list) +* `P` [Coda](src/data-structures/queue) +* `P` [Pila](src/data-structures/stack) +* `P` [Hash Table](src/data-structures/hash-table) +* `P` [Heap](src/data-structures/heap) - versione massimo e minimo heap +* `P` [Coda di priorità](src/data-structures/priority-queue) +* `A` [Trie](src/data-structures/trie) +* `A` [Albero](src/data-structures/tree) + * `A` [Albero binario di ricerca](src/data-structures/tree/binary-search-tree) + * `A` [Albero AVL](src/data-structures/tree/avl-tree) + * `A` [RB Albero](src/data-structures/tree/red-black-tree) + * `A` [Albero Segmentato](src/data-structures/tree/segment-tree) - con min/max/sum esempi di query + * `A` [Albero di Fenwick](src/data-structures/tree/fenwick-tree) (Albero binario indicizzato) +* `A` [Grafo](src/data-structures/graph) (direzionale e unidirezionale) +* `A` [Set Disgiunto](src/data-structures/disjoint-set) +* `A` [Filtro Bloom](src/data-structures/bloom-filter) + +## 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](src/algorithms/math/bits) - set/get/update/clear bits, moltiplicazione/divisione per due, gestire numeri negativi etc. + * `P` [Fattoriale](src/algorithms/math/factorial) + * `P` [Numeri di Fibonacci](src/algorithms/math/fibonacci) - classico e forma chiusa + * `P` [Test di Primalità](src/algorithms/math/primality-test) (metodo del divisore) + * `P` [Algoritmo di Euclide](src/algorithms/math/euclidean-algorithm) - trova il massimo comune divisore (MCD) + * `P` [Minimo Comune Multiplo](src/algorithms/math/least-common-multiple) (MCM) + * `P` [Crivello di Eratostene](src/algorithms/math/sieve-of-eratosthenes) - trova i numeri i primi fino al limite indicato + * `P` [Potenza di due](src/algorithms/math/is-power-of-two) - controlla se il numero è una potenza di due + * `P` [Triangolo di Pascal](src/algorithms/math/pascal-triangle) + * `P` [Numeri Complessi](src/algorithms/math/complex-number) - numeri complessi e operazioni + * `P` [Radiante & Gradi](src/algorithms/math/radian) - conversione da radiante a gradi e viceversa + * `P` [Potenza di un Numero](src/algorithms/math/fast-powering) + * `A` [Partizione di un Intero](src/algorithms/math/integer-partition) + * `A` [Radice Quadrata](src/algorithms/math/square-root) - Metodo di Newton + * `A` [Algoritmo di Liu Hui π](src/algorithms/math/liu-hui) - calcolare π usando un poligono + * `A` [Trasformata Discreta di Fourier ](src/algorithms/math/fourier-transform) -decomporre una funzione di tempo (un segnale) nelle frequenze che lo compongono +* **Set** + * `P` [Prodotto Cartesiano](src/algorithms/sets/cartesian-product) - moltiplicazione multipla di set + * `P` [Fisher–Yates Shuffle](src/algorithms/sets/fisher-yates) - permutazione casuale di un sequenza finita + * `A` [Power Set](src/algorithms/sets/power-set) - tutti i sottoinsiemi di un set (soluzioni bitwise e backtracking) + * `A` [Permutazioni](src/algorithms/sets/permutations) (con e senza ripetizioni) + * `A` [Combinazioni](src/algorithms/sets/combinations) (con e senza ripetizioni) + * `A` [Massima Sottosequenza Comune](src/algorithms/sets/longest-common-subsequence) (LCS) + * `A` [Massima Sottosequenza Crescente](src/algorithms/sets/longest-increasing-subsequence) + * `A` [Minima Sottosequenza Diffusa](src/algorithms/sets/shortest-common-supersequence) (SCS) + * `A` [Problema dello Zaino di Knapsack](src/algorithms/sets/knapsack-problem) - "0/1" e "Senza Restrizioni" + * `A` [Massimo SubArray](src/algorithms/sets/maximum-subarray) - "Brute Force" e "Programmazione Dinamica" versione Kadane + * `A` [Somma di Combinazioni](src/algorithms/sets/combination-sum) - ricerca di tutte le combinazioni di una somma +* **String** + * `P` [Distanza di Hamming](src/algorithms/string/hamming-distance) - numero di posizioni in cui i caratteri sono diversi + * `A` [Distanza di Levenshtein](src/algorithms/string/levenshtein-distance) - numero minimo di modifiche per rendere uguali due stringhe + * `A` [Algoritmo di Knuth-Morris-Pratt](src/algorithms/string/knuth-morris-pratt) (KMP) - ricerca nella sottostringa (pattern matching) + * `A` [Algoritmo Z](src/algorithms/string/z-algorithm) - ricerca nella sottostringa (pattern matching) + * `A` [Algoritmo di Rabin Karp ](src/algorithms/string/rabin-karp) - ricerca nella sottostringa + * `A` [Sottostringa Comune più lunga](src/algorithms/string/longest-common-substring) + * `A` [Espressioni Regolari](src/algorithms/string/regular-expression-matching) +* **Searches** + * `P` [Ricerca Sequenziale](src/algorithms/search/linear-search) + * `P` [Ricerca a Salti](src/algorithms/search/jump-search) (o Ricerca a Blocchi) - per la ricerca in array ordinati + * `P` [Ricerca Binari](src/algorithms/search/binary-search) - per la ricerca in array ordinati + * `P` [Ricerca Interpolata](src/algorithms/search/interpolation-search) - per la ricerca in un array ordinato uniformemente distibuito +* **Sorting** + * `P` [Bubble Sort](src/algorithms/sorting/bubble-sort) + * `P` [Selection Sort](src/algorithms/sorting/selection-sort) + * `P` [Insertion Sort](src/algorithms/sorting/insertion-sort) + * `P` [Heap Sort](src/algorithms/sorting/heap-sort) + * `P` [Merge Sort](src/algorithms/sorting/merge-sort) + * `P` [Quicksort](src/algorithms/sorting/quick-sort) - con e senza allocazione di ulteriore memoria + * `P` [Shellsort](src/algorithms/sorting/shell-sort) + * `P` [Counting Sort](src/algorithms/sorting/counting-sort) + * `P` [Radix Sort](src/algorithms/sorting/radix-sort) +* **Lista Concatenatas** + * `P` [Attraversamento Lista Concatenata](src/algorithms/linked-list/traversal) + * `P` [Attraversamento Lista Concatenata nel senso Contrario](src/algorithms/linked-list/reverse-traversal) +* **Alberi** + * `P` [Ricerca in Profondità su Alberi](src/algorithms/tree/depth-first-search) (DFS) + * `P` [Ricerca in Ampiezza su Alberi](src/algorithms/tree/breadth-first-search) (BFS) +* **Grafi** + * `P` [Ricerca in Profondità su Grafi](src/algorithms/graph/depth-first-search) (DFS) + * `P` [Breadth-First Search su Grafi](src/algorithms/graph/breadth-first-search) (BFS) + * `P` [Algoritmo di Kruskal](src/algorithms/graph/kruskal) - ricerca dell'Albero con Minima Distanza (MST) per grafi pesati unidirezionali + * `A` [Algoritmo di Dijkstra](src/algorithms/graph/dijkstra) - ricerca dei percorsi più breve per raggiungere tutti i vertici del grafo da un singolo vertice + * `A` [Algoritmo di Bellman-Ford](src/algorithms/graph/bellman-ford) - ricerca dei percorsi più breve per raggiungere tutti i vertici del grafo da un singolo vertice + * `A` [Algoritmo di Floyd-Warshall](src/algorithms/graph/floyd-warshall) - ricerca dei percorsi più brevi tra tutte le coppie di vertici + * `A` [Rivelamento dei Cicli](src/algorithms/graph/detect-cycle) - per grafici diretti e non diretti (basate su partizioni DFS e Disjoint Set) + * `A` [Algoritmo di Prim](src/algorithms/graph/prim) - ricerca dell'Albero Ricoprente Minimo (MST) per grafi unidirezionali pesati + * `A` [Ordinamento Topologico](src/algorithms/graph/topological-sorting) - metodo DFS + * `A` [Punti di Articolazione](src/algorithms/graph/articulation-points) - Algoritmo di Tarjan (basato su DFS) + * `A` [Bridges](src/algorithms/graph/bridges) - basato su DFS + * `A` [Cammino Euleriano e Circuito Euleriano](src/algorithms/graph/eulerian-path) - Algoritmo di Fleury - Visita ogni margine esattamente una volta + * `A` [Ciclo di Hamiltonian](src/algorithms/graph/hamiltonian-cycle) - Visita ad ogni vertice solo una volta + * `A` [Componenti Fortemente Connessa](src/algorithms/graph/strongly-connected-components) - algoritmo di Kosaraju + * `A` [Problema del Commesso Viaggiatore](src/algorithms/graph/travelling-salesman) - il percorso più breve che visita ogni città e ritorna alla città iniziale +* **Crittografia** + * `P` [Hash Polinomiale](src/algorithms/cryptography/polynomial-hash) - Una funzione hash di rolling basata sul polinomio +* **Senza categoria** + * `P` [Torre di Hanoi](src/algorithms/uncategorized/hanoi-tower) + * `P` [Rotazione Matrice Quadrata](src/algorithms/uncategorized/square-matrix-rotation) - algoritmo in memoria + * `P` [Jump Game](src/algorithms/uncategorized/jump-game) - backtracking, programmazione dinamica (top-down + bottom-up) ed esempre di greeedy + * `P` [Percorsi Unici](src/algorithms/uncategorized/unique-paths) - backtracking, programmazione dinamica and l'esempio del Triangolo di Pascal + * `P` [Rain Terraces](src/algorithms/uncategorized/rain-terraces) - problema dell'acqua piovana in trappola(versione con programmazione dinamica e brute force) + * `P` [Recursive Staircase](src/algorithms/uncategorized/recursive-staircase) - contare il numero di percorsi per arrivare in vetta(4 soluzioni) + * `A` [Rompicapo delle Otto Regine](src/algorithms/uncategorized/n-queens) + * `A` [Percorso del Cavallo](src/algorithms/uncategorized/knight-tour) + +### 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 Lineare](src/algorithms/search/linear-search) + * `P` [Rain Terraces](src/algorithms/uncategorized/rain-terraces) - problema dell'acqua piovana in trappola + * `P` [Recursive Staircase](src/algorithms/uncategorized/recursive-staircase) - contare il numero di percorsi per arrivare in vetta + * `A` [Massimo SubArray](src/algorithms/sets/maximum-subarray) + * `A` [Problema del commesso viaggiatore](src/algorithms/graph/travelling-salesman) - il percorso più breve che visita ogni città e ritorna alla città iniziale + * `A` [Trasformata Discreta di Fourier](src/algorithms/math/fourier-transform) - 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 Game](src/algorithms/uncategorized/jump-game) + * `A` [Problema dello Zaino di Knapsack](src/algorithms/sets/knapsack-problem) + * `A` [Algoritmo di Dijkstra](src/algorithms/graph/dijkstra) - ricerca del percorso più breve tra tutti i vertici del grafo + * `A` [Algoritmo di Prim](src/algorithms/graph/prim) - ricerca del Minimo Albero Ricoprente per grafi pesati e unidirezionali + * `A` [Kruskal’s Algorithm](src/algorithms/graph/kruskal) - finding Minimum Spanning Tree (MST) for weighted undirected graph +* **Divide e Conquista** - divide il problema in piccole parti e risolve ogni parte + * `P` [Ricerca Binaria](src/algorithms/search/binary-search) + * `P` [Torre di Hanoi](src/algorithms/uncategorized/hanoi-tower) + * `P` [Triangolo di Pascal](src/algorithms/math/pascal-triangle) + * `P` [Algoritmo di Euclide](src/algorithms/math/euclidean-algorithm) - calculate the Greatest Common Divisor (GCD) + * `P` [Merge Sort](src/algorithms/sorting/merge-sort) + * `P` [Quicksort](src/algorithms/sorting/quick-sort) + * `P` [Albero per Ricerca in Profondità](src/algorithms/tree/depth-first-search) (DFS) + * `P` [Grafo per Ricerca in Profondità](src/algorithms/graph/depth-first-search) (DFS) + * `P` [Jump Game](src/algorithms/uncategorized/jump-game) + * `P` [Algoritmo di Elevamento a Potenza](src/algorithms/math/fast-powering) + * `A` [Permutazioni](src/algorithms/sets/permutations) (con o senza ripetizioni) + * `A` [Combinazioni](src/algorithms/sets/combinations) (con o senza ripetizioni) +* **Programmazione Dinamica** - creare una soluzione utilizzando le sub-solution trovate in precedenza + * `P` [Numero di Fibonacci](src/algorithms/math/fibonacci) + * `P` [Jump Game](src/algorithms/uncategorized/jump-game) + * `P` [Percorsi Unici](src/algorithms/uncategorized/unique-paths) + * `P` [Rain Terraces](src/algorithms/uncategorized/rain-terraces) - problema dell'acqua piovana in trappola + * `P` [Recursive Staircase](src/algorithms/uncategorized/recursive-staircase) - contare il numero di percorsi per arrivare in vetta + * `A` [Distanza di Levenshtein](src/algorithms/string/levenshtein-distance) - minima variazione tra due sequenze + * `A` [La Più Lunga Frequente SottoSequenza](src/algorithms/sets/longest-common-subsequence) (LCS) + * `A` [La Più Lunga Frequente SubString](src/algorithms/string/longest-common-substring) + * `A` [La Più Lunga SottoSequenza Crescente](src/algorithms/sets/longest-increasing-subsequence) + * `A` [La Più Corta e Frequente SuperSequenza](src/algorithms/sets/shortest-common-supersequence) + * `A` [Problema dello zaino](src/algorithms/sets/knapsack-problem) + * `A` [Partizione di un Intero](src/algorithms/math/integer-partition) + * `A` [Massimo SubArray](src/algorithms/sets/maximum-subarray) + * `A` [Algoritmo di Bellman-Ford](src/algorithms/graph/bellman-ford) - ricerca del percorso più breve per tutti i vertici del grafo + * `A` [Algoritmo di Floyd-Warshall](src/algorithms/graph/floyd-warshall) - ricerca del percorso più breve tra tutte le coppie di vertici + * `A` [Espressioni Regolari](src/algorithms/string/regular-expression-matching) +* **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 Game](src/algorithms/uncategorized/jump-game) + * `P` [Percorsi Unici](src/algorithms/uncategorized/unique-paths) + * `P` [Power Set](src/algorithms/sets/power-set) - tutti i subset di un set + * `A` [Ciclo di Hamiltonian](src/algorithms/graph/hamiltonian-cycle) - visita di tutti i vertici solamente una volta + * `A` [Problema di N-Queens](src/algorithms/uncategorized/n-queens) + * `A` [Knight's Tour](src/algorithms/uncategorized/knight-tour) + * `A` [Combinazioni di una Somma](src/algorithms/sets/combination-sum) - 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.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' +``` + +## Informazioni Utili + +### Bibliografia + +[▶ Data Structures and Algorithms on YouTube](https://www.youtube.com/playlist?list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) + +### 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. + +![Grafi Big O ](./assets/big-o-graph.png) + +Riferimento: [Big O Cheat Sheet](http://bigocheatsheet.com/). + +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 |