Sistemi e Tecnologie Informatiche Problemi di ordinamento Umberto Ferraro Petrillo
Obiettivo della lezione Presenteremo un semplice ed importante problema da risolvere mediante un approccio “ragionato” Introdurremo le nozioni di algoritmo, struttura dati ed efficienza di un algoritmo
Domanda … Cosa rende un elenco telefonico di semplice consultazione? Risposta: I nominativi riportati sono elencati in ordine alfabetico! Come si ordina un elenco di nomi?
Problema Compilazione di un elenco dei partecipanti al corso e dei rispettivi voti (ordinato per cognome) Zuzzurellone Zaira 24 Bamonte Giovanni 26 Romano Nadia 21 Medio Massimo 28 Del Monte Francesco 30 Rufolo Carmine 19 Donnaruma Giovanni 27 Santonastaso Maria 25 Abate Alfonso 27
Ordinamento di un elenco (ver. 1) Elenco di partenza Elenco ordinato Zuzzurellone Zaira Bamonte Giovanni Romano Nadia Medio Massimo Del Monte Francesco Rufolo Carmine Donnaruma Giovanni Santonastaso Maria Abate Alfonso Abate Alfonso Bamonte Giovanni Del Monte Francesco Donnaruma Giovanni Medio Massimo Romano Nadia Rufolo Carmine Santonastaso Maria Zuzzurellone Zaira Individua il primo nominativo in ordine alfabetico nell’elenco di input Riponi l’elemento individuato nella posizione 1 dell’elenco ordinato ed eliminalo dall’elenco di partenza Riponi l’elemento individuato nella posizione 2 dell’elenco ordinato ed eliminalo dall’elenco di partenza ….
Procedura risolutiva (prima versione) Sia i l’indice della posizione attualmente considerata (inizialmente i = 0) Sia n la taglia dell’elenco da ordinare Ripeti per n volte la seguente procedura: Scorri l’elenco di input ed individua il primo nominativo in ordine alfabetico Riponi l’elemento individuato nella posizione i dell’elenco ordinato ed eliminalo dall’elenco di partenza Incrementa i di 1 (i = i +1) Ci piace perchè + compatta e perchè è generalizzabile
Ordinamento di un elenco (ver 2) Zuzzurellone Zaira Donnaruma Giovanni Romano Nadia Medio Massimo Del Monte Francesco Rufolo Carmine Bamonte Giovanni Santonastaso Maria Abate Alfonso Abate Alfonso Donnaruma Giovanni Romano Nadia Medio Massimo Del Monte Francesco Rufolo Carmine Bamonte Giovanni Santonastaso Maria Zuzzurellone Zaira Abate Alfonso Bamonte Giovanni Romano Nadia Medio Massimo Del Monte Francesco Rufolo Carmine Donnaruma Giovanni Santonastaso Maria Zuzzurellone Zaira Cambiamo Abate Alfonso con il primo elemento dell’elenco e vice-versa Cambiamo Bamonte Giovanni con il secondo elemento dell’elenco e vice-versa Cambiamo Del Monte Francesco con il terzo elemento dell’elenco e vice-versa
Procedura risolutiva (seconda versione) Sia i l’indice della posizione attualmente considerata (inizialmente i = 0) Sia n la taglia dell’elenco da ordinare Ripeti per n-1 volte la seguente procedura: Scorri l’elenco di input nella porzione da i ad n ed individua il primo nominativo in ordine alfabetico Scambia l’elemento individuato con l’elemento nella posizione i (se necessario) Incrementa i di 1 (i = i +1) Ci piace perchè + compatta e perchè è generalizzabile
Algoritmo Procedura di calcolo consistente in un insieme di passi (istruzioni) e finalizzata alla risoluzione di un problema E’ tipicamente descritto utilizzando il linguaggio naturale: E.g. “Scorri l’elenco di input ed individua il primo nominativo in ordine alfabetico” Un algoritmo può essere implementato attraverso un linguaggio di programmazione … … tuttavia, esso non dipende da uno specifico linguaggio di programmazione Il vantaggio degli algoritmi è che essi ci consentono di risolvere un problema con carta e penna, l’effettiva implementazione viene demandata ad una fase successiva, l’implementazione rappresenta una sorta di punto di arrivo (zoom/unzoom). E’ fuori discussione che se io chiedessi a voi durante l’esame di scrivere un algoritmo che risolve un certo problema per voi sarebbe più facile che scrivere un programma C++ che risolve lo stesso problema. con questa lezione abbiamo intrapreso una sorta di viaggio che si concluderà proprio con la programmazione
Struttura dati Le informazioni elaborate da un algoritmo sono definite dati (e.g., elenco nominativi da ordinare) I dati si possono presentare: in una forma elementare (e.g., il numero di studenti che segue la lezione) in una forma strutturata (e.g, l’elenco degli studenti e delle loro generalità) Una struttura dati può godere di determinate proprietà utili a risolvere un certo problema (e.g., l’elenco telefonico è ordinato alfabeticamente, sono quindi in grado di cercare un nome velocemente) La scelta di una particolare struttura dati influisce sull’efficienza di un programma e sulla semplicità di realizzazione dello stesso
Implementazione di un algoritmo L’elaborazione dei dati presuppone una loro rappresentazione (e.g., numero telefonico rappresentato come numero intero, nome di un utente rappresentato come array di caratteri)
Rappresentazione dei dati Problema: Fornire una rappresentazione in C/C++ dei dati sotto elencati Zuzzurellone Zaira 24 Bamonte Giovanni 26 Romano Nadia 21 Medio Massimo 28 Del Monte Francesco 30 Rufolo Carmine 19 Donnaruma Giovanni 27 Santonastaso Maria 25 Abate Alfonso 27
Rappresentazione dei dati Giovanni Bamonte 26 Romano 24 Zaira Zuzzurellone 2 5 4 3 1 6 Ipotesi 1: Adoperiamo un array di taglia 3n 2 1 24 Zaira Zuzzurellone 21 Nadia Romano 26 Giovanni Bamonte Ipotesi 2: Adoperiamo una matrice di taglia nx3
Rappresentazione dei dati Ipotesi 3: Adoperiamo 3 array distinti 1 2 Zuzzurellone Bamonte Romano 1 2 Zaira Giovanni Nadia 1 2 24 26 21
Rappresentazione dei dati Ipotesi 4: Definiamo una classe studente Adoperiamo un array di taglia n di oggetti “studente” 1 2 Nome: Zaira Cognome: Zuzzurellone Voto: 24 Nome: Zaira Cognome: Zuzzurellone Voto: 24 Nome: Zaira Cognome: Zuzzurellone Voto: 24
Ordinamento di un elenco di voti (Selection Sort) Sia i l’indice della posizione attualmente considerata (inizialmente i = 0) Sia n la taglia dell’elenco da ordinare Ripeti per n-1 volte la seguente procedura: Scorri l’elenco di input nella porzione da i ad n ed individua il voto più alto Scambia l’elemento individuato con l’elemento nella posizione i (se necessario) Incrementa i di 1 (i = i +1) Ci piace perchè + compatta e perchè è generalizzabile
Ordinamento di un elenco di voti (Selection Sort) 1 2 3 4 5 6 7 8 24 26 21 28 30 19 27 25 24 26 21 28 30 19 27 25 30 26 21 28 24 19 27 25 30 24 21 26 28 19 27 25 Ci piace perchè + compatta e perchè è generalizzabile Il numero + alto è 30, lo scambiamo con l’elemento alla prima posizione Il numero + alto è 28, lo scambiamo con l’elemento alla seconda posizione Scorriamo l’array da 0 ad 8 per individuare il numero + alto Scorriamo l’array da 1 ad 8 per individuare il numero + alto
Ordinamento di un elenco di voti (Selection Sort) 1 2 3 4 5 6 7 8 24 26 21 28 30 19 27 25 30 26 21 28 24 19 27 25 30 26 21 28 24 19 27 25 30 28 21 26 24 19 27 25 30 28 21 26 24 19 27 25 30 28 27 26 24 19 21 25 30 28 27 26 24 19 21 25 30 28 27 24 19 21 25 26 30 28 27 24 19 21 25 26 30 28 27 26 25242119 …
Sia Voti l’elenco di input ed n la taglia dello stesso 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 Sia Voti l’elenco di input ed n la taglia dello stesso void SelectionSort(int Voti [], int n){ int i, i_max; for (i = 0; i < n-1; i++) { i_max = i; // ricerca il valore massimo in Voti[i..n] for (int j = i+1; j < n-1; j++) if (Voti[j] > Voti[i_max]) i_max = j; // j è il nuovo i_max // scambia (se necessario) Voti[i_max] e Voti[i] if (i != i_max) { int temp = Voti[i_max]; Voti[i_max] = Voti[i]; Voti[i] = temp; } i – Separa gli elementi ordinati da quelli da ordinare j – Viene utilizzata per scorrere gli elementi da ordinare temp – Serve come variabile temporanea per operare lo scambio di due valori i_max – Conserva l’indice del valore piu’ alto all’interno della porzione di elenco non ordinata Sia i l’indice dell’elemento attualmente considerato (i=0) e sia i_max l’indice dell’elemento massimo in Voti[i…n] Ripeti per n-1 volte la seguente procedura Assumi il valore nella posizione Voti[i] essere il massimo nel sottoelenco Voti[i…n], (i = i_max) Cerca nel sottoelenco Voti[i+1 … n] il valore più alto ed assegnane l’indice ad i_max Se i_max è diverso da i, scambia Voti[i] e Voti[i_max]