Salve a tutti. Questi sono gli ultimi esercizi che propongo sul forum. Ringrazio tutti coloro che mi hanno aiutato e mi scuso per avervi fatto perdere tempo XD
PRIMO QUESITO
"Indicare e commentare brevemente il tempo di esecuzione nel caso pessimo della ricerca
dell'elemento in un albero binario in cui in precedenza sono stati inseriti gli n-1 elementi:
1,2,3,4,5,...,n-3,n-2,n-1,n (cioè all'i-esimo inserimento è stato inserito l'elemento con il
valore i). Mostrare inoltre l'output di una visita pre-ordine in tale albero"
La ricerca binaria viene eseguita in tempo logaritmico nel peggiore dei casi, effettuando
confronti O(log n), dove n è il numero di elementi nell'array
Il tempo di esecuzione nel caso peggiore della ricerca è dovuto da O(log n) essendo dovuto
da alberi molto sbilanciati e profondi. Una visita in pre-ordine avviene in questo modo:
I. entro nel generico nodo n,ricevo dei parametri dalla procedura eseguita sul genitore
II. eseguo la computazione su n. mi avvalgo dei valori già computati sul genitore
III e IV. lancio la procedura sul figlio sinistro e destro. passo dei parametri alle
procedure eseguite sui figli
V. esco dal nodo n. restituisco un output alla procedura lanciata sul genitore
ordine di visita: n, n-1, n-2, n-3, ..., 5, 4, 3, 2, 1
SECONDO QUESITO
"Supponiamo che in una tabella hash a indirizzamento aperto siano stati
memorizzati n elementi e che la dimensione del bucket array sia m. Indicare
il tempo di esecuzione dell'algoritmo che stampa sullo standard output i valori
di tutti gli elementi presenti. Indicare, inoltre, il tempo di esecuzione
dell'operazione di ricerca nel caso ottimo"
tutti i record delle voci sono archiviati nell'array di bucket stesso. Quando è
necessario inserire una nuova voce, i bucket vengono esaminati, iniziando dallo
slot hash-to e procedendo in una sequenza di probe, fino a trovare uno slot
non occupato. Durante la ricerca di una voce, i bucket vengono scansionati nella
stessa sequenza, fino a quando non viene trovato il record di destinazione o viene
trovato uno slot dell'array inutilizzato, il che indica che tale chiave non è
presente nella tabella. Il nome "indirizzamento aperto" si riferisce al fatto che
la posizione ("indirizzo") dell'elemento non è determinata dal suo valore hash.
Il tempo di esecuzione nel caso ottimo è O(1). Infatti, dalla chiave si ottiene in
tempo costante la posizione del vettore nel quale è contenuta l’informazione da ricercare
'efficienza di una hash table dipende dalla frequenza delle collisioni che a sua volta
dipende dal rapporto fra
numero massimo di elementi e grandezza della tabella e dalle funzioni di hash utilizzate.
TERZO QUESITO
"Indicare il tempo di esecuzione dell'operazione di merge all'interno dell'algoritmo
Merge Sort quando le lunghezze delle due sequenze in input all'operazione di merge
sono n ed m"
Il vettore viene spezzato a metà ricorsivamente, fino ad arrivare a piccoli
blocchi di uno o due elementi. Successivamente tutti gli elementi, ordinati al
loro interno, sono fusi (merge) in un unico blocco grande (circa) il doppio.
Essendo le due sequenze hanno rispettivamente lunghezza n1 e n2:
• lo spazio necessario (oltre alle sequenze) è Θ(n1 + n2), per il vettore della sequenza;
• il numero di confronti eseguiti è Θ(n1 + n2) nel caso peggiore, e Θ(1) nel caso
migliore, quando una delle due sequenze contiene solo il valore minimo, quindi si
esaurisce immediatamente e l’altra sequenza viene copiata senza confronti;
• quando una delle due sequenze si esaurisce, non sono più necessari confronti, ma
bisogna comunque ricopiare tutti gli elementi dal vettore ad a (ordine generale del vettore), quindi il numero di
operazioni eseguite (tempo di calcolo) è Θ(n1 + n2) in ogni caso.