Algoritmi e Laboratorio a.a Lezioni. prof. Elio Giovannetti

Documenti analoghi
Programmazione I - corso B a.a prof. Viviana Bono

Calcolare x n = x x x (n volte)

Dallo heap per la coda con priorità a un nuovo algoritmo di ordinamento. Algoritmi e Laboratorio a.a Lezioni. I due cicli dell'algoritmo

Dallo heap per la coda con priorità a un nuovo algoritmo di ordinamento. Algoritmi e Laboratorio a.a Lezioni

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica Curriculum SR (Sistemi e Reti) Algoritmi e Laboratorio a.a.

Il problema dell'ordinamento. Algoritmi e Laboratorio a.a Lezioni. Proprietà degli algoritmi di ordinamento: stabilità.

Algoritmi e Strutture Dati. Capitolo 4 Ordinamento: Selection e Insertion Sort

Algoritmi di ordinamento: Array e ricorsione

Programmazione I - corso B a.a prof. Viviana Bono

Programmazione in Java (I modulo)

Un esempio di calcolo di complessità: insertion sort

Algoritmi e Strutture Dati

Algoritmi di ordinamento (I parte)

Algoritmi su Array. Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna

Algoritmi su Array. Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna

Introduzione all'algoritmica per i Licei (C++). 3 Ricerca binaria o dicotomica. versione 1 febbraio 2015

I numeri rossi sulla Mole Antonelliana a Natale. Algoritmi e Laboratorio a.a Lezioni. Le regole della riproduzione dei conigli.

Tecniche della Programmazione, lez.28

Sommario. Ordinamento. Selection Sort Bubble Sort/ Shaker Sort Shell Sort

COMPLESSITÀ COMPUTAZIONALE DEGLI ALGORITMI

Progetto Corda. Alberto Ferrari. Alberto Ferrari Ingegneria dell'informazione, UniPR. 18/12/2017 Progetto Corda

Specifica, progetto e verifica della correttezza di algoritmi iterativi

COMPLESSITA COMPUTAZIONALE. Esercitazioni Tutor: Francesca Piersigilli

Analisi di algoritmi e di problemi

Sommario. Algoritmi di ordinamento lineari: CountingSort. BucketSort. RadixSort

Fondamenti di Informatica. Algoritmi di Ricerca e di Ordinamento

Classificazione degli algoritmi di ordinamento. Algoritmi e Laboratorio a.a Lezioni. Esercizio 1. Si può fare meglio?

Ordinamento. Lorenzo Donatiello,Moreno Marzolla Dip. di Scienze dell'informazione Università di Bologna

Algoritmi e Strutture Dati. Capitolo 4 Ordinamento

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano. Usa la tecnica del divide et impera:

Esercizi di Algoritmi e Strutture Dati

Esercitazione 1. Introduzione agli algoritmi di ordinamento

ALGORITMI Docente: Prof. Domenico Cantone

Casi di prova. Il problema dell ordinamento. Casi di prova. Casi di prova. Casi di prova

Introduzione all'algoritmica per i Licei (C++). 2 Massimo e minimo.

Fondamenti di Informatica

FONDAMENTI DI INFORMATICA. Prof. Alfredo Accattatis Prof. Venturino Taggi

Algoritmi di ordinamento

Divide et impera (Divide and Conquer) Dividi il problema in sottoproblemi piu` semplici e risolvili ricorsivamente

Algoritmi di Ricerca. Esempi di programmi Java. Prof. Angela Bonifati

Ricerca in una sequenza ordinata

Di cosa parliamo oggi?

Schema generale di un algoritmo divide-et-impera. Algoritmi e Laboratorio a.a Lezioni. Esempio: mergesort su array. Esempio: quicksort

Silvia Rossi. Cenni sulla complessità. Informatica. Lezione n. Parole chiave: Corso di Laurea: Insegnamento: Programmazione I

Esercizi di Algoritmi e Strutture Dati

Quick Sort. PARTITION(A,p,r) risistema il sottoarray A[p...r] e riporta l indice q:

Sommario. Un algoritmo di ordinamento di complessità lineare: CountingSort. [CLRS10] cap. 8 par.8.2

Università di Roma Tor Vergata L16-1. Ricerca: esaminare una collezione di dati, cercando un particolare valore. nome e cognome

In questa lezione. Heap binario heapsort. [CLRS10] cap. 6, par Prof. E. Fachini - Intr. Alg.

Laboratorio di Programmazione Appunti sulla lezione 4: Divide et impera e algoritmi di ordinamento

Algoritmi di ordinamento

Ordinamenti. Grafo : definizione. Un grafo G = (V,E)è composto da: V: insieme di vertici E V V: insieme di archi (edge) che connettono i vertici

Code a priorità. Progettazione di Algoritmi Matricole congrue a 1. Docente: Annalisa De Bonis

Informatica per Statistica Riassunto della lezione del 21/10/2011

ALGORITMI DI ORDINAMENTO E RICERCA BINARIA. Docente: Giorgio Giacinto AA 2008/2009. problema dell ordinamento in modi diversi

Algoritmi e Strutture di Dati I 1. Algoritmi e Strutture di Dati I Massimo Franceschet francesc

Array e Oggetti. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica. Dispensa 17. A. Miola Gennaio 2012

complessità degli algoritmi

Algoritmi di ordinamento: Array e ricorsione

Laboratorio di Algoritmi e Strutture Dati. Aniello Murano. people.na.infn.it/~murano/ Murano Aniello - Lab. di ASD Terza Lezione

Prova di Algoritmi e s.d. (1o anno) 17 Settembre TESTO e RISPOSTE

Informatica Generale Andrea Corradini Algoritmi: ordinamento per inserimento e ricorsione

Ordinamenti. Vittorio Maniezzo Università di Bologna

Esercizi su array di array

Problemi di ordinamento

Algoritmi di ordinamento

Esercizi per il corso di Algoritmi, anno accademico 2011/12

Mergesort (cont.) 2018/ Lezione 16. Venerdì, 16 Novembre 2018

Corso di Tecniche di Programmazione

Algoritmi di ordinamento

Algoritmi di Ricerca. Esempi di programmi Java

Esercitazione 2. Quicksort

Algoritmi di Ricerca Ordinamento

Algoritmi e Laboratorio a.a Lezioni

Ω (grande omega) Esempio 10 COMPLESSITÀ COMPUTAZIONALE DEGLI ALGORITMI

COGNOME E NOME (IN STAMPATELLO) MATRICOLA

Esercizi riassuntivi (Fondamenti di Informatica 2 Walter Didimo) Soluzioni

Algoritmi di ordinamento

Lezione 6 programmazione in Java

Tony Hoare: inventore del Quicksort.

Gli algoritmi e la loro complessità

Laboratorio di Programmazione Appunti sulla lezione 4: Divide et impera e algoritmi di ordinamento

Algoritmi di Ricerca. Esempi di programmi Java

Algoritmi e Strutture Dati 1

Ricerca in Array/Lista. Dato un array o lista di n elementi, vogliamo trovarne uno (e.g., un numero x in un array di interi)

Dato un insieme S di n elementi totalmente ordinato, l'algoritmo di ordinamento detto HeapSort ha le seguenti caratteristiche:

Algoritmi di ricerca. Per ricerca si intende qui il procedimento di localizzare una particolare informazione in un elenco di dati.

Algoritmi e Strutture Dati

Lo sviluppo di un semplice programma e la dimostrazione della sua correttezza

Parte 4C. Liste ordinate. H. Matisse Dance I, 1909 H. Matisse Dance, B.1

Fondamenti di Programmazione - Prof.ssa Gargano Anno Acc Esercitazioni 2009

array in Java come disporre di un numero arbitrariamente alto di variabili omogenee

come segue: data una collezione C di elementi e una un elemento che verifica la proprietà P

ESERCITAZIONI DI INTRODUZIONE AGLI ALGORITMI (A.A. 08/09)

Corso: Fondamenti di Informatica (Canale 5) a.a Corsi di laurea: Ing. Settore Informazione

Laboratorio di Algoritmi e Strutture Dati. Code con Priorità

Transcript:

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica Curriculum SR (Sistemi e Reti) Algoritmi e Laboratorio a.a. 2005-06 Lezioni prof. Elio Giovannetti Parte 7 Algoritmi di ordinamento elementari (quadratici). versione 7/11/2006 Quest' opera è pubblicata sotto una Licenza Creative Commons Attribution-NonCommercial-ShareAlike 2.5. Il problema dell'ordinamento Data una sequenza (ad es. array o lista) di elementi, ordinarla rispetto ad una relazione d'ordine definita sugli elementi (di solito su un particolare campo o componente di tali elementi); ad es. ordinare un insieme di oggetti di una classe Studente rispetto al numero di matricola (costituente la chiave identificativa dell'oggetto), oppure rispetto al cognome, ecc. Gli algoritmi che risolvono tale problema, cioè gli algoritmi di ordinamento, sono classificabili secondo diversi criteri, quali la complessità asintotica oppure il fatto che godano o no di certe proprietà interessanti. AlgELab-06-07 - Lez.07 2 1

Proprietà degli algoritmi di ordinamento: stabilità. Un algoritmo di ordinamento si dice stabile se non altera l'ordine relativo di oggetti distinti che siano uguali rispetto alla relazione d'ordine, ad es. l'ordine relativo di elementi con chiavi uguali. Cioè, se nella sequenza da ordinare vi sono due elementi A e B di uguali chiavi, e A si trova prima di B in tale sequenza, anche nella sequenza ordinata A deve trovarsi prima di B. Se una sequenza di elementi già ordinata secondo un certo criterio viene ordinata secondo un altro criterio per mezzo di un algoritmo stabile, elementi uguali secondo il nuovo criterio risultano ordinati secondo il precedente criterio. Esempio: Se una sequenza di persone individuate da nome e cognome è ordinata per nome, ordinandola per cognome con un algoritmo stabile si ottiene una sequenza in cui le persone dello stesso cognome sono ordinate per nome. AlgELab-06-07 - Lez.07 3 Stabilità Naturalmente la stabilità non ha alcuna importanza se gli elementi coincidono con le chiavi o, più in generale, se elementi uguali rispetto alla relazione d'ordine non sono distinguibili (ad esempio un array di interi). AlgELab-06-07 - Lez.07 4 2

Proprietà degli algoritmi di ordinamento: ordinamento sul posto (in place, in loco) Un algoritmo di ordinamento su array si dice sul posto (o in loco, o in place) se in ogni istante al più un numero costante di elementi viene memorizzato al di fuori dell'array; cioè se l'algoritmo riordina l'array senza usare un array ausiliario o comunque uno spazio proporzionale al numero di elementi. Definizione di fatto equivalente (come vedremo): Un algoritmo di ordinamento si dice sul posto se la sua complessità spaziale è al più O(log n). Ricorda che la complessità spaziale comprende anche lo spazio usato dallo stack. Concludendo: un algoritmo di ordinamento è sul posto se usa solo una quantità "piccola" di spazio aggiuntivo. AlgELab-06-07 - Lez.07 5 Algoritmo di ordinamento per selezione o per estrazione successiva del minimo (Ripasso di Programmazione 1) Si cerca il minimo dell'array e lo si mette al primo posto (mettendo il primo al posto del minimo); poi si cerca il minimo nella parte di array dal secondo elemento alla fine, e lo si mette al secondo posto, e così via. AlgELab-06-07 - Lez.07 6 3

Algoritmo di ordinamento per selezione. Idea array a, con n = a.length indice del primo elemento della parte da ordinare 0 i n-1 a: parte ordinata parte ancora da esaminare: tutti gli el. di questa parte sono maggiori o uguali di quelli nella parte ordinata AlgELab-06-07 - Lez.07 7 Ordinamento per selezione a: 0 i n-1 INVARIANTE: è la proposizione P(i) seguente: a[0.. i-1] è ordinato e per ogni x in a[0.. i-1] ed ogni y in a[i.. n-1] si ha x y più formalmente: a[0] a[1]... a[i-1] j k.(0 j i-1 i k n-1 a[j] a[k]) AlgELab-06-07 - Lez.07 8 4

Algoritmo di ordinamento per selezione Un altro modo (equivalente al precedente) di scrivere l'invariante a: INVARIANTE 0 i n-1 a[0] a[1]... a[i-1] cioè il segmento di array a[0.. i-1] è ordinato e a[i-1] a[i] a[i-1] a[i+1] a[i-1] a[i+2]... a[i-1] a[n-1] cioè a[i-1] è minore o uguale di tutti gli elementi di a[i.. n-1] AlgELab-06-07 - Lez.07 9 Passo Ordinamento per selezione a[k] sia il minimo valore in a[i.. n-1] a: 0 i k n-1 scambia(a, i, indiceminimoda(a, i)); Scambiando a[i] con a[k] diventa vera l'asserzione che si ottiene dall'invariante sostituendo i con i+1: a[0..i] è ordinato e per ogni x in a[i+1.. n-1] ed ogni y in a[0..i] si ha x y AlgELab-06-07 - Lez.07 10 5

Ordinamento per selezione Passo 0 i n-1 i++; allora, dopo aver incrementato i, l'invariante è ancora vero: a[0.. i-1] è ordinato and per ogni x in a[i.. n-1] ed ogni y in a[0.. i-1] si ha x y ma il contenuto di i è aumentato di 1! AlgELab-06-07 - Lez.07 11 Ordinamento per selezione Passo La lunghezza della porzione ordinata è aumentata di 1, mentre la lunghezza di quella da ordinare è diminuita di 1. a: 0 i n-1 AlgELab-06-07 - Lez.07 12 6

a: Ordinamento per selezione Condizione di controllo i n-1 Quando è i = n-1, a[i] è il massimo in a[1..n-1] Quindi il passo deve essere ripetuto per tutto il tempo in cui è i < n-1: while(i < n-1) AlgELab-06-07 - Lez.07 13 Cioè il ciclo non controlla l'ultimo elemento, di indice n-1, poiché esso risulta automaticamente al posto giusto (essendo il massimo), come si può vedere anche dall'invariante ponendo i = n-1: a[0] a[1]... a[n-2] a[n-2] a[n-1] AlgELab-06-07 - Lez.07 14 7

Ordinamento per selezione Inizializzazione La parte da ordinare a[i..n-1] è l'intero vettore a[0..n-1] e la parte ordinata a[0..i-1] è vuota: quindi l'inizializzazione è i = 0; a: i 0 AlgELab-06-07 - Lez.07 15 L'algoritmo completo int i = 0; while(i < n-1) { scambia(a, i, indiceminimoda(a, i)); i++; conviene, per eleganza, tradurre il while in un for; la realizzazione finale in Java della procedura è quindi: public static void ssort(int[] a) { int n = a.length; for(int i = 0; i < n-1; i++) { scambia(a, i, indiceminimoda(a, i)); AlgELab-06-07 - Lez.07 16 8

la procedura ausiliaria indiceminimoda restituisce l'indice dell'elemento di valore minimo nella parte di array dall'indice k (compreso) alla fine, dove 0 <= k <= a.length-1 static int indiceminimoda(int[] a, int k) { int imin = k; for(int i = k+1; i < a.length; i++) if(a[i] < a[imin]) imin = i; return imin; AlgELab-06-07 - Lez.07 17 Complessità temporale della procedura indiceminimoda Per cercare il minimo, la procedura deve percorrere interamente la parte di array dall'indice k all'indice n-1; essa effettua quindi n k passi. Complessità temporale dell'algoritmo di ordinamento ssort Il metodo indiceminimoda viene invocato la prima volta per k = 0, poi per k = 1, per k = 2, ecc.; il numero totale di passi effettuato dall'algoritmo è quindi: n + (n 1) + (n 2) + (n 3) +... + 3 + 2 cioè (formula di "Gauss bambino"): n(n+1)/2 1 cioè (n 2 + n)/2 1 L'algoritmo è quadratico; si noti che a differenza dell'insertion sort, non esistono un caso peggiore e un caso migliore: il numero di passi eseguiti non dipende dal modo in cui sono disposti i valori nell'array, ma è sempre rigorosamente lo stesso, ed è quadratico. Il selection sort è quindi un algoritmo peggiore dell' insertion sort, che invece, come vedremo, pur essendo anch'esso in media quadratico presenta un caso migliore in cui è lineare. AlgELab-06-07 - Lez.07 18 9

Stabilità. Il selection sort è stabile? Come tutti gli algoritmi di ordinamento che effettuano scambi, il selection sort NON è stabile. Esercizio: trovare un esempio che ne mostri la non-stabilità. Complessità spaziale L'algoritmo non usa array ausiliari, ma solo un insieme di K variabili, con K fissato e piccolo. Esso è pertanto un ordinamento sul posto. Anzi, essendo un algoritmo iterativo, la dimensione dello stack non dipende dalla lunghezza dell'array, bensì è costante. La complessità spaziale è quindi (in ogni caso) Θ(1) AlgELab-06-07 - Lez.07 19 Ordinamento per selezione: riassunto. T(n) = T worst (n) = T best (n) = T medio (n) = Θ(n 2 ) S(n) = Θ(1) sul posto non stabile AlgELab-06-07 - Lez.07 20 10

Algoritmo di ordinamento per inserimento o insertion sort (Ripasso di Programmazione 1) Si prende via via l'elemento successivo dell'array e lo si inserisce al posto giusto nella parte già ordinata. Attenzione: "ordinamento per inserimento" è il nome di un algoritmo di ordinamento, cioè di un algoritmo che prende come argomento una sequenza e la ordina; NON è una procedura che inserisce in modo ordinato degli elementi in una sequenza vuota, pur basandosi sullo stesso principio di essa. AlgELab-06-07 - Lez.07 21 Idea Ordinamento per inserimento: ripasso. array a, con n = a.length a: 0 indice del primo elemento della parte da ordinare i n-1 parte ordinata parte ancora da esaminare: nessuna assunzione! AlgELab-06-07 - Lez.07 22 11

Ordinamento per inserimento a: 0 i n-1 INVARIANTE: è la proposizione P(i) seguente: a[0.. i-1] è ordinato AlgELab-06-07 - Lez.07 23 Passo Ordinamento per inserimento Come fare per mantenere l invariante? Cercherò il posto in cui a[i] dovrebbe stare a: 0 i AlgELab-06-07 - Lez.07 24 12

Ordinamento per inserimento Passo Usiamo una procedura ausiliaria che, percorrendo l'array all'indietro a partire da i-1, cerchi il posto in cui inserire a[i] facendo slittare a[k.. i-1] su a[k+1.. i], e poi effettui l'inserimento stesso: inserisci(a[i], a, i) k i AlgELab-06-07 - Lez.07 25 Nota Per l'utilizzo nell'ordinamento per inserimento sarebbe sufficiente definire la procedura inserisci con solo due parametri: void inserisci(int[] a, int i) poiché il valore x da inserire è semplicemente a[i]. Tuttavia definiamo qui una procedura leggermente più generale, che può essere usata anche per inserire un nuovo valore in un array ordinato parzialmente riempito; void inserisci(int[] a, int i, int x) inserisce x nell'array ordinato a riempito per una lunghezza i Intanto nella versione finale dell'algoritmo l'uso della procedura inserisci verrà eliminato in favore della sua espansione in linea, cioè le sue istruzioni verranno inserite direttamente nella procedura di ordinamento. AlgELab-06-07 - Lez.07 26 13

Ordinamento per inserimento Test di controllo i for(...;i < n; i++) AlgELab-06-07 - Lez.07 27 Ordinamento per inserimento Inizializzazione 0 1 Il sotto-array a[0..0], di un solo elemento, è banalmente ordinato i è l indice del primo elemento della parte da ordinare: dunque i = 1 AlgELab-06-07 - Lez.07 28 14

L'algoritmo di ordinamento per inserimento public static void ordinains(int[] a) { int n = a.length; for(int i = 1; i < n; i++) { inserisci(a[i],a,i); AlgELab-06-07 - Lez.07 29 La procedura ausiliaria void inserisci(int x, int[] a, int i) Situazione iniziale: il segmento a[0.. i-1] è ordinato a: parte già ordinata 0 i-1 i x = a[i] è l'elemento da inserire AlgELab-06-07 - Lez.07 30 15

La procedura ausiliaria inserisci. Invariante (situazione al passo generico), condizione di uscita, e corpo del ciclo. 0 j-1 j j+1 i-1 i n-1 parte ancora da esaminare parte già spostata x < a[j+1] a[j+2] a[j+3]... a[i] a[j] è il posto libero (che si è creato spostando a destra di uno tutti gli elementi successivi); il ciclo termina se j = 0 oppure se (j > 0 e) x a[j-1] : in entrambi i casi il posto libero ha raggiunto la posizione giusta, e il valore x va inserito in tale posto; altrimenti l elemento a[j-1] va spostato in a[j], il che equivale a spostare a sinistra di uno il posto libero. AlgELab-06-07 - Lez.07 31 La procedura ausiliaria inserisci: l'invariante 0 j-1 j j+1 i n-1 parte ancora da esaminare parte già spostata 0 j i a[j+1.. i] = segmento originariamente in a[j.. i-1] x < a[j+1] AlgELab-06-07 - Lez.07 32 16

Si esce dal ciclo per j = 0 oppure x >= a[j-1]; quindi, anche ricordando de Morgan, si continua per j > 0 and x < a[j-1]. In conclusione: while(j > 0 && x < a[j-1]) { a[j] = a[j-1]; j--; a[j] = x; Inizializzazione: l array era ordinato fino ad a[i-1] compreso, l'elemento da inserire era a[i], quindi la posizione iniziale del posto libero è i: j = i; AlgELab-06-07 - Lez.07 33 testo completo della procedura presi come parametri: un intero x; un array a; la lunghezza i della parte ordinata di a, inserisce l'intero x al posto giusto nella parte ordinata static void inserisci(int x, int[] a, int i) { int j = i; while( j > 0 && x < a[j-1]) { a[j] = a[j-1]; j--; a[j] = x; AlgELab-06-07 - Lez.07 34 17

Algoritmo di ordinamento per inserimento Versione finale, con la procedura inserisci espansa in linea: public static void ordinains(int[] a) { int n = a.length; for(int i = 1; i < n; i++) { // inserisci(a[i],a,i) int x = a[i]; int j = i; while(j > 0 && x < a[j-1]) { a[j] = a[j-1]; j--; a[j] = x; AlgELab-06-07 - Lez.07 35 Complessità temporale della procedura inserisci caso migliore: il valore da inserire è maggiore o uguale all ultimo elemento della parte ordinata (e quindi a tutti); il calcolo richiede un solo passo; caso peggiore: il valore da inserire è minore di tutti gli elementi della parte ordinata, quindi esso verrà confrontato con tutti i suddetti elementi, che dovranno essere tutti spostati di uno; il numero di passi di calcolo è proporzionale a i (ossia lineare in i) in media il valore da inserire sarà a metà della parte ordinata, quindi il numero di passi sarà circa proporzionale a i/2, cioè ancora proporzionale a i (o lineare in i) AlgELab-06-07 - Lez.07 36 18

Complessità temporale dell'algoritmo di ordinamento per inserimento L'algoritmo è costituito da un ciclo for di n passi, senza uscite forzate. Tuttavia all interno del ciclo viene eseguito l'algoritmo inserisci il cui tempo di calcolo non è costante, ma in generale sarà dipendente dal valore di i. In media, inserisci farà un numero di passi circa uguale a i/2, cioè 1/2 la prima volta, 2/2 la seconda, 3/2 la terza,...; approssimativamente, il numero totale di passi sarà allora: 1/2 (1 + 2 + 3 +... + n) = 1/2 (n(n+1)/2) = (n 2 + n)/4 Il tempo di calcolo cresce in modo quadratico rispetto alla lunghezza dell array da ordinare, cioè è circa proporzionale al quadrato di tale lunghezza: se la lunghezza raddoppia, il tempo si quadruplica; se la lunghezza si triplica, il tempo si moltiplica per 9; e così via. AlgELab-06-07 - Lez.07 37 Complessità temporale dell'algoritmo (continua) caso peggiore: l array di partenza è ordinato inversamente; allora ogni chiamata della procedura inserisci esegue esattamente k passi, con k successiv. uguale a 1, 2,...,n (verificare simulando a mano l esecuzione); il numero totale di passi è quindi: 1+2+3+... + n = n(n+1)/2 = (n 2 + n)/2 quadratico caso migliore: l array di partenza è già ordinato; allora ogni inserimento, inserendo un elemento che è maggiore o uguale dei precedenti, fa un solo passo; il numero totale di passi è quindi 1+1+1+... (n volte) cioè proporzionale a n (o lineare in n) AlgELab-06-07 - Lez.07 38 19

Complessità temporale dell'algoritmo (vedi Lez. 6) Riassumendo: caso peggiore: quadratica (rispetto alla lunghezza) caso medio: quadratica caso migliore: lineare Più precisamente: Il tempo di esecuzione nel caso peggiore è Θ(n 2 ). Il tempo di esecuzione nel caso migliore è Θ(n). Quindi, in base alle definizioni, si può dire che:: Il tempo di esecuzione è O(n 2 ), perché è Θ(n 2 ) e quindi anche O(n 2 ) nel caso peggiore. Il tempo di esecuzione è Ω(n), perché è Θ(n) e quindi anche O(n) nel caso migliore. Il tempo di esecuzione non è né Θ(n 2 ) né Θ(n): per ogni dimensione n vi sono sia input per cui il tempo è proporzionale a n, sia input per cui è proporzionale a n 2. AlgELab-06-07 - Lez.07 39 Algoritmo di ordinamento per inserimento: riassunto. e quindi: T worst (n) = Θ(n 2 ) T best (n) = Θ(n) T medio (n)= Θ(n 2 ) T(n) = Ο(n 2 ) T(n) = Ω(n) Come il selection sort, è iterativo e non usa array ausiliari: S(n) = Θ(1) sul posto stabile Esercizio: si dimostri che (si spieghi perché) l'algoritmo è stabile. AlgELab-06-07 - Lez.07 40 20