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