Matlab - Math Unipd - Università di Padova

Matlab
Matlab
• MATLAB (Matrix Laboratory) è un ambiente
di programmazione interattivo finalizzato
all’esecuzione di calcoli con array e matrici,
nel quale esistono sia strutture di controllo
analoghe a quelle dei linguaggi di
programmazione (cicli, condizioni), sia
funzioni che forniscono semplici soluzioni
numeriche (autovalori), sia funzioni che
permettono la costruzione di grafici.
Matlab
Matlab
• Esistono molti testi su Matlab, alcuni
finalizzati ad argomenti specifici.
• L’utilizzo di questo ambiente necessita di una
licenza.
• Per entrare nell’ambiente Matlab si deve
digitare il comando
matlab
• Si apre una finestra (nella versione installata in
aula) suddivisa in tre parti: ambiente di
programmazione, elenco dei file della propria
cartella, elenco dei comandi utilizzati
• Il prompt dei comandi è >>
• Si esce dall’ambiente chiudendo la finestra
(quit o exit).
• È disponibile gratuitamente in rete, in formato
pdf, un Manuale Matlab a cura di Giuseppe
Ciaburro, www.ciaburro.it
1
Matlab
• In questo ambiente c’è uno spazio di lavoro,
workspace, nel quale vengono memorizzate le
variabili usate in quella sessione di lavoro.
Non esiste il concetto di “dichiarazione delle
variabili”: infatti lo stesso nome di variabile
può essere uno scalare e poi una matrice, un
numero e poi una stringa, …
• Per attribuire un valore ad una variabile si
scrive
nome = espressione
• Si ottiene una “risposta”: il nome della
variabile e il suo valore.
Matlab
• Esempi.
>> x = 5
(linea di comando)
x =
(risposta)
5
>> 2^3
(linea di comando)
ans =
(risposta)
8
• Quando non c’è un nome di variabile ma solo
un’espressione
(2^3),
la
risposta
è
memorizzata nella variabile ans.
Matlab
• Operatori.
*
/
+
\
(divisione da destra a sinistra)
^
(elevamento a potenza)
• Lo spazio è un separatore.
Matlab
• Se successivamente eseguiamo un’altra
operazione
>> 4\2
(linea di comando)
ans =
(risposta)
0.5
ans cambia il suo valore (ora vale 0.5).
• Per non avere la visualizzazione del valore
dell’istruzione inserita, l’istruzione deve
terminare con un ; . Il valore della variabile è
comunque memorizzato nello spazio di lavoro.
2
Matlab
• Matrici e vettori.
• Matrici e vettori (matrici con una sola riga) si
possono introdurre elencando, tra parentesi
quadre, tutti gli elementi.
• Si può definire un vettore riga (matrice 1× n)
s= [ 1 1]
oppure
s= [ 1 , 1]
• dove gli elementi sono separati da spazi o
virgole. Matlab distingue maiuscole e
minuscole.
Matlab
• Si può estrarre una sottomatrice, indicando
quali e quante righe e colonne si vogliono
estrarre:
b=23
b = a(1:2, 2:3)
56
si estrae dalla matrice a dalla prima alla
seconda riga le colonne dalla 2 alla 3
• Se si vogliono estrarre tutte le colonne si
indica solo il :
c=123
c = a(1:2,:)
456
Matlab
• Il ; individua le righe, pertanto un vettore
colonna (2×1) viene definito:
s=1
s = [ 1 ; 1]
1
• Costruiamo una matrice 2×3
a=123
a = [1 2 3;4 5 6]
456
• Possiamo aggiungere una nuova riga:
r = [7,8,9]
a=123
a = [a;r]
456
789
Matlab
• Possiamo costruire una matrice accostandone
altre:
a = [1 2 3;4 5 6]
b = [7;7]
c = [0 0 0 0;4 4 4 4]
d = [a b;c]
d=1237
4567
0000
4444
3
Matlab
Matlab
• Per costruire la trasposta di una matrice nota o
di un vettore si usa l’apice:
a = c'
a=14
• Si può costruire una sequenza di valori da
attribuire ad un vettore indicando: inizio, passo
e fine, separati dal simbolo :
v = [1:2:8]
v=1357
25
36
t = s'
• Se si omette il passo, questo vale 1:
v = [1:6]
t=1
1
v=123456
Matlab
Matlab
• Con riferimento alla matrice d, abbiamo:
s = d(1:2:3, 1:2:3)
estraiamo dalle righe 1 e 3 le colonne 1 e 3
d=1237
4567
0000
4444
s=1 3
0 0
• Somma e prodotto tra matrici.
• Date due matrici A e B di dimensioni
compatibili, la somma e il prodotto si
ottengono con gli operatori + e *:
A + B (somma)
A * B (prodotto righe per colonne)
• invece A .* B
per elemento.
indica il prodotto elemento
4
Matlab
• Prodotto tra vettori.
a = [1 2 3]
s = a .* a
prodotto scalare
s = a * a'
s = a' * a
Matlab
s = [1, 4, 9]
s = 14
s =
1 2 3
2 4 6
3 6 9
Matlab
diag(v,k): restituisce una matrice la cui
diagonale k-esima è v; con k = 0 si intende la
diagonale principale, con k = 1,-2,… le
diagonali sotto quella principale e con k = 1, 2,
3, … le diagonali sopra quella principale
ones(n,m) : restituisce una matrice n × m
con tutti gli elementi uguali a 1; per ottenere
un vettore (riga o colonna), n o m sono 1
zeros(n,m) : restituisce una matrice n × m
con tutti gli elementi uguali a 0; per ottenere
un vettore (riga o colonna), n o m sono 1
• Funzioni per l’utilizzo di matrici. Siano a una
matrice e v un vettore.
diag(a): restituisce un vettore che contiene la
diagonale di a
diag(v): restituisce una matrice che ha v
come diagonale
diag(a,k): restituisce un vettore che contiene
la diagonale k-esima di a; con k = 0 si intende
la diagonale principale, con k = -1,-2,… le
diagonali sotto quella principale e con k = 1, 2,
3, … le diagonali sopra quella principale
Matlab
• Costruzione di matrici combinando funzioni e
operazioni:
a = diag([5:11])
(la diagonale di a ha 7 elementi)
a = a + diag(ones(6,1),1)
(diagonale k=1 con 6 elementi)
a = 5 1 0 .. 0
2 6 1 0 .. 0
v = [1:7]
0 3 7 1 0 ..0
a = a + diag(v(2:7),-1) …………..
0 … 6 10 1
0 0 .. 7 11
5
Matlab
Matlab
• eye(n): restituisce la matrice identica di
dimensione n
• tril(a) : restituisce una matrice che è la
triangolare inferiore di a compresa la diagonale
• triu(a) : restituisce una matrice che è la
triangolare inferiore di a compresa la diagonale
• eig(a) : restituisce la matrice degli
autovettori e quella con gli autovalori
• inv(a) : restituisce l’inversa della matrice
• Uso di Matlab nei problemi di calcolo
numerico.
• Soluzione di un sistema lineare Ax = b
• Metodo di Jacobi.
• Indichiamo con
D
la matrice diagonale di A
-E = L
la triangolare inferiore di A
-F = U
la triangolare superiore di A
Matlab
Matlab
• La formula matriciale che esprime l’iterazione
del metodo è:
x (k+1) = D-1 (E +F) x (k) + D-1b
• Usiamo le funzioni di Matlab per verificare se
l’autovalore
massimo
della
matrice
d’iterazione H è in modulo minore di 1.
diag(A)
diagonale di A
D = diag(diag(A))
matrice diagonale
E + F = -(L + U) = D – A
H = D-1 (E +F) = D-1 (D - A) = I - D-1 A
Calcolo dell’autovalore massimo di H
xi(k+1) = bi/aii -
∑ xs(k) ais/aii
con s = 1,…, n e s≠ i
• La matrice d’iterazione è
H = D-1 (E +F)
6
Matlab
[n,m]=size(A)
deve essere n=m
H = eye(n)- D\A
barra rovescia: D\A = inv(D)*A
[autovett, autoval] = eig(H)
av = diag(autoval)
m = max(abs(av))
Matlab
• I confronti sono: == ~= < >
• I predicati sono composti con & e |
if P istruzioni
end
if P
istruzioni
else istruzioni
end
Matlab
• Strutture di controllo.
for variabile=inizio:passo:fine
istruzioni
end
while P
istruzioni
end
• I predicati sono scritti senza parentesi. La
parola chiave end (deve essere scritta a capo)
termina la struttura.
Matlab
if P
istruzioni
elseif Q
istruzioni
else
istruzioni
end
• I commenti si introducono con il simbolo %
% commento su una riga
• Gli spazi sono separatori.
7
Matlab
Matlab
• Il comando whos fornisce un elenco delle
variabili con il loro nome e l’occupazione di
memoria.
• Le matrici appaiono come n × m, mentre gli
array sono 1 × n oppure n × 1 e gli scalari
sono 1 × 1.
• Con il comando save nomefile si può salvare
il contenuto del workspace in un file che in
una successiva sessione può essere caricato
con il comando load.
• Programmi.
• Un programma scritto in Matlab può essere
inserito in un file, la cui estensione deve essere
.m
prova.m
• Si hanno due tipi di programmi:
1) script o file di comandi: non hanno
argomenti
2) funzione: possono avere argomenti e
restituire valori.
Matlab
Matlab
• Uno script viene lanciato indicando il nome
del file
>> prova
• Le istruzioni agiscono sulle variabili del
workspace, e costruiscono valori che sono noti
anche dopo che è terminata l’esecuzione del
programma.
• Le variabili all’interno della funzione sono
variabili locali (non più note dopo la
terminazione).
• La prima riga di una funzione deve essere:
function [parametri uscita] =
nomefun(parametri ingresso)
• I parametri sono separati da virgole.
• La funzione deve essere scritta in un file con lo
stesso nome.
8
Matlab
Matlab
• Grafici.
• La funzione plot visualizza il grafico di una
funzione in una finestra; si indicano i due array
che rappresentano le ascisse e le ordinate e uno
stile facoltativo (simbolo e colore) con cui si
vuole rappresentare la curva:
plot(x, y, stile)
plot(x1, y1, stile1,
x2, y2, stile2)
• Si può inserire un titolo o delle etichette:
title('testo')
xlabel('testo') : il testo verrà inserito
in basso nella direzione dell’asse x
hold on : la pagina grafica viene bloccata
così che il successivo grafico si sovrappone al
precedente
hold off : la pagina grafica ritorna libera
Reti di calcolatori
Reti di calcolatori
• Testi di riferimento.
• A. S. Tanenbaum Reti di Computer
Quarta Ed. Pearson, 2004
• M. R. Laganà, M. Righi, F. Romani
Informatica. Concetti e sperimentazioni
Seconda Ed. Apogeo, 2007
Cap.3 e 12
9
Reti di calcolatori
Reti di calcolatori
• Consideriamo una grande azienda composta da
varie fabbriche dislocate in posti molto lontani
tra loro: ogni fabbrica deve poter elaborare la
gestione di acquisti, vendite, stipendi, ecc.
• Negli anni settanta esistevano grossi
calcolatori a cui erano collegati terminali e
stampanti, così che i vari utenti potevano
risiedere nelle sedi lontane effettuando una
elaborazione a distanza dell’unica macchina.
• Con l’avvento dei personal computer, sempre
meno costosi e sempre più potenti,
l’organizzazione del lavoro si è trasformata:
nelle varie aziende è presente un calcolatore
che effettua una sua elaborazione autonoma.
• La necessità di comunicare informazioni di
interesse comune rende comunque necessario
che i calcolatori possano scambiare
informazioni tra loro.
Reti di calcolatori
Reti di calcolatori
• A metà degli anni sessanta il Dipartimento
della Difesa degli Stati Uniti affidò al suo ente
di ricerca ARPA (Advanced Research Project
Agency) il compito di costruire una rete che
potesse resistere ad una guerra nucleare. Essa
collegava centri di ricerca, università e
strutture governative. La rete doveva essere
composta da vari calcolatori, collegati da linee
di trasmissione così che se un calcolatore fosse
stato distrutto la comunicazione poteva
avvenire per una via diversa. Questa rete
prenderà il nome di Arpanet e sarà la
progenitrice dell’attuale Internet.
• Con il termine rete di calcolatori si intende un
insieme di calcolatori indipendenti, collegati
tra di loro, in grado cioè di scambiarsi
informazioni.
• Con gli anni novanta le reti di calcolatori
incominciarono a fornire servizi ai singoli
individui: accesso ad informazioni remote
(servizi bancari, web, …), comunicazione
uomo-a-uomo
(email,
videoconferenza),
intrattenimento interattivo (giochi, video, …).
10
Reti di calcolatori
Reti di calcolatori
• La distanza tra le varie componenti porta ad
una classificazione delle reti, accompagnata
anche da diverse tecniche di trasmissione.
• Si parla principalmente di:
• reti locali
• reti metropolitane
• reti geografiche.
• Le reti di calcolatori possono a loro volta
essere interconnesse tra loro (internetwork).
• Un’altra importante distinzione è la tecnologia
di collegamento:
• reti a diffusione globale (broadcast), dove un
unico canale di trasmissione è condiviso dalle
varie macchine; il pacchetto di informazione
viene inviato a tutte e un campo indirizzo
indica quale è il destinatario
• reti punto-a-punto (point-to-point), dove sono
connesse coppie di macchine e il pacchetto
può attraversare più macchine intermedie
(algoritmi di routing per scegliere il cammino
più conveniente).
Reti di calcolatori
Reti di calcolatori
• Le reti locali, chiamate Local Area Network,
sono reti private situate all’interno di uno
stesso edificio o gruppo di edifici collegati
(università, aziende) di dimensione che varia
tra alcune decine di metri a qualche
chilometro.
• Dal momento che le dimensioni sono ridotte
spesso viene usata una linea telefonica locale
(un solo cavo) a cui sono collegate tutte le
macchine. La tecnologia broadcast può essere
lineare o ad anello.
• Architettura broadcast (lineare)
M
D
11
Reti di calcolatori
• Le reti metropolitane, chiamate Metropolitan
Area Network, coprono aree poco più vaste
delle LAN, con collegamenti sia privati che
pubblici che collegano gruppi di edifici
all’interno della stessa città.
• Utilizzano uno standard chiamato Distributed
Queue Dual Bus composto da due bus a cui
tutti i calcolatori sono collegati: il traffico
destinato ad un calcolatore situato alla destra
del mittente usa il bus superiore, quello che va
a sinistra usa quello inferiore.
Reti di calcolatori
• Architettura DQDB
Bus A
computer 1
2
3
…..
N
Bus B
Reti di calcolatori
• Le reti geografiche, chiamate Wide Area
Network, coprono grandi aree: nazioni e
continenti. Sono costituite da un insieme di
macchine, dette host (ospite), che eseguono i
programmi per gli utenti; ogni host è collegato
ad una LAN su cui è presente un router.
Questi sono calcolatori intermedi (detti anche
nodi per lo scambio di pacchetti) che eseguono
la scelta di quale linea deve far proseguire il
pacchetto.
Reti di calcolatori
• Due router possono essere collegati
direttamente da una linea, oppure tramite una
sottorete (router intermedi).
• In tale modo un pacchetto viene ricevuto da
ogni router intermedio, memorizzato fino a
quando la linea non è disponibile e quindi
viene fatto proseguire. Questa tipologia si
chiama: point-to-point, store-and-forward
(memorizza e inoltra), sottorete packedswitched (commutazione di pacchetto).
12
Reti di calcolatori
Reti di calcolatori
WAN
• Architettura point-to-point
Host
router
D
M
sottorete
LAN
Reti di calcolatori
• L’architettura client-server (nasce negli anni ’90) è
costituita da un calcolatore centrale, server, in grado di
gestire grandi basi di dati, collegato a più utenti
(centinaia, migliaia).
• Solitamente la comunicazione è un messaggio che
l’utente, client, invia al server affinché esso esegua un
certo lavoro (ricerca l’informazione). La macchina
server esegue il lavoro e invia la risposta al client che la
utilizza (visualizza l’informazione).
• Un server Web è un servizio attivo su un calcolatore
(server) che si occupa di fornire all’utente un qualsiasi
tipo di file, in particolare pagine Web.
Software delle reti
13
Software delle reti
Software delle reti
• Con architetture di reti sempre più complesse
si è reso necessario un software di gestione
della rete.
• Le reti sono organizzate a livelli (strati)
secondo dei modelli di riferimento (OSI e
TCP/IP).
• Ogni rete si distingue per il numero dei livelli,
nome e funzionalità diverse per ogni livello.
Ogni livello fornisce un servizio al livello
immediatamente superiore.
• Supponiamo di dover scambiare informazioni
tra due host e di avere una architettura con 4
livelli.
• La comunicazione tra le due macchine
avviene a parità di livello; le regole per attuare
tali conversazioni si chiamano protocolli; c’è
un protocollo per ogni livello.
I protocolli
I protocolli
Host 1
Host 2
protocollo di livello 4
interfaccia
livello 1/2
Livello 4
Livello 4
Livello 3
Livello 3
Livello 2
Livello 2
protocollo di livello 1
Livello 1
Livello 1
• Lo scambio di informazioni reale tra l’host1
e l’host2 non avviene direttamente e
nemmeno tra entità allo stesso livello, bensì
l’informazione viene passata al livello
inferiore e da questo a quello ancora inferiore
(4-3-2-1), realmente trasmessa dal livello
fisico e poi passata al primo livello e da
questo a quello superiore attraversando i vari
livelli (1-2-3-4).
Mezzo fisico
14
I protocolli
I protocolli
• Accade una cosa analoga quando un
mittente a spedisce una lettera da un punto
pa, della città Ca e dello stato Sa ad un
destinatario b ad un punto pb di una città
Cb dello stato Sb:
• cassetta della posta, raccolta del postino,
smistamento all’ufficio postale pa
• mezzo fisico treno, aereo (città, Stato)
• ufficio postale pb, consegna del postino,
cassetta delle lettere.
• Il mittente a scrive la lettera al destinatario
b con le sue regole di scrittura (protocollo),
gli uffici postali pa e pb comunicano tra
loro utilizzando convenzioni (protocolli)
come timbri, francobolli, …, gli incaricati
del servizio postale del treno prelevano
dalla città Ca pacchi, sacchi di posta
cartacea dagli addetti dell’ufficio postale e
consegnano agli addetti dell’ufficio postale
della città Cb, firmano ricevute di consegna
(protocolli).
I protocolli
• La comunicazione tra due livelli consecutivi
avviene tramite un’interfaccia che definisce
quali servizi il livello inferiore fornisce a
quello superiore.
• Questo permette di sostituire facilmente
un’implementazione con un’altra perché basta
che si mantenuto il servizio: ad esempio una
comunicazione che prima avveniva tramite
linea telefonica può essere trasmessa per via
satellitare.
I modelli di riferimento
15
I modelli di riferimento
I modelli di riferimento
• Le principali architetture di reti sono i modelli
di riferimento ISO-OSI e TCP/IP.
• Modello ISO-OSI (International Standard
Organization – Open System Interconnection).
• È un sistema aperto alla comunicazione con
altri sistemi che segue uno standard
internazionale.
• Esso è composto da sette livelli:
• livello fisico: trasmissione dei bit lungo un
canale di comunicazione.
• livello data link: i dati sono decomposti in
pacchetti, spediti in sequenza e si attende un
messaggio di ricezione del pacchetto; in caso
di errore il pacchetto può essere rispedito
• livello di rete: si deve stabilire quale cammino
deve essere scelto nella sottorete e gestire gli
eventuali problemi che possono sorgere per la
congestione della rete, o nella comunicazione
tra reti diverse.
I modelli di riferimento
I modelli di riferimento
• livello di trasporto: vengono accettati i dati
dal livello superiore e passati al livello di rete;
a volte può essere utile far condividere lo
stesso canale a più messaggi e perciò è
fondamentale un controllo del flusso delle
informazioni
• livello di sessione: può essere un collegamento
ad un sistema remoto o un trasferimento di
archivi; si effettua un controllo sul dialogo
(trasferimento in un’unica direzione o in
entrambe), e la sincronizzazione (gestione di
una interruzione nel trasferimento dei dati)
• livello di presentazione: riguarda la codifica
delle informazioni trasmesse (stringhe,
numeri) che possono avere diverse codifiche
(ASCII, Unicode) e che devono essere
rappresentati in maniera uniforme nella rete
• livello di applicazione: utilizzo di vari tipi di
terminali con una diversa gestione dello
schermo, diversi tipi di file system per la
gestione dei file, delle directory, gestione
remota di processi, …
16
I modelli di riferimento
I modelli di riferimento
• Ogni livello è programmato come se la
comunicazione avvenisse con la sua entità pari
(allo stesso livello) anche se, invece,
l’informazione viene passata al livello
inferiore: è analogo a quanto succede quando,
in un’assemblea con persone che parlano
lingue diverse, l’oratore crede di parlare ai suoi
ascoltatori, mentre in realtà egli parla
all’interprete.
• Il modello OSI era quello adottato per Arpanet
e i primi collegamenti avvenivano tramite linee
telefoniche; ma presto si aggiunsero
collegamenti via radio e satellitari, c’era
inoltre la necessità di far funzionare la
comunicazione anche in caso di guasti di
macchine intermedie, e di trasferire non solo
archivi ma anche suoni e immagini, perciò i
protocolli dovettero essere cambiati.
• L’architettura cambiò e si costruì un nuovo
modello.
I modelli di riferimento
I modelli di riferimento
• Il nuovo modello di riferimento TCP/IP
(Transmission Control Protocol / Internet
Protocol) (1974).
• Il modello ha quattro livelli:
• livello Host-rete: i pacchetti vengono inviati
lungo la rete
• livello internet: l’informazione è suddivisa in
pacchetti che possono essere inviati in maniera
indipendente e giungere in ordine diverso; si
definisce un protocollo IP tramite il quale si
“consegnano” i pacchetti dove devono andare.
• livello di trasporto: ci sono due protocolli; il
primo TCP controlla che la trasmissione delle
sequenze di byte avvengano senza errori, UDP
(User Datagram Protocol) viene utilizzato per
le trasmissioni veloci
• livello delle applicazioni: esso contiene tutti i
protocolli di alto livello tra cui ftp (per il
trasferimento di archivi), DNS (per la gestione
di nomi da associare agli indirizzi di rete), pop
e imap (per scaricare la posta), smtp (per
spedire), http (per le applicazioni del web);
17
I modelli di riferimento
• Un altro protocollo è Telnet (che rappresenta un
terminale virtuale con cui si può lavorare in
remoto) e che ora è stato sostituito dal
protocollo SSH (Secure SHell).
• Ad esempio:
ssh laura nomeserver.adt.unipd.it
(chiede una password per poter accedere alla
propria home)
Domain Name System
• Il Domain Name System è un protocollo
utilizzato per convertire il nome di un host
(nome simbolico più facile da ricordare) in un
indirizzo IP (risoluzione) e viceversa, convertire
un indirizzo IP (32 bit) in un nome di dominio
(risoluzione inversa).
• Un nome di dominio è composto da gruppi di
stringhe separate da punti: math.unipd.it . La
parte principale del nome è la stringa di destra,
ad esempio .it .org e si chiama dominio di primo
livello. Quando il nome è costituito da due parti
si parla di dominio di secondo livello: unipd.it .
Internet e il Web
Internet e il web
• Internet è una rete di calcolatori mondiale
ad accesso pubblico che rappresenta
attualmente uno dei principali mezzi di
comunicazione di massa o mass medium
(“mass media”).
• La locuzione “mass media” è l’unione del termine
inglese “mass” con la parola latina “media”,
plurale di “medium” (sia medium che media
pertanto
vanno
correttamente
pronunciati
all’italiana). Medium corrisponde a “mezzo” con il
suo doppio significato.
18
Internet e il Web
Internet e il Web
• Il World Wide Web, più spesso abbreviato in
Web e indicato con la sigla www e detto anche
“Ragnatela Mondiale”, è un servizio di
Internet e consiste in un insieme vastissimo di
documenti multimediali e di servizi
accessibili a tutti gli utenti di Internet.
• Le informazioni contenute nei vari server Web
diventano accessibili tramite applicazioni,
chiamate browser, che solitamente utilizzano il
protocollo HTTP (Hyper Testual Transfer
Protocol).
• Quando l’utente indica l’indirizzo numerico o
simbolico, il browser visualizza una pagina
Web; questa in realtà è un insieme di testi,
immagini, ed anche filmati sonori, a cui si
accede cliccando con il mouse su punti della
pagina che appaiono “attivi”.
• Ad ogni pagina sono collegate, attraverso dei
collegamenti, detti link, altri documenti che
possono risiedere sullo stesso server, ma anche
su server diversi. Questo passare da una pagina
ad un’altra permette di “navigare” nel Web.
Internet e il Web
• Un insieme di pagine collegate e relative ad un
argomento comune si chiama sito Web;
l’indirizzo di tale sito, ad esempio
http://www.studenti.math.unipd.it
o
il
corrispondente
indirizzo
numerico
147.162.84.215) viene chiamato URL (Uniform
Resource Locator).
Il motore di ricerca
Google
19
Google: il problema del page
ranking
Google: il problema del page
ranking
• Due studenti dell’Università di Stanford, Sergey
Brin e Larry Page, hanno dato vita a Google nel
1998, uno dei più importanti motori di ricerca nel
Web.
• La parola google deriva da googol, termine
“inventato” da Milton Sirotta nel 1938 (all’epoca
ragazzino e nipote di un matematico), per
indicare un numero seguito da 100 cifre zero.
• L’azienda che gestisce tale motore di ricerca ha
utilizzato questo nome per la vastità di
informazioni trattate.
• Uno dei problemi era:
• come ordinare le pagine presenti sul web in
base alla loro importanza? come definire
l’importanza?
• I due fondatori si ispirarono all’algoritmo
HyperSearch dell’italiano prof. Massimo
Marchiori, che all’epoca era ricercatore negli
USA e che attualmente insegna al Dipartimento
Matematica Pura ed Applicata dell’Università di
Padova.
Google: il problema del page
ranking
Google: il problema del page
ranking
• Si possono scegliere varie possibilità:
• il numero di volte che una parola viene cercata
• il numero di link che partono o arrivano a
quella parola
• il numero delle pagine importanti che
partono o arrivano alla pagina.
• L’idea di Page e Brin era che una pagina ha
una sua importanza che deriva dalle sue
connessioni (piuttosto che dal suo contenuto).
• L’importanza di una pagina si trasferisce in
parti uguali alle pagine che essa punta (una
persona importante dà importanza alle persone
che frequenta).
• L’importanza di una pagina è data dalla
somma dell’importanza che viene dalle pagine
che puntano ad essa (una persona è importante
se frequenta molte persone importanti).
20
Google: il problema del page
ranking
• Vediamo il modello matematico.
• Supponiamo che siano n le pagine del web, e
definiamo la matrice seguente:
H=
h11
h21
...
hn1
h12
h22
hn2
1
con
h1n
h2n
...
hnn
se c’è un link dalla pagina i alla pagina j
hij =
0 altrimenti
Google: il problema del page
ranking
• Esempio.
matrice:
Sia n = 4 e sia H la seguente
0
1
0
0
1
0
0
1
1
0
0
1
1
1
1
0
• Sommando i valori sulla riga i-esima si trova il
numero di link che partono dalla pagina i: ri
• Sommando i valori sulla colonna j si trova il numero
di pagine che puntano alla pagina i: cj.
Google: il problema del page
ranking
Google: il problema del page
ranking
• Indichiamo ora con xj l’importanza della pagina
j; risulta:
• Le pagine attive (odierne) sono oltre
n = 8.5 ×109
• Un sistema lineare con la regola di Cramer si
risolve con un numero di operazioni
dell’ordine di n!.
• Il metodo di eliminazione di Gauss risolve il
sistema con circa 2n3/3 operazioni.
• Se usassimo quest’ultimo avremmo un numero
di operazioni dell’ordine di:
2/3 × (8.5 109)3 ~4.1 × 1029
(miliardi di miliardi di miliardi) di operazioni
aritmetiche.
xj = h1j x1/r1 + h2j x2/r2 + … + hnj xn/rn
per j = 1, 2, 3, …, n
• Questo è un sistema lineare in n equazioni ed n
incognite. Le soluzioni x1, x2, …, xn forniscono il
livello di importanza delle n pagine: page rank.
• L’equazione usata in Google è un po’ diversa, perché
“pesata” con un parametro e le soluzioni che derivano
sono tutti valori compresi tra 0 e 1.
21
Google: il problema del page
ranking
Google: il problema del page
ranking
• Uno dei calcolatori più veloci al mondo è
attualmente il Blue Gene dell’IBM.
• Ha una velocità di circa 478 teraflops:
4.78×
×1014 operazioni al secondo
(1 tera = 1000 giga)
operazioni
• Per
eseguire
4.1×
×1029
impiegherebbe più di 27 milioni di anni.
• Come può essere se Page e Brin calcolano il
page rank ogni mese?
• Anche un calcolatore mille volte più veloce
non risolverebbe il problema.
• Esistono metodi numerici (metodi che costruiscono
soluzioni
approssimate
che
possono
essere
implementate sul calcolatore) con i quali si riesce a
risolvere il sistema lineare, in tempi più brevi.
• Si parte da una ipotetica soluzione, si stima un errore e
in maniera iterativa la si migliora; si costruisce così una
successione che converge indipendentemente dalla
approssimazione iniziale:
xj (1) , xj (2) , xj (3) , ….
xj
con un errore di approssimazione che risulta essere:
e(k) ≤ λk dove λ (0 < λ < 1) è il modulo del secondo
autovalore più grande di una certa matrice.
Google: il problema del page
ranking
• L’algoritmo è molto più efficiente: il numero
di prodotti e di somme dipende dal numero di
0 della matrice H, che solitamente sono molti
(la matrice è sparsa); se ci fossero circa 50
elementi non nulli su una riga, l’algoritmo
implementato sul calcolatore impiegherebbe
pochi secondi per trovare la soluzione.
• Questo è il metodo adottato in Google.
HTML
22
HTML
• Un sito Web è costituito da più pagine (testo,
immagini, video) collegate tra loro; volendo
costruire un sito per prima cosa occorre
pianificarne la struttura (Laganà, Righi,
Romani Cap.11)
• Uno dei linguaggi per la costruzione di siti
Web è HTML (HyperText Markup
Language).
• Il file che contiene il testo scritto in questo
linguaggio ha estensione .htm o .html
HTML
• Caratteristica del linguaggio è l’uso di tag,
parole chiave che indicano l’operazione che
deve essere eseguita sulla stringa che
racchiudono.
• I tag sono racchiusi tra parentesi angolari;
ognuno ha il suo corrispondente di chiusura
composto dal tag stesso preceduto dal
simbolo /.
HTML
HTML
• Ogni documento HTML inizia e termina con la
seguente coppia di tag:
<HTML>
…..
</HTML>
• Alcuni tag indicano l’inizio di una nuova riga
<BR> (andare a capo) o di un paragrafo <P>
(andare a capo e lasciare una riga bianca) e
non hanno necessariamente il tag di chiusura.
• Solitamente un documento è suddiviso in una
sezione di testa:
<HEAD>
</HEAD>
e un corpo:
<BODY>
</BODY>
• Nella sezione di testa si può inserire un titolo
che il browser (Mozilla, Explorer, …)
assegnerà al documento:
<TITLE>
</TITLE>
23
HTML
• Alcuni tag di uso frequente:
<CENTER> testo </CENTER >
• scrive il testo nella zona centrale della finestra
HTML
<B> … </B>
• grassetto
<LI> …
</LI>
• introduce un simbolo (un pallino o un numero)
per rappresentare un elenco (non ordinato o
ordinato); il tag per l’elenco ordinato è <OL>
per quello non ordinato <UL> con i rispettivi
tag di chiusura.
• Per introdurre caratteri speciali si deve scrivere
una codifica preceduta dal simbolo &
&gt
>
(parentesi del tag)
&lt
<
&egrave è
&Egrave È
&amp
&
HTML
HTML
• Si possono costruire dei livelli di intestazione
con dimensione di caratteri che diminuisce:
<H1> … </H1>
<H2> … </H2>
<H3> … </H3>
fino a 6 livelli.
• Si possono introdurre immagini
<IMG SRC="nomefile.jpeg">
• Collegamenti ad altre pagine. Il tag di
riferimento è
<A HREF=" posizione pagina">
visualizzazione del link </A>
• Per una pagina esterna si deve fornire
l’indirizzo
completo,
ad
esempio
http://www.nomedelsito
• Per una pagina locale, solo il nome del file.
• Vediamo un esempio.
24
HTML
<HTML>
<HEAD>
<TITLE>Pagina personale di
Mario Rossi </TITLE>
</HEAD>
<BODY>
<H1>
<IMG SRC="bandiera.jpeg">
HTML
<B> Nome:</B> Mario Rossi
(nato a ...., il 1 gennaio
2011)<BR>
<B>Indirizzo:</B> Via .....
<BR>
<B>Città :</B> da definire <BR>
HTML
<B><CENTER><FONT COLOR =
fuchsia> MARIO ROSSI
</FONT> </CENTER></B></H1>
<H2>
<B><CENTER><FONT
COLOR=green>futuro studente di
ingegneria</FONT> </CENTER></B>
</h2>
<P><BR>
<HR><BR>
HTML
<B>e-mail (per ora in
"prestito" ):</B>
<A HREF="mailto:
[email protected]">
[email protected]
</A>
<BR>
<HR>
<LI>
25
HTML
<B><A HREF=
"http://www.math.unipd.it/
~laurap/didattica/
Informatica-EN-0910/">
Corso di Informatica </A>
per Ingegneria dell'Energia
</B>
</LI>
<BR>
<HR>
<P>
Riepilogo
HTML
<P>
<LI>
<A HREF="pagina2.html">
<B>IMMAGINE</B></A>
</LI>
</BODY>
</HTML>
TDA e strutture di
dati
26
TDA
• Un Tipo di Dato Astratto è:
• un insieme di elementi chiamato dominio del
tipo di dato
• caratterizzato da un nome
• possiede delle funzioni che operano sul
dominio
• operatori, predicati, operatori di creazione
•
può avere delle costanti che lo caratterizzano
TDA
• Nel linguaggio Java i TDA :
• si definiscono in una interfaccia che dichiara
quali sono le funzioni che operano sul dominio
(cosa fa il TDA)
• si realizzano in una classe che definisce la
struttura di dati e le funzioni che operano su di
essa (come agisce il TDA).
TDA
TDA
• I seguenti TDA sono contenitori di
informazioni caratterizzati dalle loro diverse
funzioni :
• Questi
TDA
estendono
l’interfaccia
GenericContainer, un contenitore generico
che rappresenta una proprietà generale comune
a tutti i contenitori:
• un contenitore può essere vuoto (costante)
• un contenitore viene inizializzato come
contenitore vuoto
•
•
•
•
Pila o Stack
Coda o Queue
Lista
Dizionario e Tavola
27
Strutture di dati
Strutture di dati
• Una struttura di dati è un modo di
organizzare i dati in un contenitore ed ha una
sua propria modalità di accesso. Sono state
viste le seguenti strutture:
• L’accesso agli elementi dell’array è casuale,
vale a dire arbitrario, non prestabilito. Poiché
l’array ha dimensione fissa, si è utilizzata la
tecnica del raddoppio (riassegnando il
riferimento) per rappresentare sequenze di
lunghezza arbitraria.
• L’accesso agli elementi di una lista
concatenata è sequenziale.
• array (riempito in parte)
• ordinato
• non ordinato
• lista concatenata.
Strutture di dati
Pila o Stack (Last In First Out)
Array
Lista concatenata
diretto
i+1
sì*
info
sì
sequenziale
a.next
no
info e next
no
• Le operazioni coinvolgono solo il primo
elemento della Pila. Il TDA viene descritto
nella seguente interfaccia:
accesso
successivo
dimensione massima
spazio
spostamento dati
(inserire e cancellare)
(* senza raddoppio)
public interface Stack {
boolean isEmpty();
void push(Object x);
void pop(); //oppure Object pop();
Object top();
}
28
Pila o Stack (Last In First Out)
• Complessità delle funzioni
array
push
pop
top
O(1)
O(1)
O(1)
O(1)
O(1)
• Le operazioni coinvolgono il primo elemento
e l’ultimo elemento della Coda. Il TDA viene
descritto nella seguente interfaccia:
public interface Queue{
boolean isEmpty();
void enqueue(Object x);
void dequeue(); //oppure Object dequeue();
Object front();
}
(in media*)
lista
concatenata
O(1)
(* raddoppio)
Coda Queue (First In First Out)
• Complessità delle funzioni
enqueue
array
(circolare)
lista
concatenata
(* raddoppio)
O(1)
dequeue
front
O(1)
O(1)
O(1)
O(1)
(in media*)
O(1)
Coda o Queue (First In First Out)
Dizionario o Dictionary
• È costituito da coppie (chiave, attributo); la
chiave è unica e deve permettere il confronto.
Il TDA viene descritto nella seguente
interfaccia:
public interface Dictionary{
boolean isEmpty();
void insert(Comparable chiave, Object x);
Object find(Comparable chiave);
void remove(Comparable chiave);
}
29
Dizionario o Dictionary
• È un dizionario a chiave intera. Il TDA viene
descritto nella seguente interfaccia:
• Complessità delle funzioni:
array
(non ordinato)
array
insert *
O(1)
find
O(n)
remove
O(n)
(in media)
O(n)
O(log2n)
O(n)
O(1)
O(n)
O(n)
(ordinato)
lista
concatenata
Tavola o Table
public interface Tavola{
boolean isEmpty();
void insert(int chiave, Object x);
Object find(int chiave);
void remove(int chiave);
}
(*senza la ricerca per l’unicità della chiave che è O(n) o O(log2n))
• Nell’implementazione su array, se la chiave
coincide con l’indice, la ricerca è O(1).
Tavola Hash
Tavola Hash
• È un dizionario in cui si esegue una
trasformazione della chiave allo scopo di
ottimizzarne la memorizzazione e la
successiva ricerca:
• Si utilizzano assieme le due strutture dati
costruendo un array di liste concatenate
(bucket).
posizione = h(chiave)
• h : resto della divisione intera
• dim : dimensione della tavola
• Se le chiavi sono n e le liste hanno la stessa
lunghezza, le prestazioni sono O(n/dim).
chiave/dim
30
Java
• Un algoritmo rappresenta l’astrazione della
realtà.
Java
• Un
linguaggio
di
programmazione
rappresenta l’astrazione del processore.
• La variabile e il tipo della variabile
rappresentano l’astrazione della locazione di
memoria e delle operazioni sulla variabile.
Java
Java : compilatore e interprete
• Un Tipo di Dato Astratto (nuovo concetto) è
un tipo di dato che può essere definito
dall’utente, che descrive sia l’insieme degli
elementi del TDA (campi, forma) sia il
comportamento del TDA (metodi, proprietà).
• I linguaggi orientati agli oggetti permettono la
costruzione di TDA.
• Il linguaggio Java è dotato di un compilatore
che traduce il codice sorgente in un codice
binario, detto bytecode, e di un interprete,
Java Virtual Machine, che elabora ed esegue
il bytecode.
• Il linguaggio Java è un linguaggio di
programmazione ad alto livello orientato agli
oggetti.
• Il compilatore, durante la traduzione in codice
macchina, esegue una analisi lessicale,
sintattica e semantica.
31
Java Virtual Machine
Programma Java
• La macchina virtuale Java (JVM) è un
interprete che carica in memoria il bytecode,
esegue gli agganci con le classi delle librerie
standard (già compilate), interpreta ed esegue
il bytecode.
• Un programma Java è composto da una o più
unità compilabili: classi contenute in file di
estensione .java .
• Si hanno così efficienza (compilatore) e
portabilità, non solo a livello di codice
sorgente, ma anche a livello di bytecode.
• Ogni file sorgente può contenere una sola
classe con accesso pubblico il cui nome deve
coincidere con quello del file che la contiene.
• Il file in uscita dal compilatore ha estensione
.class
Alfabeto
Token
• L'alfabeto del linguaggio è UNICODE, a 16 bit.
• I primi 128 caratteri costituiscono il codice
ASCII.
• Si distinguono le lettere minuscole dalle
maiuscole.
• Lo spazio è un separatore.
• Le parole chiave (parole che hanno un
particolare significato per il linguaggio) sono
riservate, ossia non si possono usare come nomi
di identificatori.
• Le unità lessicali (token) con cui
costruiscono le frasi del linguaggio sono:
identificatori parole chiave costanti
separatori operatori
si
• Parole chiave, costanti, separatori e operatori
sono costruiti con i simboli del codice ASCII.
32
Tipi di dato in Java
• I tipi di dato sono:
• tipi base (primitivi, predefiniti):
• numeri, caratteri, valori logici
• riferimenti a oggetti
• Le variabili associate a questi tipi sono
memorizzate in una parte della memoria detta
Stack.
Tipo Intero
• Si possono rappresentare 2n -1 valori diversi.
• Costanti del tipo di dato: - 2n -1 e 2n -1 -1
che delimitano l’intervallo di rappresentazione.
In Java:
•
•
•
•
Byte.MIN_VALUE
Short.MIN_VALUE
Integer.MIN_VALUE
Long.MIN_VALUE
Byte.MAX_VALUE
Short.MAX_VALUE
Integer.MAX_VALUE
Long.MAX_VALUE
Tipo Intero
• A seconda dell’occupazione in byte si hanno i
seguenti tipi:
byte (1), short (2), int (4), long (8)
• Degli n bit a disposizione, il primo è il bit del
segno
0 positivi
1 negativi
• I rimanenti n-1 sono per il numero.
Tipo Intero
• Dato x, per trovare la sua rappresentazione r(x)
in base b (b=2) si divide per la base e si
prendono i resti.
• La rappresentazione dell'opposto r(-x) è
definita in complemento a 2
r(x) + r(-x) = 2n
• Per trovare la rappresentazione dell’opposto si
invertono tutti i bit di r(x) fatta eccezione degli
0 a destra e del primo 1 a destra (oppure: si
invertono tutti i bit e si aggiunge 1).
33
Tipo Reale
Mantissa
• A seconda dell’occupazione in byte si hanno i
seguenti tipi: float (4), double (8).
• I numeri reali sono rappresentati in modulo e
segno, riferiti alla base 2, con mantissa
normalizzata e bit nascosto.
• Dato x per costruire la rappresentazione r(x) si
deve trasformare in binario il numero reale:
parte intera: si divide per la base e si
prendono i resti
parte frazionaria: si moltiplica per la base e si
prendono e parti intere
• Dati n bit a disposizione il primo è il bit del
segno
0 positivi
1 negativi
• Dei rimanenti n-1 bit si ha una ripartizione tra
esponente e mantissa.
Mantissa
Esponente
• Si deve poi portare il numero binario in forma
normalizzata
1.c1c2c3.... × 2e
• Costanti del tipo di dato
minimo reale ≠ 0
float ~ 10 -38 (*)
massimo reale
float ~ 10 38
• L’esponente e viene rappresentato con
l’eccesso (in traslazione) vale a dire che e deve
essere aumentato, di 127 per i float (eccesso).
Il nuovo esponente (intero) viene trasformato
in binario.
• In Java
(* con mantissa non normalizzata 10 -45 )
Float.MIN_VALUE
Float.MAX_VALUE
Double.MIN_VALUE
Double.MAX_VALUE
34
Classi e oggetti
Classi e oggetti
• Java è un linguaggio orientato agli oggetti,
basato su classi.
• Per costruire un nuovo concetto dobbiamo
definire la sua forma (campi) e le sue proprietà
(metodi).
• Un oggetto è una entità che può essere usata
attraverso i metodi della classe.
• L’oggetto creato si chiama anche esemplare
della classe o istanza della classe.
• Per creare un oggetto si usa l’operatore new.
• La classe ci permette di descrivere il nuovo
concetto, con la definizione di campi e metodi.
• Per poter utilizzare il concetto si deve creare un
oggetto del tipo della classe.
• La variabile oggetto, il cui tipo è nomeclasse,
dopo l’attivazione dell’operazione new,
contiene il riferimento all’oggetto creato
(informazioni sulla posizione di memoria
dell’oggetto creato).
Campi
Interfaccia pubblica
• Gli oggetti stanno in una parte della memoria
detta Heap.
• Nella classe viene definita una interfaccia
pubblica costituita dall’insieme dei metodi
pubblici che permettono di utilizzare l’oggetto
dall’esterno.
• All’interfaccia pubblica appartiene anche il
costruttore, che inizializza l’oggetto al
momento della sua creazione.
• All’interno di una classe sono definiti campi e
metodi.
• I campi di una classe, chiamati anche campi di
esemplare o variabili di istanza; solitamente
sono dichiarati con accesso privato:
incapsulamento o protezione dei dati.
• Con l’incapsulamento, solo i metodi della
classe possono accedere ai campi.
• Astrazione: all’utente esterno è noto solo il
nome del metodo e il suo comportamento; si usa
l’oggetto senza conoscere la realizzazione dei
suoi metodi.
35
Tempo di vita e inizializzazione
delle variabili in una classe
All’interno di una classe ci sono:
Variabile di istanza
• Una variabile di istanza:
• Queste variabili hanno un diverso tempo di
vita e diverse modalità di inizializzazione.
appartiene all’oggetto
è visibile ai metodi della sua classe
viene inizializzata da un costruttore (default,
esplicitamente)
• viene creata, “nasce”, quando l’oggetto viene
creato
• viene eliminata, “muore”, quando l’oggetto
viene eliminato, ossia non è più
referenziato (garbage collector)
Variabile locale
Variabile parametro
• variabili di istanza (campi)
• variabili locali
• variabili parametro
Una variabile locale:
•
•
•
•
•
appartiene a un metodo
è visibile all’interno del metodo
deve essere inizializzata esplicitamente
viene creata, “nasce”, quando viene eseguito
l’enunciato in cui è definita
viene eliminata, “muore”, quando l’esecuzione
del programma esce dal blocco nel quale
è stata definita (che può anche essere
il metodo che l’ha definita)
•
•
•
Una variabile parametro (formale):
appartiene a un metodo
• è visibile all’interno del metodo
• viene inizializzata all’atto della invocazione del
metodo (con il valore fornito dall'invocazione)
• viene creata, “nasce”, quando viene invocato
il metodo
• viene eliminata, “muore”, quando l’esecuzione
del metodo termina
•
36
Variabile statica
• Una variabile statica viene creata quando la
JVM carica la classe per la prima volta ed
eliminata quando la classe viene scaricata (si
dice che “esiste sempre”).
• Si chiama anche variabile di classe perché
non appartiene ad un oggetto ma è di tutta la
classe (ce n’è un’unica copia).
• Viene inizializzata esplicitamente o con il
default (non nel costruttore).
Ereditarietà
• È un meccanismo che consente di costruire
una nuova classe che estende le funzionalità
di un’altra classe: si possono utilizzare metodi
e variabili di istanza della classe superiore,
senza accedere (conoscere) al codice dell’altra
classe (riusabilità del codice).
• Ogni classe deriva direttamente o non dalla
superclasse universale Object.
Specificatore di accesso
• Campi, metodi e classi hanno uno specificatore
di accesso che può essere:
• private: visibilità solo all’interno della classe
• public: visibilità al di fuori della classe
• protected: visibilità ai metodi della classe,
delle sue sottoclassi e delle classi
dello stesso pacchetto
• nessuna specifica: visibilità di pacchetto
Metodi nella sottoclasse
Un metodo della sottoclasse può:
• essere un nuovo metodo non presente nella
superclasse
• essere un metodo ereditato dalla superclasse
• essere un metodo della superclasse
sovrascritto nella sottoclasse
37
Cast: conversione forzata
Cast: conversione forzata
• Tipi base.
• Riferimenti.
• Si può eseguire l’assegnazione di una variabile
di un tipo superiore ad una di tipo inferiore:
• Si può eseguire l’assegnazione di un riferimento
di un oggetto di tipo superclasse ad un
riferimento di tipo sottoclasse:
vartipoinf = (tipo inferiore)vartiposup
• L’assegnazione inversa è automatica.
tiposottoclasse = (sottoclasse)tiposuperclasse
• L’assegnazione inversa è automatica.
Polimorfismo
Interfaccia
• È la proprietà in base alla quale il
comportamento di un metodo può variare in
relazione al tipo dell’oggetto che viene
effettivamente usato come parametro implicito
del metodo.
• È la JVM che decide durante l’esecuzione
quale metodo deve essere scelto: selezione
posticipata.
• Si parla di sovraccarico quando è il
compilatore che decide quale metodo dovrà
essere invocato: selezione anticipata.
• Rappresenta una proprietà astratta.
• Possiede solo le firme dei metodi.
• I suoi metodi sono automaticamente pubblici.
• Una classe che realizza un’interfaccia deve
implementare tutti i suoi metodi.
• Quando più classi realizzano l’interfaccia si ha
polimorfismo (ad esempio: nei TDA realizzati
su array e lista concatenata, Comparable, . . .).
38
Eccezioni
Memoria centrale: Stack e Heap
• Sono situazioni di possibili errori che possono
essere esterne al problema o dipendere da un
cattivo utilizzo dell’algoritmo.
• Le situazioni di errore devono essere previste e
gestite.
• Le eccezioni sono oggetti: la classe
dell’eccezione può estendere Exception (a
controllo obbligatorio) o RuntimeException.
• Le eccezioni possono essere catturate e si
eseguono istruzioni alternative, oppure lanciate
ed interrompono l’esecuzione del programma.
• Rappresentano parti diverse della memoria: Stack
(tipi base e riferimenti), Heap (oggetti, il garbage
collector mette in coda le aree liberate).
• Schema della disposizione degli indirizzi di memoria:
indirizzi di memoria crescenti
Codice di
Java
Memoria
programma RuntimeStack libera
lunghezza
cresce verso →
fissa
la memoria alta
Heap
← cresce verso
la memoria bassa
Memoria centrale: Stack e Heap
• La memoria centrale è pertanto divisa in tre
aree distinte o segmenti:
• il segmento statico che contiene il codice del
programma e le costanti,
• lo Stack (run time stack) utilizzato per
l’allocazione delle variabili locali create
all’interno di un blocco al momento della sua
attivazione,
• il segmento dinamico o Heap utilizzato per
contenere gli oggetti creati dinamicamente e
soggetto a garbage collection.
Algoritmi
39
Algoritmi
Strutture di controllo
• Un
algoritmo
(deterministico)
è
un
procedimento di soluzione costituito da un
insieme di operazioni eseguibili tale che: esiste
una prima operazione, dopo ogni operazione è
individuata la successiva, esiste un’ultima
operazione.
• La risoluzione avviene in due passi:
• Con le seguenti strutture di controllo si può
scrivere qualsiasi algoritmo:
• sequenza
• alternativa
• ciclo
• Queste strutture sono caratterizzate dall’avere
un unico punto di ingresso e un unico punto di
uscita.
• analisi, definizione del problema e progettazione
• codifica, trasformazione in un linguaggio
programmazione
di
Iterazione e Ricorsione
• La scomposizione in sottoproblemi può essere:
• iterativa:
• i sottoproblemi sono simili tra loro
• ricorsiva:
• almeno uno dei sottoproblemi è simile a quello
iniziale, ma di dimensione inferiore
• In entrambe le scomposizioni si pone il
problema della terminazione.
Divide et impera
• È una strategia
algoritmi:
generale per impostare
• suddividere l’insieme dei dati in un numero
finito di sottoinsiemi sui quali si può
operare ricorsivamente.
• Se la suddivisione in sottoinsiemi è bilanciata
(sottoinsiemi di uguale dimensione) si
ottengono algoritmi efficienti.
40
Complessità
Complessità
• L’efficienza di un algoritmo si valuta in base
all’utilizzo che esso fa delle risorse di calcolo:
memoria (spazio), CPU (tempo).
• Se la dimensione varia, il tempo può essere
stimato in maniera indipendente dal
linguaggio, dal calcolatore e dalla scelta di
dati, considerando il numero di operazioni
eseguite dall’algoritmo.
• Per valutare il tempo vero dovremmo
conoscere il tempo necessario per l’esecuzione
di ogni singola istruzione: il numero di
istruzioni macchina corrispondente ad una
istruzione nel linguaggio ad alto livello
dipende dal compilatore impiegato.
• Il tempo che un algoritmo impiega per
risolvere un problema è una funzione
crescente della dimensione n dei dati del
problema (dimensione o taglia).
Complessità computazionale
Andamento asintotico della
complessità
• Indicata con n (numero naturale) la
dimensione dei dati di ingresso, la funzione
F(n) che calcola il numero di operazioni viene
chiamata complessità computazionale e
utilizzata come stima della complessità di
tempo.
• Se F(n) è crescente con n e se si ha che:
F(n) → +∞
per n → +∞
date le semplificazioni per la valutazione di
F(n), si stima il comportamento della
funzione per n→+∞ utilizzando le seguenti
notazioni:
• Si fanno delle semplificazioni individuando
quali operazioni dipendono da n.
• O (o-grande)
• Ω (omega)
• Θ (theta)
limitazione superiore
limitazione inferiore
uguale andamento
41
Calcolo della complessità
Calcolo della complessità
• Nel calcolo della complessità si valuta il
comportamento dell’algoritmo su particolari
scelte di dati e si distinguono:
• Quando si scrive un algoritmo si deve sempre
dare una stima del caso peggiore e di quello
favorevole.
• un caso peggiore in cui l’algoritmo effettua il
massimo numero di operazioni,
• un caso favorevole in cui l’algoritmo effettua
il minimo numero di operazioni,
• un caso medio in cui l’algoritmo effettua un
numero medio di operazioni.
• Se la dimensione n dei dati non varia, la
funzione di complessità è costante.
Classi di complessità
Limiti inferiori e superiori
• Le funzioni di complessità sono distinte in
classi che rappresentano i diversi ordini di
infinito
• Ogni algoritmo determina una limitazione
superiore della complessità del problema.
O(1)
costanti
O(log (log n))
O(log n)
logarimto
O(n)
lineari
O(n*log n)
O(nk)
polinomi k = 2, 3, ...
O(n!), O(nn), O(an) esponenziali (a ≠ 0,1)
• Gli algoritmi con complessità esponenziale sono
impraticabili
• Se n si mantiene limitato le considerazioni
asintotiche non valgono.
• Cercare le limitazioni inferiori alla
complessità del problema vuol dire cercare
algoritmi più efficienti.
• Un algoritmo la cui complessità coincide con
la limitazione inferiore è detto ottimo.
42
Complessità di algoritmi
fondamentali
• Calcolo dell‘n-esimo numero di Fibonacci
f0 = 1
f1 = 1
fn = fn-1 + fn-2
definizione ricorsiva
iterazione con vettore
iterazione con scalari
moltiplicazione di matrici
matrice quadrati (ricorsione)
approssimazione numerica
tempo
O(2n)
O(n)
O(n)
O(n)
O(log2 n)
O(1)
n>1
spazio
O(n)
O(n)
O(1)
O(1)
O(1)
O(1)
Complessità di algoritmi
fondamentali
• Ordinamento
2
lineare
Θ(n /2)
bubblesort
O(n2 /2)
Ω(n) (con varianti)
inserimento
O(n2 /2)
Ω(n)
quicksort
O(n2 /2) O(n log2 n) anche medio
mergesort
Θ(n log2 n)
sempre
• Si può dimostrare che la limitazione inferiore della
complessità
nel problema dell’ordinamento è
Ω(nlog2n): mergesort è ottimo nel caso medio e
peggiore, quicksort è ottimo nel caso medio.
Complessità di algoritmi
fondamentali
• Ricerca
lineare
caso peggiore
O(n)
binaria
(vettore ordinato)
hash
(array di interi)
caso favorevole
Ω(1)
O(log2 n)
Ω(1)
O(1)*
Ω(1)
(in media)
(*dipende dalla dimensione dell’array e dalla funzione hash)
Un problema divertente:
il problema del torneo
• Questo problema interessò vari matematici tra i
quali Lewis Carrol, più noto per aver scritto
Alice nel paese delle meraviglie; egli lo propose
nella stagione tennistica inglese del 1883.
• In un torneo ad eliminazione diretta si affrontano
n giocatori: chi perde viene subito eliminato. Si
postula la transitività della bravura: se a perde
con b e b perde con c si conclude che a
perderebbe comunque con c.
43
Il problema del torneo
• Supposto n = 2k, i giocatori si affrontano a
coppie in una serie di n/2 incontri;
successivamente si affrontano i vincitori in una
nuova serie di n/4 incontri e così via fino ai
quarti di finale (8 giocatori), alle semifinali (4
giocatori) e alla finale (2 giocatori) che deciderà
il vincitore del torneo.
Tabellone di un torneo rappresentato su un
albero binario tra 24 = 16 giocatori
m è il vincitore
• Si può rappresentare il tabellone del torneo con
un albero binario, completo, con 2k foglie e di
profondità k.
Il problema del torneo
Il problema del torneo
• Un albero binario Bk completo possiede 2 -1
nodi dei quali 2k sono foglie (dimostrazione per
induzione), pertanto i nodi interni sono 2k-1,
vale a dire n-1.
• Gli incontri che vengono effettuati sono tanti
quanti i nodi interni.
k+1
• Questo problema è quello di determinare il
massimo in un insieme di n elementi, di cui
sappiamo occorrono n-1 confronti nei quali gli
elementi “non-massimi” risultano perdenti nel
confronto con il massimo.
• Il vincitore della finale è il vincitore del torneo.
Ma chi è il vero secondo?
• Se il “secondo in bravura” capita nella stessa metà
del tabellone del primo, verrà eliminato prima di
arrivare alla finale.
• Per non commettere ingiustizie bisogna far
eseguire un secondo torneo tra tutti coloro che
hanno perduto in un incontro diretto con il
primo.
• Questi giocatori sono k = log2n, perché k sono gli
incontri disputati dal vincitore (k profondità
dell’albero).
44
Girone di consolazione per il torneo
p è il secondo dopo m
Algoritmo del doppio torneo
• Eseguendo lo stesso algoritmo in k-1 (log2n -1)
incontri si determinerà il secondo.
• L’algoritmo del doppio torneo determina il
valore del primo e del secondo eseguendo un
numero di confronti uguale a
C(n) = n-1 + log2(n) -1 = n + log2(n) -2
per n = 16 C(n) = 18
Algoritmo del “primo e secondo”
se a[1] > a[2]
allora
altrimenti
primo ←
secondo ←
primo ←
secondo ←
a[1]
a[2]
a[2]
a[1]
//finese
per i da 3 a n
se primo < a[i]
allora secondo ← primo
primo ← a[i]
altrimenti se secondo < a[i]
allora secondo ← a[i]
//finese
// finese
//fineper
Algoritmo del “primo e secondo”
• L’algoritmo, che determina il valore del primo e
del secondo, esegue invece nel caso peggiore (il
massimo è in uno dei primi due posti, per cui si
deve sempre eseguire anche il secondo
confronto) un numero di confronti uguale a
C(n) = n-1 + n-2 = 2n -3
per n = 16
C(n) = 46
• Nel caso favorevole (ordine crescente in un
array) C(n) = n-1.
45
Algoritmo del doppio torneo
• Si può dimostrare che, nel problema della
determinazione del primo e del secondo, il
limite inferiore dei confronti
nel caso
peggiore è
Ω(n + log2(n) -2)
• Pertanto l’algoritmo del doppio torneo è
ottimo nel caso peggiore.
46