Salta al contenuto
Note per Studenti Esercizio - domande di prima parte su problemi computazionali, ricorrenze e conteggi (simulazioni d'esame)

Esercizio - domande di prima parte su problemi computazionali, ricorrenze e conteggi (simulazioni d'esame)

In questa pagina 4

Testo (prima parte delle simulazioni d'esame 2023-24 e 2025-26 di Algoritmi per l'Ingegneria, Ing. Informatica UniPD). La prima parte dell'esame è formata da dieci domande a risposta unica o a scelta multipla: non va riportato il procedimento, solo la risposta. La seconda parte (esercizi di progetto e analisi, come le altre pagine di esercizi svolti) non viene corretta se la valutazione della prima è significativamente insufficiente. Le due simulazioni contengono le stesse dieci domande; qui ci sono le tre sui problemi computazionali, sulle ricorrenze e sui conteggi di istruzioni (le altre riguardano matrici, DFT, programmazione dinamica e greedy). Il testo di ciascuna è riportato per intero.

Domanda 1. Sia Π=I×S\Pi = I \times S il problema dell'estrazione delle radici quadrate di un numero complesso non nullo. Si definiscano gli insiemi II ed SS. Scegli un'alternativa:

  • I=C+I = \mathbb{C}^+, S=(C+)2S = (\mathbb{C}^+)^2
  • I=C−{0}I = \mathbb{C} - \{0\}, S=C−{0}S = \mathbb{C} - \{0\}
  • I=(C−{0})2I = (\mathbb{C} - \{0\})^2, S=C2S = \mathbb{C}^2
  • I=C−{0}I = \mathbb{C} - \{0\}, S=(C−{0})2S = (\mathbb{C} - \{0\})^2

Domanda 2. Utilizzando le proprietà strutturali dell'albero associato alla seguente ricorrenza T(n)={12n=1T ⁣(⌊n/2⌋)+T ⁣(⌈n/2⌉)n>1T(n) = \begin{cases} 12 & n = 1 \\ T\!\left(\lfloor n/2\rfloor\right) + T\!\left(\lceil n/2\rceil\right) & n > 1 \end{cases} si determini il valore di T(12)T(12).

Domanda 3. Per n>1n > 1, sia T(n)T(n) il numero esatto di esecuzioni del comando a = a + 2 nel seguente frammento di codice:

for i = 2 to n-1:
    for j = n-i+2 to n:
        a = a + 2

Si calcoli T(18)T(18).


Teoria usata: Problemi computazionali - istanze, soluzioni, correttezza e complessitàUn problema computazionale è una relazione totale (non necessariamente univoca) tra istanze e soluzioni; un algoritmo è una funzione dalle istanze alle soluzioni e risolve il problema se la sua uscita è sempre in relazione con l'ingresso. Correttezza = coerenza con la specifica; complessità = costo in funzione della taglia, per default al caso peggiore, con le istruzioni a costo unitario scelte in modo significativo.Problemi computazionali - istanze, soluzioni, correttezza e complessità →, Divide and conquer - proprietà di sottostruttura e albero delle chiamateUn algoritmo divide and conquer nasce da una proprietà di sottostruttura (funzioni Divide e Conquer, base n0) con sottoistanze di taglia strettamente minore; l'albero delle chiamate ne descrive l'esecuzione, e il D&C non ha memoria (ripete le sottoistanze uguali). Esempio completo: MAX di un array, con correttezza per induzione, ricorrenza e conteggio esatto n-1 tramite il teorema sugli alberi binari pieni.Divide and conquer - proprietà di sottostruttura e albero delle chiamate →, Albero della ricorrenza e formula generale per le ricorrenzeL'albero della ricorrenza ha la forma dell'albero delle chiamate dell'istanza peggiore e T(n) è la somma dei lavori dei nodi. Per la famiglia T(n) = s(n)T(f(n)) + w(n) con base T0 per n <= n0, contando i nodi per livello con le iterate di f e il livello f*(n,n0) si ottiene la formula chiusa T(n) = somma_l [prodotto_j s(f^(j)(n))] w(f^(l)(n)) + [prodotto s] T0, verificata per induzione e applicata a esempi (merge sort, Hanoi, ricorrenze con radice).Albero della ricorrenza e formula generale per le ricorrenze →, SommatorieIl simbolo di sommatoria, le sue proprietà (linearità, additività, cambio di indice) e le somme notevoli di Gauss e geometrica.Sommatorie →.

Domanda 1: gli insiemi II ed SS

Un problema è una relazione Π⊆I×S\Pi \subseteq I \times S tra istanze e soluzioni (Problemi computazionali - istanze, soluzioni, correttezza e complessitàUn problema computazionale è una relazione totale (non necessariamente univoca) tra istanze e soluzioni; un algoritmo è una funzione dalle istanze alle soluzioni e risolve il problema se la sua uscita è sempre in relazione con l'ingresso. Correttezza = coerenza con la specifica; complessità = costo in funzione della taglia, per default al caso peggiore, con le istruzioni a costo unitario scelte in modo significativo.Problemi computazionali - istanze, soluzioni, correttezza e complessità →).

  • Istanza: un numero complesso non nullo zz: I=C−{0}I = \mathbb{C} - \{0\}. Questo esclude la terza alternativa (che ha coppie in ingresso) e la prima (C+\mathbb{C}^+ non descrive i complessi non nulli).
  • Soluzione: ogni z≠0z \ne 0 ha due radici quadrate distinte, ww e −w-w, entrambe non nulle. Se la soluzione è la coppia delle due radici, S=(C−{0})×(C−{0})=(C−{0})2S = (\mathbb{C} - \{0\}) \times (\mathbb{C} - \{0\}) = (\mathbb{C} - \{0\})^2. La seconda alternativa (S=C−{0}S = \mathbb{C} - \{0\}) conterrebbe una sola radice e descriverebbe il problema "trova una radice".

Risposta: quarta alternativa, I=C−{0}I = \mathbb{C} - \{0\}, S=(C−{0})2S = (\mathbb{C} - \{0\})^2.

Nota. Vale anche Π⊆I×S′\Pi \subseteq I \times S' con S′={(w,−w):w∈C, w≠0}⊂SS' = \{(w, -w) : w \in \mathbb{C},\ w \ne 0\} \subset S. La relazione non è univoca: per ogni zz ci sono due coppie ordinate, (w,−w)(w, -w) e (−w,w)(-w, w), entrambe soluzioni. Variante: per le radici cubiche sarebbe S=(C−{0})3S = (\mathbb{C} - \{0\})^3 (tre radici distinte e non nulle).

Domanda 2: T(12)T(12)

Con l'albero. Si osserva che la ricorrenza ha lo stesso albero di MAX (Divide and conquer - proprietà di sottostruttura e albero delle chiamateUn algoritmo divide and conquer nasce da una proprietà di sottostruttura (funzioni Divide e Conquer, base n0) con sottoistanze di taglia strettamente minore; l'albero delle chiamate ne descrive l'esecuzione, e il D&C non ha memoria (ripete le sottoistanze uguali). Esempio completo: MAX di un array, con correttezza per induzione, ricorrenza e conteggio esatto n-1 tramite il teorema sugli alberi binari pieni.Divide and conquer - proprietà di sottostruttura e albero delle chiamate →): ogni istanza di taglia n>1n > 1 si divide in due sottoistanze di taglie ⌊n/2⌋\lfloor n/2\rfloor e ⌈n/2⌉\lceil n/2\rceil, e le foglie sono nn (una per ogni elemento: i due sottoinsiemi sono disgiunti e si arriva a taglia 11). Il lavoro è nullo ai nodi interni (nella ricorrenza non c'è nessun termine oltre alle due TT) e 1212 a ogni foglia (T(1)=12T(1) = 12). Quindi T(n)=12⋅n,T(12)=144.T(n) = 12\cdot n, \qquad T(12) = 144.

          n                      lavoro 0
        /   \
  floor(n/2) ceil(n/2)           lavoro 0
     ...     ...
   (1)(1)(1) ... (1)             n foglie, lavoro 12 ciascuna

Per induzione (conferma di T(n)=12nT(n) = 12n per ogni n≥1n \ge 1): base T(1)=12T(1) = 12; passo, per n>1n > 1: T(n)=12⌊n/2⌋+12⌈n/2⌉=12(⌊n/2⌋+⌈n/2⌉)=12nT(n) = 12\lfloor n/2\rfloor + 12\lceil n/2\rceil = 12(\lfloor n/2\rfloor + \lceil n/2\rceil) = 12n, essendo ⌊n/2⌋+⌈n/2⌉=n\lfloor n/2\rfloor + \lceil n/2\rceil = n.

Alternativa a mano, senza la formula: T(12)=T(6)+T(6)=2T(6)=2(2T(3))=4T(3)T(12) = T(6) + T(6) = 2T(6) = 2\bigl(2T(3)\bigr) = 4T(3), e T(3)=T(1)+T(2)=T(1)+(T(1)+T(1))=3T(1)T(3) = T(1) + T(2) = T(1) + \bigl(T(1) + T(1)\bigr) = 3T(1), quindi T(12)=12 T(1)=12⋅12=144T(12) = 12\,T(1) = 12\cdot 12 = 144.

Risposta: 144144.

Domanda 3: conteggio con due cicli

Il numero di esecuzioni del corpo è il numero di coppie (i,j)(i, j) del ciclo: T(n)=∑i=2n−1 ∑j=n−i+2n1.T(n) = \sum_{i=2}^{n-1}\ \sum_{j=n-i+2}^{n} 1. Ciclo interno. Per ii fissato, jj va da n−i+2n - i + 2 a nn: sono n−(n−i+2)+1=i−1n - (n - i + 2) + 1 = i - 1 valori (la somma di 11 su un intervallo di indici vale ultimo estremo −- primo estremo +1+ 1; è ≥1\ge 1 perché i≥2i \ge 2). Ciclo esterno. T(n)=∑i=2n−1(i−1)=∑i′=1n−2i′=(n−2)(n−1)2,T(n) = \sum_{i=2}^{n-1}(i - 1) = \sum_{i'=1}^{n-2} i' = \frac{(n-2)(n-1)}{2}, con il cambio di indice i′=i−1i' = i - 1 (per i=2,…,n−1i = 2, \dots, n-1, i′i' va da 11 a n−2n - 2) e la somma di Gauss ∑i′=1mi′=m(m+1)2\sum_{i'=1}^{m} i' = \frac{m(m+1)}{2} con m=n−2m = n - 2 (SommatorieIl simbolo di sommatoria, le sue proprietà (linearità, additività, cambio di indice) e le somme notevoli di Gauss e geometrica.Sommatorie →). Per n=18n = 18: T(18)=16⋅172=8⋅17=136.T(18) = \frac{16\cdot 17}{2} = 8\cdot 17 = 136.

Risposta: 136136. (La formula vale per n≥2n \ge 2: per n=2n = 2 il ciclo esterno è vuoto e T(2)=0⋅12=0T(2) = \frac{0\cdot1}{2} = 0. Verificata con un conteggio diretto per n=2,…,59n = 2, \dots, 59.)

python
def T(n):
    return sum(1 for i in range(2, n) for j in range(n - i + 2, n + 1))

assert T(18) == 136 and all(T(n) == (n - 2) * (n - 1) // 2 for n in range(2, 60))

Varianti per allenarsi

Tutte controllate con un programma.

  1. T(1)=7T(1) = 7, stessa ricorrenza della domanda 2: T(n)=7nT(n) = 7n, quindi T(25)=175T(25) = 175.
  2. T(1)=0T(1) = 0, T(n)=T(⌊n/2⌋)+T(⌈n/2⌉)+3T(n) = T(\lfloor n/2\rfloor) + T(\lceil n/2\rceil) + 3: stesso albero di MAX con lavoro 33 per ognuno degli n−1n - 1 nodi interni, T(n)=3(n−1)T(n) = 3(n - 1), quindi T(10)=27T(10) = 27.
  3. for i = 1 to n: for j = i to n (corpo eseguito n−i+1n - i + 1 volte per ogni ii): ∑i=1n(n−i+1)=n(n+1)2\sum_{i=1}^{n}(n - i + 1) = \frac{n(n+1)}{2}, quindi 5555 per n=10n = 10.
  4. for i = 1 to n: for j = 1 to i: for k = 1 to j: ∑i=1ni(i+1)2=n(n+1)(n+2)6\sum_{i=1}^{n}\frac{i(i+1)}{2} = \frac{n(n+1)(n+2)}{6}, quindi 5656 per n=6n = 6.

Versione ripasso

Testo. Prima parte (dieci domande, solo la risposta). (1) Radici quadrate di un complesso non nullo: definire II ed SS (4 alternative). (2) T(1)=12T(1)=12, T(n)=T(⌊n/2⌋)+T(⌈n/2⌉)T(n)=T(\lfloor n/2\rfloor)+T(\lceil n/2\rceil): calcolare T(12)T(12). (3) Numero di esecuzioni di a = a + 2 in for i = 2 to n-1: for j = n-i+2 to n: calcolare T(18)T(18).

Teoria: Problemi computazionali - istanze, soluzioni, correttezza e complessitàUn problema computazionale è una relazione totale (non necessariamente univoca) tra istanze e soluzioni; un algoritmo è una funzione dalle istanze alle soluzioni e risolve il problema se la sua uscita è sempre in relazione con l'ingresso. Correttezza = coerenza con la specifica; complessità = costo in funzione della taglia, per default al caso peggiore, con le istruzioni a costo unitario scelte in modo significativo.Problemi computazionali - istanze, soluzioni, correttezza e complessità →, Divide and conquer - proprietà di sottostruttura e albero delle chiamateUn algoritmo divide and conquer nasce da una proprietà di sottostruttura (funzioni Divide e Conquer, base n0) con sottoistanze di taglia strettamente minore; l'albero delle chiamate ne descrive l'esecuzione, e il D&C non ha memoria (ripete le sottoistanze uguali). Esempio completo: MAX di un array, con correttezza per induzione, ricorrenza e conteggio esatto n-1 tramite il teorema sugli alberi binari pieni.Divide and conquer - proprietà di sottostruttura e albero delle chiamate →, SommatorieIl simbolo di sommatoria, le sue proprietà (linearità, additività, cambio di indice) e le somme notevoli di Gauss e geometrica.Sommatorie →.

  • D1: I=C−{0}I=\mathbb C-\{0\} (istanza: un complesso non nullo); S=(C−{0})2S=(\mathbb C-\{0\})^2 (le due radici w,−ww,-w, non nulle). Risposta: la quarta. Π⊆I×S′\Pi\subseteq I\times S', S′={(w,−w)}S'=\{(w,-w)\}; non univoca (coppia ordinata: (w,−w)(w,-w) e (−w,w)(-w,w)).
  • D2: stesso albero di MAX: nn foglie, lavoro 00 ai nodi interni e 1212 a ogni foglia, T(n)=12nT(n)=12n (induzione: 12⌊n/2⌋+12⌈n/2⌉=12n12\lfloor n/2\rfloor+12\lceil n/2\rceil=12n), T(12)=144T(12)=\mathbf{144}. A mano: T(12)=2T(6)=4T(3)T(12)=2T(6)=4T(3), T(3)=T(1)+T(2)=3T(1)T(3)=T(1)+T(2)=3T(1).
  • D3: interno: n−(n−i+2)+1=i−1n-(n-i+2)+1=i-1 iterazioni; esterno: ∑i=2n−1(i−1)=∑i′=1n−2i′=(n−2)(n−1)2\sum_{i=2}^{n-1}(i-1)=\sum_{i'=1}^{n-2}i'=\frac{(n-2)(n-1)}2; T(18)=16⋅172=136T(18)=\frac{16\cdot17}2=\mathbf{136}.
  • Varianti: T(1)=7→T(25)=175T(1)=7\to T(25)=175; lavoro 33 per nodo interno →T(10)=27\to T(10)=27; ∑i=1n(n−i+1)=n(n+1)2\sum_{i=1}^n(n-i+1)=\frac{n(n+1)}2 (5555 per n=10n=10); triplo ciclo annidato n(n+1)(n+2)6\frac{n(n+1)(n+2)}6 (5656 per n=6n=6).
  • Errori tipici: scegliere S=C−{0}S=\mathbb C-\{0\} (una sola radice); contare i−2i-2 o ii iterazioni nel ciclo interno (estremi inclusi: +1+1); dimenticare che il lavoro è sulle foglie e non sui nodi interni; tenere ii come indice dopo il cambio i′=i−1i'=i-1.

Teoria collegata