Esercizio 4ordinamento con scambi, traccia e invariante
In questa pagina 3
Testo (scritto del 19/09/2023, seconda parte, esercizio 1, 4 punti). Si consideri il seguente algoritmo che riceve in input una sequenza di interi.
for i <- 0 to n-2 do
for j <- i+1 to n-1 do
if (S[j] < S[i]) then swap(S[i], S[j])(a) Eseguire l'algoritmo con input , quindi , e riportare lo stato della sequenza alla fine di ciascuna iterazione del ciclo for esterno.
(b) Dire cosa fa l'algoritmo in generale e trovare un opportuno invariante che deve valere all'inizio del ciclo for esterno e alla fine di ciascuna sua iterazione.
(a) Traccia
Si confronta con ogni elemento successivo e, se ne trova uno minore, lo scambia con la posizione . Alla fine del ciclo interno contiene quindi il minimo di .
| Fine iterazione | Sequenza |
|---|---|
| (inizio) | |
Ad esempio per : scambia (); gli altri non sono minori di . Per (): ? no; scambia ; scambia ; scambia . (Tracce verificate eseguendo il codice.)
(b) Cosa fa e invariante
L'algoritmo ordina in senso crescente. È una variante del selection sort (vedi Algoritmi di ordinamentoSelection sort e insertion sort (quadratici, con invarianti), merge sort (divide et impera, Theta(n log n)), quick sort (caso pessimo quadratico, medio n log n), heap sort (in loco, Theta(n log n)), ordinamento senza confronti per chiavi intere in un intervallo piccolo, limite inferiore Omega(n log n) per gli algoritmi basati su confronti.Algoritmi di ordinamento →) che, invece di scegliere l'indice del minimo e fare uno scambio, scambia ogni volta che trova un elemento minore: più scambi, stessi confronti.
Invariante del ciclo esterno (all'inizio dell'iterazione , e alla fine dell'iterazione ): contiene i elementi più piccoli di , in ordine crescente; di conseguenza per ogni .
- Inizio (): il prefisso è vuoto.
- Conservazione. L'iterazione porta in il minimo di . Infatti (invariante del ciclo interno): dopo l'iterazione , è il minimo di originali dell'iterazione e il multiset non cambia. Base: prima del ciclo interno è il minimo di . Passo: se si scambiano e diventa il nuovo minimo; altrimenti resta minimo di . Alla fine : aggiunto al prefisso, che per ipotesi contiene i più piccoli e ha tutti gli elementi quelli di , mantiene l'invariante con elementi.
- Uscita: dopo il prefisso contiene i elementi più piccoli ordinati e l'ultimo, , è per forza il massimo: la sequenza è ordinata.
Errori comuni
- Dimenticare che dopo l'iterazione non solo è al suo posto, ma tutto contiene i più piccoli: l'invariante riguarda anche i valori e non solo l'ordine relativo.
- Scrivere un invariante valido solo alla fine del ciclo esterno.
- Pensare che il resto della sequenza () resti nell'ordine originale: dopo gli scambi viene rimescolato.
Versione ripasso
Testo. for i <- 0 to n-2: for j <- i+1 to n-1: if S[j] < S[i] then swap(S[i], S[j]). (a) Traccia con a fine di ogni iterazione esterna. (b) Cosa fa? Invariante del ciclo esterno.
- (a): : ; : ; : ; : ; : .
- (b): ordina in senso crescente (variante del selection sort con più scambi, vedi Algoritmi di ordinamentoSelection sort e insertion sort (quadratici, con invarianti), merge sort (divide et impera, Theta(n log n)), quick sort (caso pessimo quadratico, medio n log n), heap sort (in loco, Theta(n log n)), ordinamento senza confronti per chiavi intere in un intervallo piccolo, limite inferiore Omega(n log n) per gli algoritmi basati su confronti.Algoritmi di ordinamento →), confronti.
- Invariante esterno: contiene i elementi più piccoli in ordine crescente, tutti per (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 →).
- Invariante interno: dopo l'iterazione , .
- Uscita: dopo il prefisso ha elementi e è il massimo.
- Errori: invariante senza i valori; valido solo a fine ciclo; resto della sequenza creduto non modificato.