[Algoritmi] Bandiera tricolore
Ciao a tutti, sto studiando il problema della bandiera tricolore e ho capito il procedimento ed il relativo codice:
Il prof ha spiegato una ottimizzazione de metodo precedente che in pratica consiste nel non effettuare spostamenti inutili.
Nel caso in cui a[j] è rosso, a[j] viene scambiato con a[k]. Ma se anche a[k] è rosso, allora adesso (dopo aver effettuato lo spostamento), a[j] si trova nella parte giusta mentre a[k] no. a[k] verrà spostato nella parte corretta al passo successivo.
Per evitare questo doppio spostamento il prof introduce un ciclo while interno che finché a[k] è rosso decrementa k.
Poi nelle slide c'è scritto "Attenzione: la condizione del while esterno non viene automaticamente controllata; inoltre in questo caso è necessario fermarsi al passo prima che k oltrepassi j (perché?)".
Appunto, perchè? E dove vuole arrivare con "la condizione del while esterno non viene automaticamente controllata"?
Grazie!
/** * Passato un array come parametro, ordina i suoi elementi rispettando lo schema * della bandiera italiana. I colori sono definiti tramite la divisione con modulo: * - Verde --> a[0...i - 1]: val % 3 == 0 * - Bianco --> a[i...j - 1]: val % 1 == 0 * - Parte da esaminare --> a[j...k] * - Rosso --> a[k + 1...n - 1]: val % 2 == 0 * * 0 i j k n * |_________|________|___________________|_______| * verde bianco da esaminare rosso * * @param a array di interi */ public static void separateColors(int[] a) { int j = 0; int i = 0; int k = a.length - 1; int temp = 0; while(j <= k) { if(a[j] % 3 == 0) { temp = a[j]; a[j] = a[i]; a[i] = temp; i++; j++; } else if(a[j] % 3 == 1) j++; else { temp = a[k]; a[k] = a[j]; a[j] = temp; k--; } } }
Il prof ha spiegato una ottimizzazione de metodo precedente che in pratica consiste nel non effettuare spostamenti inutili.
Nel caso in cui a[j] è rosso, a[j] viene scambiato con a[k]. Ma se anche a[k] è rosso, allora adesso (dopo aver effettuato lo spostamento), a[j] si trova nella parte giusta mentre a[k] no. a[k] verrà spostato nella parte corretta al passo successivo.
Per evitare questo doppio spostamento il prof introduce un ciclo while interno che finché a[k] è rosso decrementa k.
Poi nelle slide c'è scritto "Attenzione: la condizione del while esterno non viene automaticamente controllata; inoltre in questo caso è necessario fermarsi al passo prima che k oltrepassi j (perché?)".
Appunto, perchè? E dove vuole arrivare con "la condizione del while esterno non viene automaticamente controllata"?
Grazie!

Risposte
Prova a guardare la "dispensa di esercizi svolti" qui:
http://www.moreno.marzolla.name/teaching/ASD2013/
Puoi trovare qualcosa di moooolto utile e spiegato bene secondo me.
http://www.moreno.marzolla.name/teaching/ASD2013/
Puoi trovare qualcosa di moooolto utile e spiegato bene secondo me.
"Giova411":
Prova a guardare la "dispensa di esercizi svolti" qui:
http://www.moreno.marzolla.name/teaching/ASD2013/
Puoi trovare qualcosa di moooolto utile e spiegato bene secondo me.
Ciao, grazie per la risposta. Ho visto le dispense con gli esercizi e se non mi sbaglio l'unico esercizio che riguarda la bandiera tricolore è il 3.12 che però non cita la miglioria che dicevo io sopra...
Comunque grazie per quelle dispense, sembrano fatte benissimo!

Prova a fare un esempio con carta e penna e vedi che capirai subito il commento.
Con il while esterno ci si ferma già al passo prima che k passa j.. no?

La condizione del while viene controllata solo ad inizio ripetizione e non all'interno. Quindi devi sempre assicurarti di mantenere le condizioni appropriate al suo interno. COmunque se k raggiunge j hai semplicemente finito, insomma il tutto è riordinato.