Rappresentazione e algoritmi Vincenzo Lombardo Corso di laurea magistrale in Cinema e nuovi media 2013-­‐14 Algoritmo anagrammi Stru>ura generale della soluzione ESEMPIO: LIBANO LIBONA LIBNOA BOLINA NABOLI ALBINO … BOLINA ALBINO Input: una parola Combinatorio: Trova la prossima permutazione della parola subrou4ne UlRma permutazione Nuova permutazione Boolean: Ricerca la permutazione nel FALSE dizionario TRUE Output: tuE gli anagrammi Dizionario ( LIBANO, BOLINA, ALBINO ) Cominciamo dal facile: Ricerca nel dizionario • Input: una parola • var DIZ: array di N parole • for i da 1 a N – if parola = DIZ[i] then return TRUE • return False • Output: TRUE/FALSE Combinatorio • Occorre pensare a generare tu>e le permutazioni • Nel caso delle parole ci sono anche le>ere ripetute, per cui occorrerebbe eliminare le permutazioni già apparse (noi trascuriamo questo problema) • Si esplora prima l’universo del problema Idea: scambio di posizioni AMACA CMAAA MAACA AAACM ACAMA AAMCA AMCAA AMAAC AMAAC AMACA AMCAA MCAAA AAACM CAAAM ACAAM CAAMA MAACA ACAMA AAMCA ACAAM ACMAA AMACA AMACA AMCAA MCAAA AACAM MAAAC MACAA AAMCA MAAAC AAAMC A>enzione ai duplicaR! Chi mi assicura che non faccio più operazioni del necessario ? … Idea: enumerazione ordinata A-­‐1, M-­‐2, A-­‐3, C-­‐4, A-­‐5 • • • • • • • • • • A-­‐1 / M-­‐2, A-­‐3, C-­‐4, A-­‐5 A-­‐1, M-­‐2 / A-­‐3, C-­‐4, A-­‐5 A-­‐1, M-­‐2, A-­‐3 / C-­‐4, A-­‐5 A-­‐1, M-­‐2, A-­‐3, C-­‐4 / A-­‐5 A-­‐1, M-­‐2, A-­‐3, C-­‐4, A-­‐5 / A-­‐1, M-­‐2, A-­‐3, C-­‐4 / A-­‐5 A-­‐1, M-­‐2, A-­‐3, / C-­‐4 A-­‐5 A-­‐1, M-­‐2, A-­‐3, C-­‐4 -­‐-­‐-­‐ A-­‐1, M-­‐2, A-­‐3, A-­‐5 A-­‐1, M-­‐2, A-­‐3, A-­‐5, C-­‐4, • A-­‐1, M-­‐2, A-­‐3, A-­‐5, C-­‐4 • Si introduce un ordine tra le le>ere per tener traccia di cosa scambio … • Si lavora sempre con elemenR di ordine maggiore finché non ho fa>o tuE gli scambi possibili … • Come si rende tu>o ciò un algoritmo? Generazione di permutazioni in ordine lessicografico • Genera una permutazione a parRre da una permutazione data • Lo scopo è di generare le permutazioni in ordine crescente (rispe>o all’ordine imposto) Passi dell’algoritmo ad alto livello Data una permutazione, nell’array A, di lunghezza N 1. Trova il più grande k tale che A[k] < A[k + 1]. Se tale indice k non esiste, allora questa era l’ulRma permutazione 2. Trova il più grande l tale che A[k] < A[l] (l’indice l esiste di sicuro, dal momento che A[k + 1] è più grande di A[k]) 3. Scambia i valori A[k] e A[l]. 4. InverR la sequenza dalla posizione [k + 1] alla posizione [N] Esempio sui numeri 1 2 3 4 0 1 2 3 1 3 2 4 0 1 2 3 Assunzione: cursore array va da 0 a N-­‐1 1. k = 2, il massimo indice tale che A[k] (=3) < A[k + 1] (=4) 2. l = 3, A[l] (=4) è l’unico valore della sequenza tale che > A[k] (=3) 3. Si scambiano i valori di A[2] e A[3]: la sequenza diventa [1,2,4,3] 4. La so>o-­‐sequenza dopo k (da k+1) viene inverRta: tra>andosi di un unico valore A[3], la so>o-­‐sequenza rimane idenRca. 1 2 4 3 Risultato: [1,2,4,3] 1. k = 1, il massimo indice tale che A[k] (=2) < A[k + 1] (=4) 0 1 2 3 2. l = 3, A[l] (=3) è il massimo valore della sequenza tale che > A[k] (=2) 3. Si scambiano i valori di A[1] e A[3]: la sequenza diventa [1,3,4,2] 4. La so>o-­‐sequenza dopo k (da k+1) viene inverRta (indici 2 e 3): [1,3,2,4] Esempio (cont.) 1 3 2 4 0 1 2 3 1. k = 2, il massimo indice tale che A[k] (=2) < A[k + 1] (=4) 2. l = 3, A[l] (=4) è il massimo valore della sequenza tale che > A[k] (=3) 3. Si scambiano i valori di A[2] e A[3]: la sequenza diventa [1,3,4,2] 4. La so>o-­‐sequenza dopo k (da k+1) viene inverRta: tra>andosi di un unico valore A[3], la so>o-­‐sequenza rimane idenRca. 1 3 4 Risultato: [1,3,4,2] 0 1 2 Si procede fino alla 24-­‐esima permutazione ([4,3,2,1]), per la quale non esiste alcun k per cui A[k] < A[k + 1], cioè è l’ulRma permutazione. 2 3 Raffinamento algoritmo lessicografico con le stru>ure di controllo note Input parola = array di N caratteri (cursori da 0 a N-1) var A = parola; var k,l interi; N costante repeat (1) var i intero; boolean trovato = false; for i da 0 a N-2 if A[i] < A[i+1] then k=i; trovato = true; if trovato == false then exit; Ciclo esterno repeat-­‐un4l fino a esaurimento permutazioni In A l’ul4ma permutazione (2) (3) (4) for i da 0 a N-i if A[k] < A[i] then l=i; var buffer = A[k]; A[k] = A[l]; A[l]=buffer; var B: array di N-1-k caratteri for i da 0 a N-k-2 B[i]=A[N-1-i] for i da 0 a N-k-2 A[k+1+i]=B[i] until trovato==false buffer: memoria di supporto per lo scambio B array di supporto Esercizio • Simulare come da esempio precedente su una parola di 4 le>ere (24 permutazioni), aggiungendo un ordine arbitrario • Esempio: ROSA R-­‐1 O-­‐2 S-­‐3 A-­‐4 0 1 2 3 • Nell’ordine introdo>o: R-­‐1 < O-­‐2 < S-­‐3 < A-­‐4 • Presentare al docente la simulazione dell’algoritmo