DIPARTIMENTO DI
INFORMATICA Università di Torino | |
ESERCIZI CON SOLUZIONE - ultimo aggiornamento 04/09/02ATTENZIONE: si consiglia di
ELENCO DEGLI ESERCIZI
SOLUZIONE DEGLI ESERCIZIEsercizio 1Errori frequentiNon considerare il caso in cui L1 e' la lista vuota. "Dimenticare" la parola chiave "else".Soluzione/* AI: l1 contiene una lista di interi L1 ordinata in ordine STRETTAMENTE crescente, l2 contiene una lista di interi L2 ordinata in ordine STRETTAMENTE crescente AF: Restituisce: 1, se i numeri contenuti in L2 sono un sottoinsieme dei numeri contenuti in L1 0, altrimenti */ int ese1 (node * l1, npde *l2) { /* IC: i nodi di L2 dal primo fino al nodo puntato da l2 ESCLUSO sono un sottoinsieme dei nodi di L1 dal primo fino al nodo puntato da l1 ESCLUSO */ while ((l1 != NULL) && (l2 != NULL)) { if (l1->data == l2->data) { l1 = l1->next; l2 = l2->next; } else if (l1->data < l2->data) l1 = l1->next; else return 0; } return (l1 == NULL); }La complessita' in tempo di questa funzione e', nel caso peggiore, lineare nella lunghezza di L1. Giustificazione:
Esercizio 2Errori frequentiNon considerare il caso in cui L1 e' la lista vuota. Mettere istruzioni dopo un'istruzione di "return", ad es:... return 0; if (l1->data > l2->data) ...oppure: ... if (l2 == NULL) return 0; else return 1; if (l1->data > l2->data) ... Soluzione/* AI: l1 contiene una lista di interi L1 ordinata in ordine STRETTAMENTE crescente, l2 contiene una lista di interi L2 ordinata in ordine STRETTAMENTE crescente AF: Restituisce: 1, se i numeri contenuti in L2 sono un sottoinsieme dei numeri contenuti in L1 0, altrimenti */ int ese2 (node * l1, npde *l2) { if (l2 != NULL) return 1; else if (L1 == NULL) return 0; else if (l1->data == l2->data) return ese2(l1->next,l2->next); else if (l1->data < l2->data) return ese2(l1->next,l2); else return 0; }La complessita' in tempo di questa funzione e', nel caso peggiore, lineare nella somma delle lunghezza di L1. Giustificazione:
Per quanto riguarda la complessita' in spazio, valgoo le stesse considerazioni fatte per la complessita' in tempo. La funzione e' ricorsiva di coda (ogni richiamo ricorsivo e' l'ultima operazione effettuata prima del ritorno del valore [PER MAGGIORE CHIAREZZA SUGGERISCO DI RIPORTARE LA DEFINIZIONE DI FUNZIONE RICIORSIVA DI CODA]). Quindi un compilatore "ottimizzante" potrebbe trasformare la ricorsione di coda in una itezazione, ottenendo una complessita' in spazio costante. |
Last update: Sep 04, 2002 | |