• Non ci sono risultati.

Corso di Algoritmi e Strutture Dati—Informatica per il Management Terzo Esercizio di Programmazione, 11/03/2011

N/A
N/A
Protected

Academic year: 2021

Condividi "Corso di Algoritmi e Strutture Dati—Informatica per il Management Terzo Esercizio di Programmazione, 11/03/2011"

Copied!
2
0
0

Testo completo

(1)

Corso di Algoritmi e Strutture Dati—Informatica per il Management

Terzo Esercizio di Programmazione, 11/03/2011

Descrizione dell'esercizio

Supponiamo di conoscere (in anticipo!) le quotazioni di borsa dei prossimi n giorni. In particolare, per ogni i=1, …, n conosciamo il prezzo A[i] a cui è possibile acquistare le azioni ACME inc. il giorno i. Il prezzo di vendita V[i] al giorno i è sempre inferiore di 0.5 rispetto al prezzo di acquisto, ossia V[i] := A[i] – 0.5. Armati di tali informazioni, vogliamo determinare i giorni i, j con 1≤i≤j≤n tali che acquistando le azioni al giorno i e rivendendole al giorno j, il guadagno unitario G(i, j) :=

V[j] – A[i] sia il massimo possibile. Si noti che è possibile vendere le azioni lo stesso giorno in cui vengono acquistato, oppure in un qualsiasi giorno successivo; non è possibile vendere azioni prima di averle acquistate.

Il progetto consiste nello sviluppo di un programma Java di complessità ottima che, dati i prezzi di acquisto come specificato a breve, stampa a video il guadagno unitario massimo; non è richiesta la stampa dei giorni in cui acquistare e vendere le azioni per ottenere il guadagno di cui sopra. Il programma deve implementare un algoritmo di costo O(n).

Il programma deve essere implementato in un file sorgente Java chiamato NomeCognome.java che deve contenere una unica classe pubblica NomeCognome. La pagina web del corso (http://www.moreno.marzolla.name/teaching/ASD2010/ ) contiene lo schema da usare. Ad esempio, nel mio caso il file si chiamerà MorenoMarzolla.java e conterrà una singola classe pubblica

“MorenoMarzolla”. Il programma verrà compilato con il comando:

javac NomeCognome.java ed eseguito nel modo seguente:

java -cp . NomeCognome nomefile

dove “nomefile” rappresenta il nome di un file di testo avente la struttura seguente:

la prima riga contiene il valore dell'intero n;

a questa riga, seguono n righe ciascuna delle quali contiene il prezzo di acquisto A[i]

espresso come numero reale.

Ad esempio, il file di input potrebbe avere il contenuto seguente:

5 12.3 16.5 19.6 11.2 17.9

Nell'esempio di cui sopra, acquistando le azioni al giorno 1 al prezzo di 12.3 e rivendendole al giorno 4 al prezzo di 11.2-0.5 = 10.7 si avrebbe un guadagno (negativo!) di -1.5. Il guadagno massimo si ottiene acquistando il primo giorno al prezzo di acquisto di 12.3 e rivendendo al terzo giorno al prezzo di vendita di 19.6-0.5 = 19.1; il guadagno massimo è pertanto 19.1-12.3 = 6.8.

A titolo di esempio, nella pagina del corso è presente un file di esempio (con l'indicazione del risultato che l'algoritmo deve stampare).

Cosa consegnare

L'esercizio va svolto individualmente (non sono ammessi lavori di gruppo). La consegna va

(2)

effettuata via mail, inviando un messaggio al docente ([email protected]) con titolo: “ASD2010 Progetto 3” entro le ore 12:00 di mercoledì 30 marzo 2011. Riceverete un messaggio di conferma (non necessariamente immediato).

La mail deve provenire dal vostro account istituzionale (@cs.unibo.it, oppure @studio.unibo.it) e deve contenere il vostro cognome, nome e numero di matricola. Per coloro che usano il dominio

@studio.cs.unibo.it, si presti attenzione a disabilitare il filtro antispam in quanto è probabile che la mia mail di risposta venga erroneamente inserita nella posta indesiderata.

Alla mail va allegato il sorgente Java (non compresso) del programma. È richiesto di realizzare l'applicazione con un singolo file sorgente <NomeCognome>.java secondo il template nella pagina web del corso. Il codice deve essere opportunamente commentato illustrando a parole l'algoritmo implementato e il suo costo computazionale. Il software consegnato deve essere compilabile ed eseguibile sulle macchine Linux del laboratorio studenti.

Modalità di valutazione

Ciascun progetto verrà valutato un punto (che verrà sommato al voto finale della prova scritta, o alla media dei parziali) solo se tutte queste condizioni saranno soddisfatte:

Il progetto è stato consegnato entro la scadenza. Sia la mail di consegna che il sorgente Java devono indicare chiaramente cognome, nome e numero di matricola dell'autore. In nessun caso verrà accettata una consegna oltre la scadenza.

Il programma compila ed esegue correttamente sulle macchine Linux del laboratorio studenti; non è richiesto che i risultati riportati nel grafico siano misurati sulle macchine del laboratorio.

L'implementazione è corretta, e l'algoritmo implementato ha complessità ottima. La correttezza verrà valutata mediante ispezione del codice sorgente, e mediante l'esecuzione del programma su opportuni file di input.

Il materiale allegato è frutto del lavoro individuale di chi consegna; è consentito l'uso di codice open source disponibile in rete o tramite altre fonti, ma è obbligatorio indicare nei commenti del codice la fonte di provenienza.

Riferimenti

Documenti correlati

Il limite inferiore Ω(n log n) vale per tutti gli algoritmi di ordinamento generali, ossia per algoritmi che non fanno alcuna ipotesi sul tipo degli elementi della sequenza

Scrivere la funzione ricorsiva printGreaterKeys(u, a) che, data la radice u di un BST, un valore a di chiave, stampa in ordine tutte le chiavi dell’albero maggiori della chiave

In aggiunta ai “tipi” predefiniti dal linguaggio il programmatore può definire dei nuovi tipi, come vedremo in seguito questo risulta molto comodo lavorando con i puntatori e

È evidente come possa essere facilmente realizzata una soluzione algoritmicamente molto più elegante: listareverse2.pas: in questo caso l’inserimento invece che avvenire in coda

Utilizzando le pile, si scrivano tre procedure Pascal iterative di complessità ottima per effettuare, rispettivamente, le visite anticipata, differita e simmetrica di un albero

Si progettino un algoritmo euristico di tipo greedy ed uno di ricerca locale per risolvere il problema della BISEZIONE in forma di ottimizzazione: “Dato un grafo non orientato G =

Si scriva una procedura Pascal, basata sulla ricerca binaria, per individuare in tempo O(log n) l’unico intero dell’intervallo 1..n+1 che non compare in V.... Si scriva

Scrivere un algoritmo ricorsivo di tipo divide-et-impera che, dato un array A[1..n] di valori reali, restituisce true se e solo se A è ordinato in senso non decrescente, cioè se A[1]