Strutture dati e algoritmi. Sommario
|
|
|
- Michela Brescia
- 9 anni fa
- Просмотров:
Транскрипт
1 Sommario Strutture dati e algoritmi: Ricerca (lineare e binaria) Ordinamento (per selezione) Strutture dati e algoritmi Come esempi concreti di applicazioni in C++ si useranno le strutture dati e gli algoritmi. Si presentano i principali metodi utilizzati per organizzare e rappresentare l informazione (le strutture dati) al fine di ottenerne un elaborazione efficiente (gli algoritmi). La prima struttura dati che si considera è l array: una tabella di oggetti. Gli algoritmi possono essere implementati con funzioni. Informatica Medica, I semestre, C++ 1 Informatica Medica, I semestre, C++ 2 Uno stesso problema può essere risolto da algoritmi di diversa efficienza: tale efficienza diventa rilevante quando la quantità di dati da manipolare diventa grande. La complessità computazionale o efficienza può essere valutata rispetto all uso delle seguenti risorse: spazio e tempo. In generale il fattore tempo è quello critico. Il tempo di esecuzione T di un algoritmo viene espresso come una funzione della dimensione n dei dati in ingresso: T(n). Tuttavia il tempo di esecuzione di un applicazione dipende dal sistema e dal linguaggio di implementazione. Allora si usa il numero di passi base compiuti durante l esecuzione dell algoritmo: per es. istruzioni di assegnamento e di confronto. Poiché tale misura interessa solo per grandi quantità di dati, si fa riferimento all ordine di grandezza: complessità asintotica. Informatica Medica, I semestre, C++ 3 Informatica Medica, I semestre, C++ 4
2 Per indicare la complessità asintotica si usa la notazione O-grande (Big-Oh): date due funzioni a valori positivi f e g, si dice che f(n) è O(g(n)) se esistono due numeri positivi c ed N tali che f(n)<=cg(n) per qualsiasi n>=n. Per esempio: f(n)=2n 2 + 3n +1=O(n 2 ) Informatica Medica, I semestre, C++ 5 Alcune classi di complessità asintotica: O(1): costante, non dipende dalla dimensione dei dati O(log n): logaritmica O(n): lineare O(n log n): pseudolineare O(n 2 ): quadratica Informatica Medica, I semestre, C n 2 n log n n n log n 1 Analizzare la complessità degli algoritmi è di estrema importanza nonostante le elevate prestazioni dei computer attuali. Algoritmi mal progettati non hanno applicazioni pratiche. Per esempio, su un computer che esegue un miliardo di operazioni al secondo un algoritmo pseudolineare impiega alcuni decimi di secondo a manipolare dieci milioni di dati, mentre un algoritmo quadratico impiega ventisette ore! Esempi di complessità asintotica Un ciclo per calcolare la somma dei valori di un array: const int n =... int a[n],i,j,sum; for(i=0, sum=0; i<n ;i++) sum+=a[i]; Vengono inizializzate due variabili, poi il ciclo itera n volte (dove n è la dimensione dell array) eseguendo due assegnamenti, uno per aggiornare sum e l altro per incrementare i. Quindi si ha: T(n)= 2+ n (1+1) =2 +2 n = O(n) che è una complessità asintotica lineare. Informatica Medica, I semestre, C++ 7 Informatica Medica, I semestre, C++ 8
3 Esempi di complessità asintotica La complessità solitamente cresce quando si usano cicli annidati. Per esempio calcolare tutte le somme di tutti i sottoarray che iniziano dalla posizione 0: for(i=0; i<n ;i++) for(j=1,sum=a[0]; j<=i; j++) sum+=a[j]; cout<<"somma sub "<<sum<<endl; Il ciclo più esterno esegue tre assegnamenti (i, j e sum) e il ciclo interno, che esegue, a sua volta, 2 i assegnamenti (sum e j) per ogni i [ 1,..., n 1]. Quindi si ha: T ( n) 1 3n n 1 i 1 2i 1 3n n( n 1) O( n Informatica Medica, I semestre, C ) Esempi di complessità asintotica Anche in presenza di cicli annidati, non è detto che la complessità cresca. Per esempio eseguire la somma dei valori che si trovano nelle ultime cinque celle dei sotto-array che partono da 0: for(i=4; i<n ;i++) for(j=i-3,sum=a[i-4]; j<=i;j++) sum+=a[j]; cout<<"somma sub "<<sum<<endl; Il ciclo più interno esegue sempre lo stesso numero di assegnamenti per ogni iterazione del ciclo esterno, pertanto si ha: T(n)= 1+ (n-4)( ) = O(n) Informatica Medica, I semestre, C++ 10 Il problema della ricerca In molte applicazioni pratiche è importante trovare un certo valore all interno di una tabella: l array è la struttura dati che può implementare una semplice tabella. Dato un array e un oggetto (chiave), stabilire se l oggetto è contenuto in un elemento dell array, riportando in caso affermativo l indice di tale elemento, altrimenti -1. Un progetto per il programma di ricerca Il main() e le funzioni per verificare se l algoritmo è corretto sono inserite nel file test.cpp. La funzione per la ricerca è dichiarata in algoritmi.h e definita in algoritmi.cpp. Consideriamo il caso generale di un array non ordinato. Algoritmo di ricerca lineare: gli elementi dell array vengono considerati uno dopo l altro finché o il valore cercato è trovato o la fine dell array è raggiunta (complessità asintotica lineare O(n)). Informatica Medica, I semestre, C++ 11 Informatica Medica, I semestre, C++ 12
4 algoritmi.h Ricerca Lineare #ifndef ALGORITMI_H #define ALGORITMI_H int SequentialSearch(int *data, int dim, int key); #endif algoritmi.cpp #include "algoritmi.h" int SequentialSearch(int *data, int dim, int key) for (int i = 0; i < dim; i++) if (data[i] == key) return i; return -1; Informatica Medica, I semestre, C++ 13 test.cpp #include <iostream> #include <cstdlib> #include "algoritmi.h" using namespace std; void test1(); int main() test1(); return 0; Una possibile uscita Inserire dim, seed e key: Array[1] vale 7196 Ricerca Lineare void test1() int dim, seed; int *vt, val; cout<<"inserire dim, seed e key: "; cin>>dim>>seed>>val; srand(seed); vt= new int[dim]; for(int i=0;i<dim;i++) vt[i]=rand(); int ind=sequentialsearch(vt,dim,val); if (ind>=0) cout<<"array["<<ind<<"] vale "<<val; else cout<<"nell'array non c e` "<<val; delete [] vt; Informatica Medica, I semestre, C++ 14 Ricerca binaria Se l array è ordinato, si può seguire una diversa strategia per cercare la chiave nell elenco. Tale ricerca risulta più efficiente perche esegue meno confronti, complessità asintotica logaritmica O(log n). Algoritmo di ricerca binaria: Per prima cosa, si confronta la chiave con l elemento centrale dell array, se c è corrispondenza la ricerca è finita. Altrimenti si decide di continuare la ricerca nella metà destra o sinistra rispetto l elemento considerato (l array è ordinato, quindi la chiave, se presente, è maggiore o minore dell elemento considerato) e si utilizza di nuovo la stessa strategia. Informatica Medica, I semestre, C++ 15 Ricerca binaria int BinarySearch(int *data, int dim, int key) int first=0, last=dim-1; Divisione tra interi while(first <= last) int mid = (first + last) / 2; if (key==data[mid]) return mid; else if (key<data[mid]) last=mid - 1; else first=mid + 1; return -1; Informatica Medica, I semestre, C++ 16
5 Il problema dell ordinamento Dato un array i cui elementi contengono tutti una chiave di ordinamento e data una relazione d ordine sul dominio delle chiavi, determinare una permutazione degli oggetti contenuti negli elementi dell array tale che la nuova disposizione delle chiavi soddisfi la relazione d ordine. Vediamo un algoritmo di ordinamento intuitivo ma con una complessità asintotica quadratica O(n 2 ). Esistono algoritmi più efficienti (per esempio, il quicksort ha una complessità asintotica O(n log n). Ordinamento per selezione L idea di base è trovare l elemento con il valore minore e scambiarlo con l elemento nella prima posizione. Quindi si cerca il valore minore fra gli elementi rimasti (escludendo la prima posizione) e lo si scambia con la seconda posizione. Si continua finché tutti gli elementi sono nella posizione corretta. Vediamo una possibile implementazione. Informatica Medica, I semestre, C++ 17 Informatica Medica, I semestre, C++ 18 Ordinamento per selezione void Swap(int *vt, int e1, int e2) int tmp = vt[e1]; vt[e1] = vt[e2]; vt[e2] = tmp; void SelectionSort(int *data, int dim) Il numero di iterazioni del int i, j, least; ciclo interno dipendono for (i = 0; i < dim - 1; i++) da quello esterno for (j = i + 1, least = i; j < dim; j++) if (data[j]<data[least]) least = j; Swap(data, least, i); Esempio di ordinamento e ricerca void test2() const int dim=10; int vt[dim]; for(int i=0;i<dim;i++) vt[i]=dim-i; SelectionSort(vt,dim); for(int i=0;i<dim;i++) Una possibile uscita Informatica Medica, I semestre, C++ 19 Informatica Medica, I semestre, C++ 20
6 Esempio di ordinamento e ricerca void test3() const int dim=10; int vt[dim]; for(int i=0;i<dim;i++) vt[i]=dim-i; SelectionSort(vt,dim); for(int i=0;i<dim;i++) int val=5; Una possibile uscita cout<<binarysearch(vt,dim,val)<<endl; val=15; cout<<binarysearch(vt,dim,15)<<endl; Informatica Medica, I semestre, C++ 21
Per indicare la complessità asintotica si usa la notazione O-grande (Big-Oh):
ANALISI DELLA COMPLESSITÀ DEGLI ALGORITMI Uno stesso problema può essere risolto da algoritmi di diversa efficienza: tale efficienza diventa rilevante quando la quantità di dati da manipolare diventa grande.
SOMMARIO IL PROBLEMA DELLA RICERCA. Algoritmi di ricerca: Algoritmi di ordinamento: RICERCA LINEARE
SOMMARIO IL PROBLEMA DELLA RICERCA Algoritmi di ricerca: Ricerca lineare; Ricerca binaria (su elenchi già ordinati). Dato un array e un oggetto, stabilire se l oggetto è contenuto in un elemento dell array,
Algoritmi di ordinamento
Algoritmi di ordinamento! Selection Sort! Quick Sort! Lower bound alla complessità degli algoritmi di ordinamento Ordinamento 1 Selection Sort SelectionSort(dati[]) { for (i=0; idati.length-1; i++) { min
Laboratorio di Programmazione Appunti sulla lezione 4: Divide et impera e algoritmi di ordinamento
Laboratorio di Programmazione Appunti sulla lezione 4: Divide et impera e algoritmi di ordinamento Alessandra Raffaetà Università Ca Foscari Venezia Corso di Laurea in Informatica Ricerca binaria Assunzione:
Algoritmi di Ricerca. Esempi di programmi Java
Fondamenti di Informatica Algoritmi di Ricerca Esempi di programmi Java Fondamenti di Informatica - D. Talia - UNICAL 1 Ricerca in una sequenza di elementi Data una sequenza di elementi, occorre verificare
Corso di Fondamenti di Informatica
Corso di Fondamenti di Informatica Gli algoritmi di base sul tipo array: ordinamento e ricerca Claudio De Stefano - Corso di Fondamenti di Informatica 1 Algoritmi di ordinamento gli algoritmi si differenziano
Ordinamento di una lista: bubble-sort
Ordinamento di una lista: bubble-sort L idea è di far galleggiare il minimo della lista nelle prima posizione Riduco la parte di lista da considerare, escludendo le prime posizioni già ordinate Ordinamento:
Primo allenamento. Olimpiadi Italiane di Informatica - Selezione territoriale
Primo allenamento Olimpiadi Italiane di Informatica - Selezione territoriale Luca Chiodini [email protected] - [email protected] 10 marzo 2016 Programma 1. Lettura di un problema tratto dalle
Algoritmi di ricerca. Per ricerca si intende qui il procedimento di localizzare una particolare informazione in un elenco di dati.
E. Calabrese: Fondamenti di Informatica Algoritmi-1 Algoritmi di ricerca Per ricerca si intende qui il procedimento di localizzare una particolare informazione in un elenco di dati. Per esempio: - cercare
Algoritmi di Ricerca. Esempi di programmi Java
Fondamenti di Informatica Algoritmi di Ricerca Esempi di programmi Java Fondamenti di Informatica - D. Talia - UNICAL 1 Ricerca in una sequenza di elementi Data una sequenza di elementi, occorre verificare
Algoritmi di ordinamento. Algoritmi. Selection sort semplificato - I. Selection sort semplificato - II
Algoritmi Ver..4 Algoritmi di ordinamento Lo scopo è ordinare in senso [de]crescente il contenuto di un vettore di N elementi senza utilizzare un secondo vettore Esiste molta letteratura scientifica a
Esercizi riassuntivi (Fondamenti di Informatica 2 Walter Didimo) Soluzioni
Esercizi riassuntivi (Fondamenti di Informatica 2 Walter Didimo) Soluzioni Esercizio 1 Dire quale è la complessità temporale del seguente metodo, espressa con notazione asintotica O(.) (con la migliore
Fondamenti di Informatica. Algoritmi di Ricerca e di Ordinamento
Fondamenti di Informatica Algoritmi di Ricerca e di Ordinamento 1 Ricerca in una sequenza di elementi Data una sequenza di elementi, occorre verificare se un elemento fa parte della sequenza oppure l elemento
Algoritmi di Ricerca Ordinamento
Algoritmi di Ricerca e Ordinamento Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni Appunti Di Informatica Prof. Accarino 1 Algoritmi classici In ambito informatico alcuni problemi si presentano
Sistemi Web per il turismo - lezione 3 -
Sistemi Web per il turismo - lezione 3 - Software Si definisce software il complesso di comandi che fanno eseguire al computer delle operazioni. Il termine si contrappone ad hardware, che invece designa
COMPLESSITÀ COMPUTAZIONALE DEGLI ALGORITMI
COMPLESSITÀ COMPUTAZIONALE DEGLI ALGORITMI Fondamenti di Informatica a.a.200.2005/06 Prof. V.L. Plantamura Dott.ssa A. Angelini Confronto di algoritmi Uno stesso problema può essere risolto in modi diversi,
Array e Oggetti. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 12. A. Miola Dicembre 2006
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1 Dispensa 12 Array e Oggetti A. Miola Dicembre 2006 http://www.dia.uniroma3.it/~java/fondinf1/ Array e Oggetti 1 Contenuti Array paralleli
Studio degli algoritmi
COMPLESSITÀ COMPUTAZIONALE DEGLI ALGORITMI Fondamenti di Informatica a.a.2006/07 Prof. V.L. Plantamura Dott.ssa A. Angelini Studio degli algoritmi Dato un problema P, le problematiche riguardano: Sintesi
Ω (grande omega) Esempio 10 COMPLESSITÀ COMPUTAZIONALE DEGLI ALGORITMI
COMPLESSITÀ COMPUTAZIONALE DEGLI ALGORITMI Fondamenti di Informatica a.a.2006/07 Prof. V.L. Plantamura Dott.ssa A. Angelini Esempio 10 int potenza(int base, int esp); main () { \* Genera le prime potenze
Lezione 4 Ugo Vaccaro
Progettazione di Algoritmi Anno Accademico 2017 2018 Lezione 4 Ugo Vaccaro Introduciamo ora la notazione Ω, che ci sarà utile quando vorremo valutare limitazioni inferiori al tempo di esecuzione di algoritmi
Introduzione a Visual Basic Lezione 2 Cicli e anomalie
a Visual Basic Lezione 2 Mario Alviano Introduzione all informatica Università della Calabria http://alviano.net/introinfo A.A. 2008/09 Introduzione Perché i cicli? Un esempio concreto Finora abbiamo visto
Algoritmo di ordinamento per sostituzione. Esempio : dato l array :
Algoritmo di ordinamento per sostituzione Per ottenere un ordinamento crescente con l algoritmo di ordinamento per Sostituzione si confronta l elemento nella prima posizione con gli elementi nelle posizioni
Esercizi per il corso di Algoritmi, anno accademico 2011/12
Esercizi per il corso di Algoritmi, anno accademico 2011/12 Esercizi sulla Tecnica Divide et Impera N.B. Tutti gli algoritmi vanno scritti in pseudocodice (non in Java, nè in C++, etc. ). Di tutti gli
Le strutture di controllo in C++
Le strutture di controllo in C++ Docente: Ing. Edoardo Fusella Dipartimento di Ingegneria Elettrica e Tecnologie dell Informazione Via Claudio 21, 4 piano laboratorio SECLAB Università degli Studi di Napoli
Algoritmi e loro proprietà. Che cos è un algoritmo? Un esempio di algoritmo
1 Cos è l informatica? L informatica è la scienza della rappresentazione e dell elaborazione dell informazione Algoritmi e loro proprietà Proprietà formali degli Algoritmi Efficienza rispetto al tempo
Tempo e spazio di calcolo
Tempo e spazio di calcolo Modelli di calcolo e metodologie di analisi F. Damiani - Alg. & Lab. 04/05 (da M. Zacchi - Alg. & Lab. 03/04) In quale modo stimiamo il tempo di calcolo? Possiamo considerare
Ricerca binaria (o dicotomica) di un elemento in un vettore
Ricerca binaria (o dicotomica) di un elemento in un La ricerca binaria o dicotomica è utilizzata per ricercare i dati in un ORDNATO. L algoritmo di ricerca binaria, dopo ogni confronto, scarta metà degli
Introduzione al linguaggio C Funzioni
Introduzione al linguaggio C Funzioni Violetta Lonati Università degli studi di Milano Dipartimento di Informatica Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica Violetta Lonati
