GLI ALGORITMI VISIBILE SUL BLOG [email protected] INFORMATICA ANNO SCOLASTICO 2013 / 2014 GABRIELE SCARICA 2°T INNANZITUTTO COSA E’ UN ALGORITMO … • Un algoritmo è un procedimento formale che risolve un determinato problema attraverso un numero finito di passi. Un problema risolvibile mediante un algoritmo si dice ”computabile”. Il termine algoritmo deriva dalla trascrizione latina del nome di un matematico arabo – medioevale, al-Khwarizmi , che è considerato uno dei primi autori ad aver fatto riferimento a questo concetto. • Questo può anche essere considerato un insieme di azioni (o istruzioni) che, eseguite secondo un ordine prestabilito, permettono di trovare il risultato cercato sulla base dei dati in ingresso QUANTI TIPI DI ALGORITMI CONOSCIAMO E ANDREMO AD ANALIZZARE ? INNANZITUTTO VA DETTO CHE SI DIVIDONO IN BASE ALL’ ORDINE CHE SI VUOLE DARE ALLE INFORMAZIONI • • • • • • • Quick sort Heap sort Merge sort Counting sort Bubble sort Selection sort Insertion sort Quick sort • Ordina i dati suddividendo il problema in problema più semplici In altre parole diciamo che la base del suo funzionamento è l'utilizzo ricorsivo della procedura “partition” : preso un elemento da una struttura dati (es. array) si pongono gli elementi minori a sinistra rispetto a questo e gli elementi maggiori a destra. • Il Quicksort, termine che tradotto letteralmente in italiano indica ordinamento rapido, è un algoritmo di ordinamento che ha, in generale , prestazioni migliori tra quelli basati su confronto. È stato ideato da Charles Antony Richard Hoare nel 1961. Heap sort • Algoritmo che inserisce a destra dell’ elenco il valore piu semplice • L' heapsort è un algoritmo di ordinamento iterativo ed “inplace” proposto da Williams nel 1964, che si basa su strutture dati ausiliarie . • L' heapsort per eseguire l'ordinamento, utilizza una struttura chiamata heap (dall’ inglese mucchio); un heap è rappresentabile con un albero binario in cui tutti i nodi seguono una data proprietà, detta priorità. Esso è completo almeno fino al penultimo livello dell'albero e ad ogni nodo corrisponde uno ed un solo elemento. Merge sort • Unisce due elenchi già ordinati ai dati per ordinarli in un’unica lista • Concettualmente, l'algoritmo funziona nel seguente modo: Se la sequenza da ordinare ha lunghezza 0 oppure 1, è già ordinata. Altrimenti: La sequenza viene divisa (divide) in due metà (se la sequenza contiene un numero dispari di elementi, viene divisa in due sottosequenze di cui la prima ha un elemento in più della seconda) Ognuna di queste sottosequenze viene ordinata, applicando ricorsivamente l'algoritmo(impera) Le due sottosequenze ordinate vengono fuse (combina). Per fare questo, si estrae ripetutamente il minimo delle due sottosequenze e lo si pone nella sequenza in uscita, che risulterà ordinata • Fu inventato da John von Neumann nel 1945. Counting sort • Ordina i dati paragonabili uno alla volta e li confronta con un valore numerico . • Il Counting sort è un algoritmo di ordinamento per valori numerici interi con complessità di tipo lineare. L'algoritmo si basa sulla conoscenza a priori dell'intervallo in cui sono compresi i valori da ordinare . • In questo caso , diversamente dagli altri si propone un esempio piu specifico , e non in riferimento ad un programma . Nonostante ciò capiamo dalla descrizione precedente cosa vogliamo intendere con “counting sort” … Bubble sort • Confronta i dati e mette quello di valore minore a sinistra dell’elenco • Il suo funzionamento è semplice: ogni coppia di elementi adiacenti della lista viene comparata e se essi sono nell'ordine sbagliato vengono invertiti. L'algoritmo scorre poi tutta la lista finché non vengono più eseguiti scambi, situazione che indica che la lista è ordinata. • L'algoritmo deve il suo nome al modo in cui gli elementi vengono ordinati, con quelli più piccoli che "risalgono" verso le loro posizioni corrette all'interno della lista . In particolare, alcuni elementi attraversano la lista velocemente , altri più lentamente: i primi sono in gergo detti "conigli" e sono gli elementi che vengono spostati nella stessa direzione in cui scorre l'indice dell'algoritmo, mentre i secondi sono detti "tartarughe" e sono gli elementi che vengono spostati in direzione opposta a quella dell'indice. Selection sort • Scrive per ordinare pochi elementi , ordina i dati assegnando un minore tra quelli che rimangono • L'ordinamento per selezione (selection sort) è un algoritmo di ordinamento che opera ”in place” ed in modo simile all'ordinamento per inserzione . L'algoritmo è di tipo non adattivo, ossia il suo tempo di esecuzione non dipende dall'input ma dalla dimensione dell'array ! • L'algoritmo seleziona di volta in volta il numero minore nella sequenza di partenza e lo sposta nella sequenza ordinata; di fatto la sequenza viene suddivisa in due parti: la sottosequenza ordinata, che occupa le prime posizioni dell'array, e la sottosequenza da ordinare, che costituisce la parte restante dell'array. Insertion sort • Ordina i maggiori a destra e i minori alla sinistra • L'Insertion sort , in italiano ordinamento a inserimento, è un algoritmo relativamente semplice per ordinare un array . Possiamo constatare che non è molto diverso dal modo in cui un essere umano ordina un mazzo di carte. Esso è un algoritmo in place, cioè ordina l'array senza doverne creare una copia, risparmiando memoria. Pur essendo molto meno efficiente di algoritmi più avanzati , può avere alcuni vantaggi: ad esempio, è semplice da implementare ed è efficiente per insiemi di partenza che sono quasi ordinati. Per esempio … • function insertionSort(array A) for i ← 1 to length[A] do value ← A[i] j ← i-1 while j >= 0 and A[j] > value do A[j + 1] ← A[j] j ← j-1 A[j+1] ← value