• Non ci sono risultati.

Laboratorio di Algoritmi e Strutture Dati ESONERO PARZIALE 8/11/2001 (Compito A)

N/A
N/A
Protected

Academic year: 2021

Condividi "Laboratorio di Algoritmi e Strutture Dati ESONERO PARZIALE 8/11/2001 (Compito A)"

Copied!
3
0
0

Testo completo

(1)

Laboratorio di Algoritmi e Strutture Dati ESONERO PARZIALE 8/11/2001

(Compito A)

PARTE A: Test a risposta multipla (barrare tutte le risposte corrette)

A.A.1) Si consideri il seguente programma per il calcolo della potenza n-esima di un binomio mediante la formula (a+b)

n

= Σ

k=0, …, n

[n:k]a

k

b

n-k

.

// calcola il coefficiente binomiale [n:k]

int coeffbin(int n, int k) {

int temp1, temp2;

if ((0 <= k) && (k <= n)) if ((k==0) || (k==n))

return(1);

else {

temp1 = coeffbin(n-1, k-1);

temp2 = coeffbin(n-1, k);

return (temp1 + temp2);

}

else

return (-1) ; /* come messaggio di errore */

}

void binpower() {

int n;

float a, b, auxa, auxb, res;

int k, j;

scanf ("%d %f %f", &n, &a, &b);

if ( n < 0 ) {

printf("errore: esponente negativo");

exit(0);

} else {

res = 0.0;

for (k=0; k<=n; k++) { auxa = auxb = 1.0;

/* calcola a^k */

for (j=1; j<=k; j++) auxa = a * auxa ; /* calcola b^(n-k) */

for (j=1; j<=n-k ; j++) auxb = b * auxb ;

res = res + (coeffbin(n, k)*auxa*auxb );

}

printf ("\n\n n = %d \n a = %f \n b = %f \n res = %f ", n, a, b, res);

} }

la complessità asintotica del programma nel caso peggiore è:

Θ(n) c

Θ (n

2

) c

Θ (n

3

) c

Θ (n

2

log (a+b)) c

altro c

A.A.2) Si consideri il seguente input per l’algoritmo heap_sort: <3, 1, 4, 7, 6, 5, 8>

Dopo aver costruito l’heap, quali delle seguenti sequenze parziali sono ottenute dall’algoritmo? (la prima

sequenza rappresenta l’heap, la seconda rappresenta l’array parziale ordinato)

(2)

<7, 4, 5, 1, 6, 3>; <8> c

<7, 6, 5, 1, 4, 3>; <8> c

<6, 4, 5, 1, 3>; <7, 8> c

<6, 5, 3, 1, 4>; <7, 8> c

A.A.3) Si consideri il seguente input per l’algoritmo insertion_sort: <3, 1, 4, 7, 6, 5, 8>

Quali delle seguenti sequenze intermedie sono ottenute dall’algoritmo?

<1, 3, 4, 7, 6, 5, 8> c

<1, 3, 4, 6, 7, 5, 8> c

<1, 3, 4, 6, 7, 8, 5> c

<1, 3, 4, 5, 6, 8, 7> c

A.A.4) Sia h(k) = k %m una funzione hash su una tabella di m elementi. Perché la tabella hash presenti mediamente il minor numero di conflitti occorre che:

m non sia una potenza di 2 c

m non sia un numero primo c

m non sia uguale a 2

p

-1, con p numero primo c

m può assumere qualsiasi valore c

A.A.5) Sia data una lista doppia costruita a partire dal seguente elemento base:

struct nodo { int info;

struct nodo *next;;

struct nodo *prev;

}

quante istruzioni elementari richiede nel caso peggiore l’operazione

void delete(struct nodo*)

?

O(n) c

O(log n) c

O(1) c

dipende dalle informazioni memorizzate nella lista c

PARTE B: Algoritmi

A.B.1) Si supponga definito il tipo di dato

struct nodo { int info;

struct nodo* left;

struct nodo* right;

};

come tipo elementare per l’implementazione di un albero binario. Si supponga inoltre definita come globale la variabile

struct node* root;

scrivere una funzione

int height(struct node * root)

che calcoli l’altezza dell’albero;

A.B.2) Si supponga definito il tipo di dato

struct elem { char *nome;

int key;

};

che rappresenta, per ogni persona, il proprio nome e la propria “urgenza” in una coda di priorità. Sia inoltre definita globale la variabile

struct elem *q[n];

che rappresenta l’array mediante il quale si realizza la coda di puntatori ai diversi elementi. Si scriva una funzione

struct elem* extract_max()

che in O(logn) estrae

l’elemento più urgente dalla coda.

(3)

[SUGGERIMENTO: si utilizzi una funzione

void max_heapify(int i)

per ripristinare la condizione di max heap].

PARTE C: Domande Aperte

A.C.1) Si descriva il metodo della divisione per la costruzione di tabelle hash illustrando i particolari della implementazione della funzione di hashing e le prestazioni dal punto di vista della distribuzione delle chiavi;

A.C.2) Si illustri il funzionamento dell’algoritmo insertion sort e si discuta la sua complessità computazionale

nel caso peggiore.

Riferimenti

Documenti correlati

In pratica, modellando la cartina dell’Italia come un grafo orientato pesato G=(V, E), dove ciascun vertice rappresenta una città, ogni arco (u,v) rappresenta una strada diretta da

Infine, se la lista è doppiamente puntata, il puntatore prev della testa della lista punta all’elemento in coda

lista.h deve includere la definizione della struttura dati a puntatori (lista semplice non circolare) e i soli prototipi delle funzioni implementate in lista.c. Dunque, per

Un albero binario è una tipo astratto di dato che o è vuoto (cioè ha un insieme vuoto di nodi) o è formato da un nodo A (detto la radice) e da due sottoalberi, che sono a loro

Riversamento dei dati contenuti nell’heap nell’albero binario di ricerca utilizzando una visita lineare dell’array. Stampare i dati contenuti nell’albero binario di

La classe di memoria automatica è relativa a quegli oggetti locali ad un blocco (funzione o programma) che viene liberata non appena si raggiunge la fine di quel blocco. La classe

Le operazioni da fare sono reallocazione di memoria per il grafo (per il vettore di liste), cancellazione di una intera lista eliminando ogni suo elemento e poi facendo il free,

Si supponga inoltre che il venditore conosca il fatturato per ogni singola città (compreso quello della sua città che è inclusa in n) e il tempo necessario da trascorrere in