Salta al contenuto
Note per Studenti Esercizio 3 · invariante su matrice a colonne decrescenti

Esercizio 3invariante su matrice a colonne decrescenti

Esame
In questa pagina 6

Testo (esempio di tema d'esame, seconda parte, esercizio 1, 5 punti). Sia AA una matrice n×mn \times m con valori interi, con la proprietà che i valori in ogni colonna sono ordinati in senso decrescente dalla riga 00 alla riga n−1n - 1. Il seguente algoritmo determina il massimo numero di valori >0> 0 in una colonna.

i <- 0; j <- 0
while (i < n) AND (j < m) do {
    if (A[i,j] <= 0) then j <- j + 1
    else i <- i + 1
}
return i

Trovare un opportuno invariante per il ciclo, che serva per provare la correttezza dell'algoritmo (la prova di correttezza non è richiesta).


Richiami

Un invariante di ciclo vale prima del ciclo, si conserva a ogni iterazione e a fine ciclo implica la tesi (vedi Dimostrazioni, induzione e invariantiTecniche di dimostrazione (esempio, controesempio, assurdo), induzione con casi base multipli, invarianti di ciclo (inizializzazione, conservazione, uso alla fine), schema generale per provare la correttezza; esempi svolti su arrayMax, sequenza di bit e numeri di Fibonacci.Dimostrazioni, induzione e invarianti →).

Cosa fa l'algoritmo

Sia c(j)c(j) il numero di valori positivi della colonna jj. Poiché la colonna è decrescente, i valori positivi sono i primi c(j)c(j) della colonna (dalla riga 00): se A[i,j]≤0A[i, j] \le 0 allora tutti i valori delle righe i,i+1,…i, i+1, \dots sono ≤0\le 0, e se A[i,j]>0A[i, j] > 0 allora lo sono tutti quelli delle righe 0,…,i0, \dots, i. Si cerca M=max⁡jc(j)M = \max_j c(j).

L'algoritmo percorre la matrice a "scala": se A[i,j]≤0A[i, j] \le 0 la colonna jj ha al più ii valori positivi, quindi non può battere il valore ii già raggiunto e si passa alla colonna j+1j+1; se A[i,j]>0A[i, j] > 0 la colonna jj ha almeno i+1i + 1 valori positivi e si prova ad arrivare a i+1i + 1.

Invariante

All'inizio di ogni iterazione (e quindi a ogni controllo della condizione del while):

(a)  c(j′)≤i  per ogni colonna j′<j;(b)  max⁡j′c(j′)≥i.\textbf{(a)}\ \ c(j') \le i \ \text{ per ogni colonna } j' < j; \qquad \textbf{(b)}\ \ \max_{j'} c(j') \ge i.

La (a) dice che le colonne già scartate non hanno più di ii valori positivi; la (b) che almeno una colonna ne ha ii o più (in particolare il valore ii è raggiungibile).

Verifica (pur senza richiedere la prova)

  • Inizio: i=j=0i = j = 0; la (a) è vuota e la (b) è M≥0M \ge 0.
  • Conservazione. Se A[i,j]≤0A[i, j] \le 0 si incrementa jj: la colonna jj ha c(j)≤ic(j) \le i, quindi la (a) vale anche per j+1j + 1 (ii non cambia, quindi la (b) resta vera). Se A[i,j]>0A[i, j] > 0 si incrementa ii: la colonna jj ha c(j)≥i+1c(j) \ge i + 1, quindi M≥i+1M \ge i + 1 e la (b) vale con il nuovo ii; la (a) resta vera perché c(j′)≤i<i+1c(j') \le i < i + 1.
  • Uscita: si esce con i=ni = n o con j=mj = m. Se i=ni = n, dalla (b) M≥nM \ge n e poiché M≤nM \le n si ha M=n=iM = n = i. Se j=mj = m, dalla (a) ogni colonna ha c≤ic \le i e dalla (b) M≥iM \ge i, quindi M=iM = i. In entrambi i casi i=Mi = M, ed è ciò che restituisce l'algoritmo.
  • Terminazione: a ogni iterazione cresce ii o jj, e i+ji + j è limitato da n+mn + m; le iterazioni sono al più n+mn + m, quindi la complessità è Θ(n+m)\Theta(n + m) (una colonna alla volta e una riga alla volta, mai all'indietro).

Esempio

n=3n = 3, m=3m = 3, colonne decrescenti:

A=(52−130−2−1−4−5),c=(2,1,0), M=2.A = \begin{pmatrix} 5 & 2 & -1 \\ 3 & 0 & -2 \\ -1 & -4 & -5 \end{pmatrix}, \qquad c = (2, 1, 0), \ M = 2.

Traccia (i,j)(i, j): (0,0)(0, 0) con A[0,0]=5>0A[0,0] = 5 > 0 →(1,0)\to (1, 0); A[1,0]=3>0→(2,0)A[1,0] = 3 > 0 \to (2, 0); A[2,0]=−1≤0→(2,1)A[2,0] = -1 \le 0 \to (2, 1); A[2,1]=−4≤0→(2,2)A[2,1] = -4 \le 0 \to (2, 2); A[2,2]=−5≤0→(2,3)A[2,2] = -5 \le 0 \to (2, 3); j=mj = m: esce e restituisce 22. Ad ogni passo valgono (a) e (b): ad esempio a (2,1)(2, 1) la colonna 00 ha c(0)=2≤2c(0) = 2 \le 2 e M=2≥2M = 2 \ge 2. (L'invariante è stato controllato con 30003000 matrici casuali.)

Errori comuni

  • Un invariante tipo "ii è il numero di positivi nella colonna jj": falso, non c'è una colonna fissata.
  • Dimenticare la parte (b), cioè che il valore ii è effettivamente raggiunto da qualche colonna: senza di essa dall'uscita con j=mj = m si dedurrebbe solo M≤iM \le i.
  • Dimenticare l'ipotesi di decrescenza: senza di essa A[i,j]≤0A[i, j] \le 0 non dice nulla sulle righe sotto.

Versione ripasso

Testo. AA matrice n×mn \times m con colonne decrescenti dall'alto in basso; il ciclo while (i<n) AND (j<m): se A[i,j]≤0A[i,j] \le 0 allora j←j+1j \leftarrow j+1 altrimenti i←i+1i \leftarrow i+1; return i (massimo numero di valori >0> 0 in una colonna). Trovare un invariante.

Teoria collegata