Algoritmo
In ambito matematico (entscheidungsproblem) e informatico (teoria della calcolabilità) rappresenta una sequenza finita di operazioni, o istruzioni, che permettono di risolvere i quesiti di una stessa classe o di calcolare il risultato di un’espressione matematica.
Molti algoritmi si avvalgono di tecniche per rappresentare (strutture dati) ed organizzare i dati utilizzati nel calcolo e non sono necessariamente altrettanto sofisticate rispetto all’algoritmo che le usa in quanto algoritmi semplici possono richiedere strutture dati complesse e viceversa.
Data la moltitudine di applicazione e tipologie vengono raggruppati e catalogati a seconda della loro funzione o delle tecniche utilizzate per realizzarli:
- Algoritmo iterativo: costituito da una sequenza di azioni ripetute, finché è necessaria la ripetizione del un ciclo;
- Algoritmo ricorsivo: consente di eseguire dei compiti ripetitivi su di un set di variabili in input;
- Algoritmo di ordinamento: utilizzato per posizionare gli elementi di un insieme secondo una sequenza stabilita da una relazione d’ordine;
- Algoritmi di ricerca: permette di trovare un elemento avente determinate caratteristiche all’interno di un insieme di elementi:
- ricerca sequenziale: trovare un elemento in un insieme non ordinato;
- ricerca binaria: trovare un elemento in un insieme ordinato di dati;
- Algoritmo genetico evolutivo: basato sul principio della selezione naturale ed evoluzione biologica tentare di risolvere problemi di ottimizzazione per i quali non si conoscono altri algoritmi efficienti di complessità lineare o polinomiale;
- Algoritmo per la Swarm Intelligence: basato sul metodo euristico di ottimizzazione per la ricerca tramite la misurazione sulla qualità della soluzione;
- Algoritmo combinatorio: utilizzato per inserire gli elementi di un insieme in un’opportuna struttura dati che permetta di verificare successivamente se un generico elemento appartiene oppure no all’insieme;
- Algoritmo del codice automodificante: utilizzato per creare programmi, come virus, in grado di modificare il proprio codice durante l’esecuzione;
- Algoritmo della conversione e codifica: utilizzato per convertire un numero decimale in binario;
- Algoritmo di compressione: utilizzato per l’elaborazione dei dati riducendone la quantità di bit necessari alla rappresentazione digitale di un’informazione:
- senza perdita di informazioni:
- run-length encoding (PackBits e PCX);
- codifica a riduzione locale di Entropia (Huffman e aritmetica);
- codifica a dizionario (DEFLATE, LZ77, LZ78, Lempel-Ziv-Welch o ZIP e LZMA);
- trasformata di Burrows-Wheeler;
- PPM;
- con perdita di informazione:
- trasformata discreta del coseno (MPEG e JPEG);
- compressione frattale (trasformazione frattale);
- Wavelet (rappresentazione di un segnale mediante l’uso di una forma d’onda oscillante di lunghezza finita o a decadimento rapido):
- MP3;
- JPEG2000;
- senza perdita di informazioni:
- Algoritmo quantistico: utilizzato per il calcolo quantistico svolto dalle macchine di Touring quantistiche;
- Algoritmo apriori: utilizzato anche nel data mining per effettuare una ricerca delle associazioni;
- Algoritmo di Berger: utilizzato per stilare il calendario di una competizione sportiva con la formula del girone all’italiana;
- Algoritmo di Sturm: utilizzato per calcolare il numero di radici reali di un polinomio a coefficienti reali che cadono in un determinato intervallo;
- Algoritmo online: utilizzato per la risoluzione di un problema, che deve fornire dei risultati pur non avendo a disposizione, inizialmente, alcuni dei dati in ingresso;
- Algoritmo di pitch detection: utilizzato per valutare la frequenza fondamentale di un segnale periodico o quasi periodico, generalmente una registrazione digitale della voce o di una nota musicale;
- Algoritmo di sommatoria di Kahan: utilizzato per ridurre significativamente l’errore numerico nel totale ottenuto sommando una sequenza di numeri in virgola mobile con precisione finita, se confrontato con il consueto procedimento;
- Algoritmo di Euclide: utilizzato per trovare il massimo comune divisore tra due numeri interi;
- Algoritmo di prostaferesi: utilizzato per determinare in modo approssimato il risultato di una moltiplicazione sfruttando alcune relazioni trigonometriche;
- Algoritmo di pattern matching su stringhe: utilizzato per provare a individuare una posizione all’interno di una stringa più grande (testo), in cui una o più stringhe più piccole (pattern) si trovano;
- Algoritmo Doomsday: utilizzato per calcolare il giorno della settimana di una specifica data passata o futura;
- Algoritmo di Dijkstra: utilizzato per cercare i cammini minimi in un grafo con o senza ordinamento, ciclico e con pesi non negativi sugli archi e consente di ottimizzare le realizzazioni delle reti (telecomunicazioni, idriche, stradali, circuitali, ecc.);
- Algoritmo di Boyer-Moore: utilizzato per elaborare la stringa (pattern) da cercare, ma non la stringa esaminata (testo);
- Algoritmo di Knuth-Morris-Pratt: utilizzato per trovare le occorrenze di una stringa (pattern) in una stringa (testo);
- Algoritmo di Prim: utilizzato nella teoria dei grafi, informatica e ricerca operativa per determinare gli alberi di supporto minimi di un grafo non orientato e con pesi non negativi;
- Algoritmo di Gauss-Newton: utilizzato per risolvere problemi di minimi quadrati (funzioni) e regressioni non lineari (statistica);
- Algoritmo della linea di Bresenham: utilizzato per la rasterizzazione di linee, soprattutto per la sua bassa richiesta di risorse computazionali (conversione di una immagine bidimensionale vettoriale in raster o bitmap);
- Algoritmo del simplesso: utilizzato per risolvere problemi di programmazione lineare;
- Algoritmo delle colonie di formiche: utilizzato per la ricerca dei percorsi ottimali in un grafo partendo dal comportamento dei superorganismi sull’ottimizzazione metaeuristica del percorso ottimale tra la colonia e la fonte di cibo;
- Algoritmo del banchiere: utilizzato per evitare deadlock (due risorse si bloccano a vicenda entrando in stallo sistemico) nell’allocazione delle risorse indicando le risorse che consentono lo sblocco e la messa in sicurezza del sistema;
- Algoritmo del fornaio: utilizzato come metodo mutex (procedimento di sincronizzazione fra thread concorrenti per impedire che pi ù task paralleli accedano contemporaneamente ai dati in memoria) che trovano applicazione pratica nella programmazione parallela per serializzare l’esecuzione delle sezioni critiche (porzione di codice che accede a una risorsa condivisa tra più flussi di esecuzione di un sistema concorrente) da parte di thread concorrenti;
- Algoritmo dell’ascensore: utilizzato per il disk scheduling (decide l’ordine delle operazioni di I/O richieste da sottoporre al volume di immagazzinamento) per stabilire l’ordine in cui devono essere processate le richieste di lettura e richieste di scrittura su disco rigido (dispositivo di memoria di massa magnetico);
- Algoritmo del puzzle: utilizzato nella crittografia a chiave pubblica dove solo i soggetti coinvolti conoscono la chiave di cifratura;
- Algoritmo del biglietto: utilizzato per sincronizzare i processi per verificare dei thread in esecuzione che hanno i permessi di accesso ad una sezione critica del sistema, ovvero una risorsa condivisa tra più processi;
- Algoritmo di elezione: utilizzato nei sistemi distribuiti per stabilire il coordinatore a cui i processi fanno riferimento per un servizio:
- Algoritmo dello spaccone di Garzia;
- Algoritmo ad anello di Le Lann;
- Algoritmo di Chang e Robert;
- Algoritmo di Dolev, Klawe e Rodeh.