Algoritmi di ordinamento Selectionsort • Basilare in molteplici applicazioni • Esempio importante di algoritmi diversi per risolvere lo stesso problema • Metodi di ordinamento interni: i dati risiedono nella memoria centrale (in un vettore; campo chiave) • Confronto basato sull'efficienza • Ordinamento per selezione • Si sceglie il minimo del vettore e lo si scambia con la posizione corretta • Complessità: O(n 2 ) • I due cicli vengono sempre eseguiti, indipendentemente dalla configurazione dei dati Elementi di Informatica 1 Bubblesort 3 Mergesort • Basato sulla fusione (merge) di due vettori ordinati: – la fusione ha complessità O(n) • E' intrinsecamente ricorsivo • Vettore iterativamente diviso in 2 parti: – ordinamento e fusione • Complessità O(n log2 n) Elementi di Informatica 4 Quicksort • Indipendente dalla configurazione in ingresso • La ricorsione incrementa la complessità della gestione: • Si sceglie un elemento pivot e si suddivide il vettore in due: uno con el. minori, l'altro con el. maggiori o uguali del pivot • Si procede iterativamente fino a vettori di 1 solo elemento • La suddivisione ha complessità O(n) • La complessità della parte ricorsiva dipende dalla scelta del pivot – è consigliabile usare un programma nonricorsivo • Per ogni programma ricorsivo esiste un programma non-ricorsivo più efficiente Elementi di Informatica 2 Mergesort • Basato sulla considerazione che: ei ≤ ei+1 • Confronta coppie adiacenti e eventualmente le scambia • Dopo una scansione completa l'elemento minore (o maggiore) è nella posizione corretta • Termina quando sono terminati gli scambi (se è già ordinato serve solo un passo per la verifica) • Complessità: O(n2) Elementi di Informatica Elementi di Informatica 5 Elementi di Informatica 6 1 Quicksort Limite inferiore della complessità • Scegliendo come pivot l'elemento min o max, la complessità diventa O(n2) • Scegliendo come pivot l'elemento centrale, la complessità è O(n log2 n) • Il caso peggiore succede raramente • E' più probabile il caso migliore • E' usato per la semplicità e l'efficienza • Si considerano algoritmi la cui operazione fondamentale è il confronto tra elementi • Problema: Elementi di Informatica 7 Esempio Elementi di Informatica 8 Esempio • La ricerca è rappresentabile graficamente con un albero binario: • Ordinare {a1, a2, a3} – la radice rappresenta tutte le permutazioni – ogni confronto suddivide le permutazioni • Albero di risoluzione – 3! = 6 permutazioni (6 foglie) – albero con profondità 3 • La profondità dell'albero determina il numero massimo di confronti nel caso peggiore Elementi di Informatica – è ricondotto alla ricerca di una specifica permutazione di n oggetti – esistono n ! permutazioni diverse – tutte le permutazioni sono candidate – ogni passo dell'algoritmo serve per eliminare dei candidati 9 Limite inferiore della complessità • L'albero deve avere n! foglie • In generale un albero binario con profondità i ha al più 2i foglie • Quindi per avere n! foglie, l'albero deve avere profondità p = log(n!) p = log(n!) ~ log(n/e)n =n log(n) - n log(e) = O(n log(n)) Elementi di Informatica 10 Binsort • Fin'ora gli algoritmi erano basati su operazioni di confronto • Il binsort utilizza operazioni di indirizzamento con indici • Sfrutta la conoscenza dell'intervallo di variabilità delle chiavi • Il limite inferiore alla complessità è O(n log(n)) Elementi di Informatica 11 Elementi di Informatica 12 2 Binsort Binsort • Si suppone che gli n elementi del vettore abbiano chiavi [1..n ] • Si scandisce un vettore e si spostano gli elementi in un altro • Ha complessità O(n) Elementi di Informatica 13 • Caso di più chiavi uguali: – utilizzo di una lista – al termine le liste vengono concatenate • Complessità: – inserimento O(n) – concatenazione O(n) – totale O(n) Elementi di Informatica 14 Considerazioni sulla scelta di un algoritmo Binsort • E' il più efficiente se: • Le caratteristiche di un algoritmo sono: – si utilizzano chiavi numeriche – l'intervallo di variabilità delle chiavi è noto – è possibile effettuare indirizzamenti con indici – semplice, per facilitarne la comprensione, programmazione, e correzione – efficiente, cioè richiede una quantità limitata di risorse per l'esecuzione • Le due caratteristiche si riferiscono a: – costo umano – costo di esecuzione Elementi di Informatica 15 Considerazioni sulla scelta di un algoritmo 16 Considerazioni • Implementazione efficiente dell'algoritmo • Non esistono regole per la scelta ottima • Generalmente però: – si sceglie la prima regola quando si deve eseguire poche volte su insiemi ridotti di dati – si sceglie la seconda se il programma viene eseguito un grande numero di volte su insiemi estesi di dati Elementi di Informatica Elementi di Informatica 17 – sono state considerate solo le complessità – sono state eliminate le costanti moltiplicative • Per scegliere l'implementazione migliore è necessario considerare tutto – ad esempio, gli algoritmi ricorsivi sono generalmente molto pesanti Elementi di Informatica 18 3