Fondamenti di Informatica II - Secondo Modulo
A.A. 1999/00 - Esercizio d'esame - prima parte

Problema 1  Una società che offre servizi su internet (provider) gestisce diversi clienti abbonati. La specifica del tipo astratto ``provider'' è:

TipoAstratto Provider
Commento
ogni valore del tipo rappresenta una società che offre servizi su internet
Sorte
Pro (sorta per il dominio di interesse),    Cliente sorta per il dominio dei clienti
Funzioni
  
Crea : () ===> Pro
precondizioni e postcondizioni per Crea() = p
pre: nessuna
post: p è una società che non ha clienti abbonati
NumeroClienti : (Pro) ===> Intero
precondizioni e postcondizioni per NumeroClienti(p) = i
pre: nessuna
post: i è il numero di clienti di p
AggiungiCliente : (Pro, Cliente) ===> Pro
precondizioni e postcondizioni per AggiungiCliente(p,c) = r
pre: nessuna
post: se c non è presente in p, r è la società ottenuta da p aggiungendo il cliente c, che è identificato dal numero NumeroClienti(p) + 1; altrimenti, r è uguale a p
DammiCliente : (Pro,Intero) ===> Cliente
precondizioni e postcondizioni per DammiCliente(p,i) = c
pre: 1 <= i <= NumeroClienti(p)
post: c è l'i-esimo cliente di p
FineTipoAstratto

Domanda 1   Scrivere la definizione (solo file.h) di una classe C++ Provider che realizzi il tipo astratto Provider in modo da rendere DammiCliente il più efficiente possibile. Si assuma l'esistenza della classe Cliente, così specificata

class Cliente
{public:
  Cliente(int d);            // costruisce un cliente che ha bisogno di d KByte di memoria
  int DammiRichiesta();      // restituisce il numero di KByte di cui il cliente ha bisogno
  // non interessa il resto
};
Si discuta la complessità di ciascuna delle funzioni del tipo astratto.

Domanda 2   Il provider deve decidere di quali clienti soddisfare la richiesta di memoria. La decisione deve essere presa sulla base dei seguenti criteri:

Il ``problema dell'assegnazione di memoria'' è definito nel seguente modo. Avendo come input si deve decidere di quali clienti del provider p soddisfare la richiesta.

Si risolva detto problema utilizzando la tecnica greedy (o golosa), discutendo brevemente la suddivisione in stadi della generico elemento dello spazio di ricerca utilizzato (cioè la strutturazione della soluzione astratta) ed il criterio di scelta greedy adottato. Scrivere una funzione che risolva il problema mediante l'algoritmo generico Greedy.