Esercizio - domande di prima parte su greedy e Huffman (simulazioni d'esame)
In questa pagina 3
Fonte: prima parte delle simulazioni d'esame del corso di Algoritmi per l'Ingegneria (Ing. Informatica UniPD), edizioni 2023-24 e 2025-26. La prima parte è fatta di 10 domande a risposta unica o a scelta multipla, senza procedimento; qui il procedimento si scrive per capire il metodo. Le due domande sul paradigma greedy sono le stesse nelle due simulazioni.
Domanda 1: attività selezionate e sottoistanza residua
Testo. Si consideri un insieme di attività , , caratterizzate dai seguenti vettori e di tempi di inizio e fine: Si determini l'indice della prima attività della sottoistanza residua ottenuta dopo la prima scelta greedy e il relativo clean-up.
Soluzione. Le attività sono già ordinate per fine non decrescente (), come richiede l'algoritmo (Paradigma greedy - scelta golosa, sottostruttura e selezione delle attivitàIl paradigma greedy compie subito una scelta localmente migliore (scelta greedy), pulisce l'istanza (clean-up) e risolve l'unica sottoistanza residua, con ricorsione di coda eliminabile; il codice è facile, la correttezza no e richiede due proprietà, la scelta greedy (esiste un ottimo che la contiene) e la sottostruttura ottima (cut-and-paste), da cui la correttezza segue per induzione. Caso di studio: la selezione delle attività, con l'algoritmo del primo che finisce, correttezza completa, complessità Theta(n) dopo l'ordinamento e controesempi per le scelte greedy sbagliate.Paradigma greedy - scelta golosa, sottostruttura e selezione delle attività →). Gli intervalli sono , , , , , .
- Scelta greedy: la prima attività dell'ordine, , con .
- Clean-up: si eliminano, a partire da , le attività incompatibili con , cioè quelle con :
- : , eliminata;
- : , eliminata;
- : , compatibile (gli intervalli sono chiusi a sinistra e aperti a destra: finisce in e inizia in ), ci si ferma.
- La sottoistanza residua è il suffisso e la sua prima attività è .
Risposta: 4.
Nota sulla soluzione scritta a mano: la verifica usa al posto di per l'ultima riga: è una svista di scrittura, la disuguaglianza da controllare è quella di (con sarebbe falsa).
Per completare: proseguendo l'algoritmo si sceglie (con ), poi si scartano () e si sceglie (): soluzione , 3 attività, ottima (verificato con la forza bruta).
Domanda 2: estrazioni del minimo in HUFFMAN
Testo. Il numero complessivo di estrazioni del minimo sulla coda di priorità effettuate dall'algoritmo HUFFMAN su un alfabeto di caratteri è:
- Il ciclo
for i <- 1 to n-1ha iterazioni, una per ogni nodo interno del trie (un albero pieno con foglie ha nodi interni); ciascuna esegue 2extractmin: . - L'istruzione finale
return Q.extractmin()ne esegue 1, per estrarre la radice.
Totale: .
Risposta: 25.
Ne segue anche che le insert sono (13 iniziali e 12 nel ciclo).
Varianti per allenarsi
Stesso tipo di domanda, con dati nuovi (risposte controllate con Python).
- Attività con e (già ordinate per fine). Quante attività sceglie l'algoritmo e quale è la prima della residua dopo ? Esecuzione: ; () scartata; () scelta; () e () scartate; () scelta. Sono 3 attività, , ed è il massimo; la prima della residua dopo è , indice 3.
- Huffman con : quante inserzioni in ? . Quanti nodi ha il trie finale? foglie e interni, 25 nodi.
- Huffman con generico: quante iterazioni del ciclo, quante estrazioni? iterazioni e estrazioni.
- Codifica di Huffman per , , , , , (percentuali): costo medio. bit per carattere (somma dei nodi interni centesimi).
Versione ripasso
- Domanda sulle attività (, , già ordinate per fine): scelta greedy (); clean-up elimina chi ha : (), (); ha (intervalli semiaperti, compatibile). Prima attività della residua: 4. Algoritmo in Paradigma greedy - scelta golosa, sottostruttura e selezione delle attivitàIl paradigma greedy compie subito una scelta localmente migliore (scelta greedy), pulisce l'istanza (clean-up) e risolve l'unica sottoistanza residua, con ricorsione di coda eliminabile; il codice è facile, la correttezza no e richiede due proprietà, la scelta greedy (esiste un ottimo che la contiene) e la sottostruttura ottima (cut-and-paste), da cui la correttezza segue per induzione. Caso di studio: la selezione delle attività, con l'algoritmo del primo che finisce, correttezza completa, complessità Theta(n) dopo l'ordinamento e controesempi per le scelte greedy sbagliate.Paradigma greedy - scelta golosa, sottostruttura e selezione delle attività →.
- Intera esecuzione: si scelgono , (; scartata perché ), (): attività, ottimo.
- Domanda su HUFFMAN (): iterazioni
extractmin, più nelreturn: 25 (Codifica di Huffman - codici prefissi, algoritmo e ottimalitàCompressione con codifica per carattere: la lunghezza variabile risparmia bit ma deve essere iniettiva, e i codici prefissi lo garantiscono; un codice prefisso è un trie binario con una foglia per carattere, di costo B(T) = somma di f(c) d_T(c), e quello ottimo è un albero pieno con n-1 nodi interni. L'algoritmo di Huffman fonde ripetutamente i due alberi di frequenza minima usando una coda con priorità (2n-1 estrazioni, costo O(n log n)); l'ottimalità si prova con la scelta greedy (i due caratteri più rari sono foglie sorelle di profondità massima, per scambio) e la sottostruttura (B(T) = B(T') + f(x) + f(y)). Esempio completo con 6 caratteri, B = 2,24.Codifica di Huffman - codici prefissi, algoritmo e ottimalità →). Leinsertsono . - Varianti: , : scelte (residua dopo parte da ); Huffman con ha nodi ( foglie e interni); costo medio dell'esempio a sei caratteri bit.
- Errori tipici: usare invece di per la compatibilità, escludendo il caso di intervalli contigui; contare estrazioni per iterazione o dimenticare quella del
return(risposta invece di ); scrivere per (typo della soluzione a mano).