Cosa sono gli algoritmi?
Upcoming SlideShare
Loading in...5
×
 

Cosa sono gli algoritmi?

on

  • 1,709 views

 

Statistics

Views

Total Views
1,709
Views on SlideShare
1,709
Embed Views
0

Actions

Likes
0
Downloads
6
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Cosa sono gli algoritmi? Cosa sono gli algoritmi? Presentation Transcript

  • Corso di Didactics of Computer Science a.a. 2011/2012 Valeria Mattuzzi
  • Definizione di algoritmoUn algoritmo è un insieme finito ed ordinato di passi nonambigui, che specificano le operazioni eseguendo le quali sirisolve una classe di problemiIl termine algoritmo, che significa “procedimento di calcolo”, èuna versione moderna del termine latino medievale algorismus.Il termine algorismus deriva dal matematico persiano Al-Khwarizmi, del IX secolo d.C.In altre parole, un algoritmo è la descrizione precisa di unprocedimento valido per la risoluzione di un problemaattraverso un numero finito di passi. Un problema risolvibilemediante un algoritmo si dice computabile
  • Il primo algoritmo Il primo algoritmo di cui si abbia documentazione si trova nel papiro egiziano di Ahmes, risalente circa al 1650 a.C. e conservato al British Museum di Londra Il papiro contiene un algoritmo per la moltiplicazione. Tale algoritmo viene usato tuttora nei circuiti delle unità aritmetico/logiche dei calcolatori elettronici
  • Proprietà degli algoritmiLe proprietà principali di un algoritmo sono: finitezza; lalgoritmo deve essere composto da un numero finito di passi non ambiguità; i passi costituenti lalgoritmo devono essere interpretabili in modo univoco dallesecutore sia esso umano o artificiale terminazione; lesecuzione deve terminare dopo un tempo finito eseguibilità; gli informatici utilizzano il termine efficace per indicare il concetto di essere eseguibile.
  • Natura astratta degli algoritmi Distinzione tra algoritmo e la sua rappresentazioneTale distinzione è analoga a quella tra una storia e un libro. Unastoria è astratta o concettuale; mentre, un libro è una“rappresentazione fisica” della storia. Allo stesso modo, unalgoritmo è astratto e distinto dalla sua rappresentazione Distinzione tra programma e processoUn programma è la rappresentazione di un algoritmo; mentre, unprocesso è lattività di esecuzione di un algoritmo.Programmi, algoritmi e processi sono entità distinte, ma correlate.
  • Rappresentazione algoritmica PrimitiveLo stesso algoritmo può essere rappresentato in vari modi: formula, sequenza di istruzioni, disegno, a parole... a diversi livelli di astrazioneEsempio: a destra è riportato unalgoritmo, che usa il linguaggiodelle figure, per costruire unuccello con un pezzo di cartaquadrato
  • Rappresentazione algoritmica PrimitiveTuttavia, molti canali di comunicazione presentano spesso unaterminologia che ha più di un solo significato nascono così problemi di comunicazioneOgni rappresentazione si basa su un insieme di primitive bendefinite, comprensibili dallesecutoreSe lesecutore è un computer, una collezione di primitive perdescrivere un algoritmo, insieme alle regole per comporle,costituisce un linguaggio di programmazioneOgni primitiva ha una propria sintassi (rappresentazionesimbolica) e semantica (significato)
  • PseudocodicePermette una rappresentazione informale degli algoritmiÈ un linguaggio di programmazione fittizio, non direttamentecomprensibile da un programma compilatore o interpreteLa progettazione di questo tipo di formalismo è volta allacomprensibilità e alla leggibilità del codice; la sintassi saràquindi meno rigorosa rispetto ad un vero linguaggio
  • Primitive dello pseudocodice AssegnamentoSintassi: nome espressioneEffetto: “associa” a nome il valore ottenuto valutandoespressione. Successivamente nome può essere usato perrichiamare quel valorePossiamo pensare a nome come ad una scatola (cella dimemoria) in cui mettiamo il valore
  • Primitive dello pseudocodice Selezione condizionaleSintassi: If condizione then azione else azioneSignificato: Si valuta la condizioneSe il risultato è true si esegue lazione dopo thenSe il risultato è false si esegue lazione dopo elseEsempio:if (lanno è bisestile) then (totaleGiornaliero ← totale/366) else (totaleGiornaliero ← totale/365)
  • Primitive dello pseudocodice IterazioneSintassi: while condizione do attivitàSignificato: Si valuta la condizioneSe il risultato è true si esegue lattività, quindi si riesegue tutto il whileSe il risultato è false si termina lesecuzioneEsempio:while (ci sono biglietti da vendere) do (vendi un biglietto)
  • Primitive dello pseudocodice ProcedureUna procedura associa delle azioni da eseguire a un nome. Ecome definire una nuova primitiva.Esempio: procedure Saluti contatore ← 3 while (contatore > 0) do (stampa il messaggio “Saluti”; contatore ← contatore - 1)Effetto procedura: stampa tre volte la stringa “Saluti”
  • Primitive dello pseudocodice ProcedureLimportanza e la praticità di una procedura sta nel fatto chepuò essere “chiamata” in diversi punti del programmaEsempio: if (lospite è simpatico) then (esegui la procedura Saluti) else (...)Per renderle più flessibili, le procedure possono avereparametri (o nomi generici). Un parametro viene usato comese fosse un valore nella procedura. Quando si esegue laprocedura va fornito un valore per il parametro.Esempio: procedure Salutibis (contatore) while (contatore > 0) do (stampa il messaggio “Saluti”; contatore ← contatore - 1)
  • Passi per la risoluzione di problemi1. Comprendere il problema2. Progettare una soluzione (algoritmo)3. Realizzare lalgoritmo (scrittura del codice)4. Valutare lefficienza e laccuratezza dellalgoritmo trovatoOsservazioni: Le fasi riportate sopra non sono necessariamente in sequenza Si potrebbe anche sostenere che non si ha una vera comprensione del problema fintanto che non si arriva a una soluzione del problema stesso. Il fatto che un problema sia irrisolto implica una mancanza di comprensione.
  • Risolvere problemi (Problem Solving)Come si risolvono problemi?La capacità di risolvere problemi è unabilità artistica da svilupparepiuttosto che una scienza esatta da imparare "Una grande scoperta risolve un grande problema, ma nella soluzione di qualsiasi problema cè un pizzico di scoperta. Il tuo problema può essere modesto, ma se stimola la tua curiosità, tira in ballo la tua inventiva e lo risolvi con i tuoi mezzi, puoi sperimentare la tensione e gioire del trionfo della scoperta" G.Polya, matematico ungherese (1887 - 1985)
  • Getting a foot in the doorCi sono numerosi approcci per risolvereproblemi. Esiste un filo conduttore che liaccomuna ed è detto getting a foot in thedoor.Esempio:Problema: Prima di iniziare una corsa, A,B,C,D fanno le seguenti previsioni:A prevede che B vincerà; B prevede che D sarà lultimo;C prevede che A arriverà terzo; D prevede che la predizione di A sarà corretta.Solo una di queste previsioni è vera e quella è la previsione fatta dal vincitore.Chi vincerà la gara?Soluzione: Poichè le previsioni di A e D sono equivalenti, sono entrambe false(il vincitore è uno solo). A questo punto abbiamo a foot in the door. Se laprevisione di A è falsa, allora B non ha vinto. Dunque il vincitore è C.
  • Alcune tecniche per risolvere problemi Provare a risolvere un problema analogo più semplice Usare la tecnica di raffinamento, detta anche divide et impera, che consiste nel suddividere il problema in sottoproblemi più semplici da risolvere Tale tecnica segue una metodologia top-down, in quanto va dal generale allo specifico Usare la metodologia bottom-up, che consiste nel cominciare a risolvere sottoproblemi del problema dato ed estendere poi le soluzioniIn generale, risolvere un problema richiede una forma di creatività:è una forma di arte
  • Strutture iterative Algoritmo di ricerca sequenziale Problema: trovare un algoritmo che verifichi che un particolare valore (target value) è presente in una lista data. Se il valore è nella lista, la ricerca è stata un successo; altrimenti, un fallimento Soluzione: si scorre la lista dallinizio, confrontando ogni voce (test entry) con target value. Se si raggiunge la fine dellelenco senza trovare target value, la ricerca è stata un fallimento.Un algoritmo di questo tipo è detto algoritmo di ricercasequenziale. A causa della sua semplicità, è spesso utilizzato perliste brevi; infatti, nel caso di lunghi elenchi, ricerche sequenzialinon sono così efficienti come altre tecniche
  • Strutture iterative Algoritmo di ricerca sequenzialeprocedure ricerca (Lista, TargetValue)if (Lista vuota) then (Dichiarare la ricerca un fallimento) else (Selezionare la prima voce nella lista come TestEntry; while ( TargetValue > TestEntry e rimangono voci da considerare) do (seleziona la voce successiva nella lista come TestEntry) if (TargetValue = TestEntry) then (Dichiarare la ricerca un successo) else (Dichiarare la ricerca un fallimento) ) end if
  • Strutture iterative Strutture di controllo iterativeUn metodo per implementare un uso ripetitivo di unistruzione o unasequenza di istruzioni è una struttura iterativa detta loop (ciclo), nellaquale un insieme di istruzioni, chiamate corpo del ciclo, vengonoeseguite in modo ripetitivo sotto la direzione di alcuni control processVi sono due importanti strutture ad anello: while (condizione) do (corpo del ciclo) repeat (corpo del ciclo) until (condizione)Differenze: Il corpo del repeat viene sempre eseguito almeno una volta Il repeat termina quando la condizione è vera
  • I diagrammi di flussoI diagrammi di flusso sono unalternativa allo pseudocodice perrappresentare algoritmi in modo informale ma preciso.Struttura del while: diagramma di Struttura del repeat: diagramma diflusso flusso
  • Strutture iterative Algoritmo di ordinamento per inserimentoProblema: trovare un algoritmo che riordini in ordine alfabetico laseguente lista Fred, Alex, Diana, Byron, CarolSoluzione: La sottolista costituita dai primi due nomi non è ordinata. Si prende la scheda contenente Alex, si fa scorrere il nome Fred verso il basso nello spazio dove cera Alex e si posiziona poi il nome Alex nel buco Ora i primi due nomi formano una sottolista ordinata, ma i primi tre no. Così si può prendere il terzo nome, Diana, si fa scorrere il nome di Fred giù nel buco dove cera Diana e si inserisce Diana nel buco lasciato da Fred. Le prime tre voci dellelenco sono così ordinate Si prosegue in maniera analoga e si ottiene un elenco in ordine alfabetico
  • Strutture iterativeAlgoritmo di ordinamento per inserimento Si osserva che ciascuna riga della figura riportata rappresenta lo stesso procedimento e che esso viene solamente ripetuto più volte. In altre parole, il programma ordina lelenco più volte rimuovendo una voce e inserendola nella sua corretta posizione. É per questo che si parla di ordinamento per inserimento
  • Strutture ricorsive Algoritmo di ricerca binaria Un algoritmo di ricerca binaria individua un valore desiderato allinterno di un insieme ordinato di datiProblema: trovare un algoritmo che individui una particolare vocein una lista ordinataSoluzione: Si seleziona la “middle entry” nella lista, cioè la prima voce della seconda metà dellelenco. Se la “middle entry” è il valore cercato, la ricerca è stata un successo. Altrimenti, possiamo limitare la nostra ricerca alla prima o ultima metà della lista. Si prosegue in maniera analoga per la parte rimanente di lista
  • Strutture ricorsive Algoritmo di ricerca binariaEsempio: Nella lista data cercare la parola John
  • Strutture ricorsive Algoritmo di ricerca binariaIn pseudocodiceprocedure Search (lista, targetvalue)if (lista vuota) then (Affermare che la ricerca e stata un fallimento) else (selezionare middle-entry come Testentry; Eseguire il caso seguente appropriato. Caso 1: TargetValue = Testentry (Affermare che la ricerca e stato un successo) Caso 2: TargetValue < Testentry (Applicare la procedura Search per vedere se il TargetValue e nella porzione della lista precedente a Testentry e riportare il risultato della ricerca) Caso 3: TargetValue > Testentry (Applicare la procedura Search per vedere se il TargetValue e nella porzione della lista successiva a Testentry e riportare il risultato della ricerca) ) end if
  • Strutture ricorsive Strutture di controllo ricorsiveLalgoritmo di ricerca binaria è simile a quello di ricercasequenziale, poiché entrambi gli algoritmi richiedonolesecuzione di un processo ripetitivo.Tuttavia, lattuazione di questa ripetizione è molto diversa. Laricerca sequenziale comporta una forma circolare di ripetizione,mentre la ricerca binaria esegue ogni fase della ripetizionecome una sottoattività della fase precedente. Questa tecnica ènota come ricorsione.I sistemi ricorsivi dipendono da una condizione di terminazionedetta base case o degenerative case
  • Efficienza degli algoritmiAnche se le macchine di oggi sono in grado di eseguire milionidi istruzioni al secondo, lefficienza rimane una delleprincipali preoccupazioni nella progettazione di algoritmi.Spesso la scelta tra algoritmi efficienti e non efficienti può farela differenza tra una soluzione pratica al problema e unaimpraticabile.Ci sono diverse misure per valutare la “bontà” di un algoritmoNormalmente siamo interessati al costo dellesecuzionedellalgoritmo o in termini del tempo impiegatodallesecuzione o dallo spazio di memoria occupato dalle variestrutture dati necessarie per lesecuzione
  • Analisi dellalgoritmo di ordinamento per inserimentoEsempio: Consideriamo una lista di n termini e lalgoritmo diordinamento per inserimento analizzato sopra.Poichè lattività di confronto tra due voci domina lalgoritmo, ilnostro approccio sarà quello di contare il numero di tali confrontiche vengono eseguiti durante lordinamento della lista Nel miglior caso possibile, si devono eseguire n – 1 confronti Nel caso peggiore, cioè quando lelenco originale è in ordine inverso, si devo effettuare 1 + 2 + 3 + … + (n – 1) = ½ (n² – n) confrontiIl numero di confronti effettuati durante lesecuzione dellalgoritmofornisce unapprossimazione della quantità di tempo necessaria pereseguire lalgoritmo
  • Analisi dellalgoritmo di ordinamento per inserimento Come si vede dal grafico, nel caso peggiore, il tempo impiegato per eseguire lalgoritmo aumenta in maniera esponenziale se aumenta n Quindi lalgoritmo diventa meno efficiente più la dimensione della lista aumenta
  • Analisi dellalgoritmo di ricerca binaria Il grafico a fianco rappresenta lanalisi dellalgoritmo di ricerca binaria nel caso peggiore. Si osserva che lalgoritmo di ricerca binaria diventa più efficiente man mano che la lunghezza della lista aumenta.
  • La notazione big-thetaPoichè la forma del grafico ottenuto riflette lefficienza dellalgoritmo,è comune classificare gli algoritmi secondo le forme di questi grafici,basati sullanalisi del caso peggiore. La notazione utilizzata peridentificare queste classi è talvolta chiamata “big-theta notation”Tutti gli algoritmi i cui grafici hanno la forma di una parabola, comel algoritmo di ordinamento per inserimento, vengono posti nellaclasse rappresentata da Θ(n²)Tutti gli algoritmi i cui grafici hanno la forma di una espressionelogaritmica, come la ricerca binaria, rientrano nella classerappresentata da Θ(ln(n))Conoscere la classe in cui un particolare algoritmo cade ci permette diprevedere le sue prestazioni e di confrontarle con altri algoritmi cherisolvono lo stesso problema
  • Correttezza degli algoritmiImportante è la distinzione tra programma che si crede essere correttoe un programma che è correttoSi è cercato di applicare le tecniche di logica formale per dimostrarela correttezza di un programma, cioè il fatto che lalgoritmorappresentato da un programma faccia quello che è destinato a fareUna prima prova di correttezza inizia con lassunzione che certecondizioni, chiamate precondizioni, siano soddisfatte alliniziodellesecuzione del programmaSecondo passo in una prova di correttezza è quello di considerare inche modo le conseguenze di queste precondizioni si propagano nelprogramma
  • Correttezza degli algoritmiUna dimostrazione di correttezza procede poi identificandoasserzioni che possono essere stabilite in vari punti del programma.Ognuna di esse è conseguenza delle precondizioni del programma edellinsieme di istruzioni che portano al punto in cui è stabilitalasserzione.Se lasserzione stabilita alla fine del programma corrisponde allepostcondizioni desiderate, possiamo concludere che il programma ècorretto.I progressi nello sviluppo di tecniche per verificare la correttezza diun programma continuano ad essere una sfida. Uno dei progressi piùsignificativi si ha nel linguaggio di programmazione SPARK,strettamente legato alla lingua Ada. Un programma scritto in SPARKnon contiene solo lalgoritmo da applicare, ma anche le informazioninecessarie per lapplicazione della dimostrazione formale dicorrettezza.
  • Correttezza degli algoritmiUna dimostrazione di correttezza procede poi identificandoasserzioni che possono essere stabilite in vari punti del programma.Ognuna di esse è conseguenza delle precondizioni del programma edellinsieme di istruzioni che portano al punto in cui è stabilitalasserzione.Se lasserzione stabilita alla fine del programma corrisponde allepostcondizioni desiderate, possiamo concludere che il programma ècorretto.I progressi nello sviluppo di tecniche per verificare la correttezza diun programma continuano ad essere una sfida. Uno dei progressi piùsignificativi si ha nel linguaggio di programmazione SPARK. Unprogramma scritto in SPARK non contiene solo lalgoritmo daapplicare, ma anche le informazioni necessarie per lapplicazionedella dimostrazione formale di correttezza.