Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


Dispense 17-18 Algoritmi, Dispense di Algoritmi E Strutture Di Dati

dispense del corso algoritmi e strutture dati

Tipologia: Dispense

2017/2018

Caricato il 15/05/2018

biagio.licari
biagio.licari 🇮🇹

4 documenti

1 / 8

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
Pag 5
1) Introduzione
Prima di qualunque altra considerazione è importante capire cosa sia l’informatica. Si può
facilmente osservare che al giorno d’oggi l’informatica permea la nostra vita quotidiana, sia
quando essa è direttamente percepibile (ad esempio mentre navighiamo in Internet utilizzando
un pc) sia quando è invisibile (“embedded”, ossia per così dire incassata dentro
un’automobile, un elettrodomestico, un telefono).
Senza l’informatica, la società contemporanea così come la conosciamo semplicemente non
potrebbe continuare ad esistere. Non solo, ma ormai l’informatica permea anche
apparecchiature dalle quali dipendono le vite delle persone (aeroplani di linea, apparecchiature
mediche) che potrebbero essere messe in pericolo da malfunzionamenti derivanti da errori
informatici per cui, oltre ad essere pervasiva, l’informatica riveste un ruolo di assoluta
importanza.
L’informatica viene spesso, ed a torto, considerata una “banale” attività pratica, per svolgere la
quale è sufficiente un approccio dilettantistico e non è necessaria una vera professionalità.
Nulla di più inesatto: in realtà l’informatica è una disciplina scientifica. Ma che tipo di scienza?
Non può essere considerata una sorta di “scienza dei calcolatori”, poiché i calcolatori (o
elaboratori) sono solo uno strumento: l’informatico può anche lavorare solamente con carta e
penna. In realtà l’informatica, intesa come disciplina scientifica, non coincide con alcuna delle
sue applicazioni.
Dal dizionario Devoto-Oli della lingua italiana: L’informatica è la scienza che consente di
ordinare, trattare e trasmettere l’informazione attraverso l’elaborazione elettronica...
In questa definizione le parole chiave sono due: informazione e scienza.
In effetti, la pervasività dell’informatica deriva dal fatto che in qualunque tipo di attività umana è
necessario gestire qualche tipo di informazione, che va memorizzata ed elaborata, entrambe
attività rigorose e sistematiche, ed è per questo che si richiede un approccio scientifico.
pf3
pf4
pf5
pf8

Anteprima parziale del testo

Scarica Dispense 17-18 Algoritmi e più Dispense in PDF di Algoritmi E Strutture Di Dati solo su Docsity!

1) Introduzione

Prima di qualunque altra considerazione è importante capire cosa sia l’informatica. Si può facilmente osservare che al giorno d’oggi l’informatica permea la nostra vita quotidiana, sia quando essa è direttamente percepibile (ad esempio mentre navighiamo in Internet utilizzando un pc) sia quando è invisibile (“embedded”, ossia per così dire “incassata” dentro un’automobile, un elettrodomestico, un telefono).

Senza l’informatica, la società contemporanea così come la conosciamo semplicemente non potrebbe continuare ad esistere. Non solo, ma ormai l’informatica permea anche apparecchiature dalle quali dipendono le vite delle persone (aeroplani di linea, apparecchiature mediche) che potrebbero essere messe in pericolo da malfunzionamenti derivanti da errori informatici per cui, oltre ad essere pervasiva, l’informatica riveste un ruolo di assoluta importanza.

L’informatica viene spesso, ed a torto, considerata una “banale” attività pratica, per svolgere la quale è sufficiente un approccio dilettantistico e non è necessaria una vera professionalità.

Nulla di più inesatto: in realtà l’informatica è una disciplina scientifica. Ma che tipo di scienza? Non può essere considerata una sorta di “scienza dei calcolatori”, poiché i calcolatori (o elaboratori) sono solo uno strumento: l’informatico può anche lavorare solamente con carta e penna. In realtà l’informatica, intesa come disciplina scientifica, non coincide con alcuna delle sue applicazioni.

Dal dizionario Devoto-Oli della lingua italiana: “ L’informatica è la scienza che consente di ordinare, trattare e trasmettere l’informazione attraverso l’elaborazione elettronica...

In questa definizione le parole chiave sono due: informazione e scienza.

In effetti, la pervasività dell’informatica deriva dal fatto che in qualunque tipo di attività umana è necessario gestire qualche tipo di informazione, che va memorizzata ed elaborata, entrambe attività rigorose e sistematiche, ed è per questo che si richiede un approccio scientifico.

1.1 Algoritmi

La definizione di informatica proposta dall’ACM (Association for Computing Machinery), una delle principali organizzazioni scientifiche di informatici di tutto il mondo, è la seguente: ”L’informatica è la scienza degli algoritmi che descrivono e trasformano l’informazione: la loro teoria, analisi, progetto, efficienza, realizzazione e applicazione.”

Iniziamo dunque con l’introdurre un concetto fondamentale, centrale per l’informatica, quello di algoritmo.

Un algoritmo è “ una sequenza di comandi elementari ed univoci ”.

Un comando è elementare quando non può essere scomposto in comandi più semplici; è univoco quando può essere interpretato in un solo modo.

Ad esempio, domandiamoci se la seguente ricetta per fare un uovo al tegamino è un algoritmo:

1. Rompere un uovo in padella.

2. Cuocere l’uovo.

Il passo 1 non è né elementare né univoco in quanto, dopo aver rotto l’uovo (cosa che già si può fare in molti modi, non tutti utili allo scopo), si deve separare il guscio dal resto.

Il passo 2 non è elementare: l’attività di cottura si può scomporre nell’accensione del fornello, nell’aggiunta del condimento e del sale, prevede il controllo della cottura, ecc.

Se un algoritmo è veramente tale, e quindi è ben specificato, chi (o ciò che) lo esegue non ha bisogno di pensare, deve solo eseguire con precisione i passi elencati nell’algoritmo, nella sequenza in cui appaiono.

E infatti un calcolatore non pensa, esegue pedissequamente tutte le operazioni elencate negli algoritmi pensati (ossia progettati) da un essere umano. Se si verifica un errore e il risultato è sbagliato, l’errore non è del calcolatore ma di chi ha progettato l’algoritmo.

Più formalmente, un algoritmo è “ una procedura di calcolo ben definita che riceve un insieme di valori in input e produce un corrispondente insieme di valori in output ”.

Esso è uno strumento per risolvere un problema computazionale : descrive una specifica procedura di calcolo per ottenere la relazione tra input e output specificata dal problema.

Esempio 1.  Problema computazionale: ordinare n numeri dal più piccolo al più grande.

 Input (anche detto istanza del problema ): sequenza di n numeri a 1 , a 2 , …, an ;

 Output: permutazione a’ 1 , a’ 2 , …, a’n della sequenza di input tale che a’ 1 ≤ a’ 2 , …, ≤ a’n.

Domandiamoci se la maggiore velocità del calcolatore V riesce a bilanciare la minore efficienza dell’algoritmo IS, confrontando il tempo di esecuzione di IS sul calcolatore V con quello di MS sul calcolatore L.

Tempo di V(IS) =

Tempo di L(MS) =

Come si vede, la risposta è no. Se poi supponiamo di aumentare la dimensione dell’input, portandola a 107 numeri interi, il divario aumenta:

Tempo di V(IS) =

Tempo di L(MS) =

Questo ci fa capire come, indipendentemente dall’aumento di velocità dei calcolatori prodotto dagli avanzamenti tecnologici, l’efficienza degli algoritmi sia un fattore di importanza cruciale.

1.4 Modello del calcolatore

E’ necessario definire un modello astratto di calcolatore per poter approfondire il problema del costo computazionale degli algoritmi.

Possiamo modellare il calcolatore come un apparato costituito di quattro tipi di unità funzionali:

 processore (CPU, Central processing Unit);

 memoria centrale (RAM, Random Access memory);

 memoria secondaria (o memoria di massa);

 dispositivi di input/output (tastiera, schermo, stampante, ecc.).

CPU Memoria centrale

Memoria secondaria

Dispositivi di I/O

BUS

1.4.1 Memoria Concentriamoci sulla RAM. Essa può essere vista come una lunga sequenza di componenti elementari, ognuna delle quali contiene una unità di informazione, il bit (abbreviazione di binary digit ) che assume solo i valori zero e uno).

Celle di memoria

I bit sono aggregati fra loro in strutture un po’ più complesse, dette celle di memoria , che contengono di norma ciascuna un byte (costituito di 8 bit). La memoria può quindi essere vista come una sequenza di celle.

Aspetti importanti sono i seguenti:

 ciascuna cella di memoria ha un indirizzo ;

 gli indirizzi corrispondono alla posizione delle celle nella sequenza;

 gli indirizzi sono numeri interi e non sono memorizzati da nessuna parte, ma sono

determinati dall’ordinamento consecutivo delle celle stesse;

 solo le celle e non i singoli bit sono indirizzabili (cioè accessibili da parte della CPU).

Il termine random access memory usato per la memoria centrale convoglia un concetto molto importante: il tempo di accesso ad una qualunque cella di memoria è sempre lo stesso , indipendentemente dalla posizione (e quindi dall’indirizzo) della cella. Le operazioni che il processore può effettuare su una cella di memoria sono la lettura (che preleva il contenuto corrente della cella) e la scrittura (che memorizza un contenuto nella cella, sovrascrivendo quello precedente).

Gli indirizzi delle celle sono numeri interi, quindi possono essere codificati in binario. Poiché per rappresentare un numero intero n è necessario un numero di bit pari a log n (che a sua volta è un numero intero se n è una potenza di 2, come è sempre il caso del numero di celle di memoria nei calcolatori), il numero di celle di memoria esistenti (e quindi le dimensioni della RAM) determina il numero minimo di bit necessari a rappresentare gli indirizzi per poter accedere alle celle stesse.

Viceversa, il numero di bit utilizzati per rappresentare gli indirizzi di memoria determina il numero massimo di celle indirizzabili. Questo numero viene chiamato spazio di indirizzamento. Ad esempio, con indirizzi a 32 bit non si possono indirizzare più di 2^32 celle di memoria, cioè circa quattro miliardi, nemmeno se il calcolatore ne contenesse molte di più.

la cui validità e potenza concettuale risiede nel fatto che non diventa obsoleta con il progredire della tecnologia.

Il modello RAM ha queste caratteristiche:

 esiste un singolo processore, che esegue le operazioni sequenzialmente, una dopo

l’altra (non è possibile eseguire più operazioni contemporaneamente);

 esiste un insieme di operazioni elementari , l’esecuzione di ciascuna delle quali

richiede per definizione un tempo costante. Esempi di tali operazioni sono: le

operazioni artimetiche, le letture, le scritture, il salto condizionato, ecc.;

 esiste un limite alla dimensione di ogni valore memorizzato. In particolare, se il

problema da risolvere ha un’istanza costituita di n elementi, assumiamo che i singoli

elementi dell’istanza nonché i valori in output siano rappresentati da c logn bit, per

qualche costante c ≥ 1. Questo perché:

o c deve essere costante per evitare soluzioni irrealistiche, nelle quali in un

singolo elemento dell’input o dell’output vengano surrettiziamente contenuti

in realtà molti valori veri e propri dell’input o dell’output stesso;

o c ≥ 1 in modo che con la stessa quantità di bit dedicata ai dati in input si possa

anche rappresentare il valore n , così da poter indicizzare ciascun elemento in

input in tempo costante.

Criterio della misura di costo uniforme

Una prima possibilità è fare l’ipotesi che ogni operazione elementare sui dati del problema che, come abbiamo detto, hanno ciascuno dimensione di c logn bit, venga eseguita in un tempo costante. In tal caso si parla di misura di costo uniforme.

Tale criterio non è sempre realistico perché, come abbiamo visto, le reali parole di memoria centrale hanno un numero di bit fissato (oggi 32 o 64), quindi se un dato del problema è più grande deve essere memorizzato in più parole di memoria. Di conseguenza, anche le operazioni elementari su di esso dovranno essere reiterate per tutte le parole di memoria che lo contengono, e quindi richiederanno un tempo che non è più costante.

Criterio della misura di costo logaritmico

Questo criterio, perfettamente realistico, risolve il problema sopra esposto assumendo che il costo delle operazioni elementari sia funzione della dimensione degli operandi (ossia dei dati). Poiché, come abbiamo visto sopra, tale dimensione si assume essere c log n per un’istanza costituita da n elementi, il costo di un’operazione elementare si quantifica in log n. Per questo si parla di misura di costo logaritmico.

Essa però implica rilevanti complicazioni nei calcoli dell’efficienza di un algoritmo, per cui sia in letteratura che nella pratica si sceglie di usare la misura di costo uniforme che si rivela adatta alla maggior parte dei problemi reali.

Analizziamo informalmente un semplicissimo programma applicando entrambi i criteri al fine di evidenziarne le differenze. Il programma consiste di un ciclo, reiterato n volte, che calcola il valore 2 n :

x  1; for i = 1 to n do x  x*2;

Con la misura di costo uniforme si vede facilmente che il tempo di esecuzione totale è proporzionale ad n , poiché si tratta di un ciclo eseguito n volte nel quale, ad ogni iterazione, si compiono due operazioni, ciascuna delle quali ha costo unitario: l’incremento del contatore e il calcolo del nuovo valore di x.

Con la misura di costo logaritmico le cose diventano subito più complicate perché sia l’incremento di i che il raddoppio di x non hanno più costo costante. In particolare, per ogni singola iterazione il costo complessivo è dato da:

 log x = log 2i^ = i per il calcolo del nuovo valore di x ;

 log i , per l’incremento del contatore.

Il costo totale diviene dunque:

Ora, considerando che:

e che:

si vede che il tempo di esecuzione totale è proporzionale ad n^2.