Ecco finalmente la guida di algoritmi e strutture dati in ptyhon!
Tutte le implementazioni degli algoritmi sono nella cartella Algorithms, mentre le implementazioni della strutture dai sono nel cartella Data Strucutres. All'interno di ognuna di queste cartelle sia gli algoritmi che le strutture dati sono raggruppate ognuno in una cartelle che li rappresenta.
Il testing degli algoritmi e strutture dati implementate è nella cartella pytest
Mentre nella cartella resouces contienete tutte le immagini che utilizzate nei README
.
├── README.md
├── .gitignore
├── resources
├── algorithms
├── test
├── resources
└── data_structures
B
- Beginner, A
- Advanced
B
Linked ListB
Double Linked ListB
Circular Double Linked ListB
Queue - versione con array monodimesionaleB
Queue - versione con array circolareB
StackB
Heap
B
- Beginner, A
- Advanced
-
Math
A
Fibonacci con Programmazione dinamica
-
Sorting
B
Bubble SortB
Selection SortB
Insertion SortB
Heap SortB
Merge SortB
Quicksort - versione normale e anche la versione randomizzataB
Counting Sort
-
Sets
B
Maximum Subarray - versione ricorsivaA
Maxium Subarray - versione iterativa
-
Searching
- Forza Bruta
- Algoritmi Golosi (Greedy Algorithms)
- Dividi et Impera
- Programmazione Dinamica
- Backtraking
Dato che per risolvere un determinato problemo molto spesso esistono molteplici algoritmi risolutori, il problema che si pone è quello di riuscire a trovare un algoritmo corretto in modo tale da portelo confrontare con un altro algoritmo anch'esso corretto e poter decidere quale sia il "miglore" per risolvere lo stesso problema.
Per fare ciò c'è bisogno di introdurre un concetto basilare che rigurda lo studio degli algoritmi cioè: la complessità computazionale
La complessità computazionale è lo studio della quantità di risorse (memoria e tempo di calcolo) necessari a un certo algoritmo per risolvere un problema dato.
Quindi teoricamente per ogni input bisognerebbe studiare quello che è il tempo di esecuzione di un algoritmo, ma i teorici dell’informatica hanno introdotto delle notazioni che permettono di semplificare la rappresentazione della complessità computazionale di un algoritmo.
Infatti hanno notato che il fattore determinante che ci permette di scegliere l'algoritmo migliore è il suo tasso di crescita. Per tasso di crescita si intende la velocità con cui cresce il tempo di esecuzione all'aumentare della dimensione dell'input al limite, quando la dimensione dell'input cresce senza limitazioni. Questo si chiama anche studiare l'efficenza asintotica degli algoritmi.
Le notazioni che si usano per descrivere il tempo di esecuzione asintotico sono definite in termini di funzioni il cui dominio è l'insieme dei numeri naturali. Tali notazioni sono comode per descrivere la funzione T(n), tempo di esecuzione dell'algoritmo, che di solito è definita soltanto con dimensioni intere dell'input.
Per una data funzione g(n), indichiamo con Θ(g(n)) l'insieme delle funzioni
Θ(g(n)) = { f(n) : esistono delle costanti positive c1, c2 e n0 tali che 0 ≤ c1g(n) ≤ f(n) ≤ c2g(n) per ogni n ≥ n0 }
Graficamente succede questo:
g(n) è un limite asintoticamente stretto per f(n)
Per una data funzione g(n), indichiamo con O(g(n)) l'insieme delle funzioni
O(g(n)) = { f(n) : esistono delle costanti positive c e n0 tali che 0 ≤ f(n) ≤ cg(n) per ogni n ≥ n0 }
Graficamente succede questo:
g(n) è un limite asintoticamente superiore (stretto) per f(n)
Per una data funzione g(n), indichiamo con Ω(g(n)) l'insieme delle funzioni
Ω(g(n)) = { f(n) : esistono delle costanti positive c e n0 tali che 0 ≤ cg(n) ≤ f(n) per ogni n ≥ n0 }
Graficamente succede questo:
g(n) è un limite asintoticamente inferiore (stretto) per f(n)
Si prega di leggere CONTRIBUTING.md per i dettagli sul codice di condotta e il processo di invio delle richieste pull.
- Da migliorare la sezione delle notazioni basilari
- aggingere readme stastistiche d'ordine
- aggiunge i nuovi algoritmi alla lista iniziale
- Radix sort
- Bucket sort
- Sequenza moltiplicazioni matrici (Dynamic Programming)
- Greedy Algorithms
- Algoritmi Programmazione dinamica
- ALberi
- Alberi binari
- Alberi Radicati
- Alberi rosso/neri
- Trie
- Tavole Hash
- stack
- coda
- Dividi et impera algorithms
- counting sort
- Dynamic Programming algorithms