Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
IterativePermutations - IterativePermutations.java

IterativePermutations.java

Caricato da: Oligoatria
Scarica il programma completo

  1. /*
  2.         Algoritmo pensato a partire dalla consegna di un esercitazione
  3.         Universitaria (ing.unipd).
  4.         Si tratta di una soluzione iterativa. E' incluso l'output del
  5.         tempo di esecuzione.
  6.         Algoritmo e codice by Oligoatria
  7. */
  8.  
  9. public class IterativePermutations
  10. {
  11.         public static void main(String [] args)
  12.         {
  13.                 if (args.length == 0){
  14.                         System.out.println("Devi dare una stringa come parametro sulla riga di comando");
  15.                         System.exit(0);
  16.                 }
  17.                 long time = System.currentTimeMillis(); // tempo di sistema iniziale
  18.                 String[] s = getPermutations(args[0]);          // calcolo le permutazioni // richiede un parametro sulla riga di comando
  19.                 time = System.currentTimeMillis() - time;       // tempo di sistema finale
  20.                 for (int i=0; i<s.length; i++)          // stampo ogni permutazione
  21.                 {
  22.                         System.out.println(i+": "+s[i]);
  23.                 }
  24.                 System.out.println("Tempo di calcolo: " + time + "ms\nNumero di permutazioni: "+s.length);
  25.         }
  26.  
  27.         public static String[] getPermutations(String s)
  28.         {
  29.                 /* Controllo che non ci siano caratteri ripetuti */
  30.                         for (int i=0; i<s.length(); i++){
  31.                                 for (int j=i+1; j<s.length(); j++)
  32.                                         if (s.charAt(i) == s.charAt(j))
  33.                                                 throw new IllegalArgumentException();
  34.                         }
  35.                 /* Creo le stringhe */
  36.                         int len = fattoriale(s.length());
  37.                         /* Inizializzo la matrice */
  38.                                 char[][] mat = new char[len][s.length()];
  39.                                 for (int i=0; i<len; i++){
  40.                                         for (int j=0; j<s.length(); j++){
  41.                                                 mat[i][j] = ' ';                // carattere vuoto
  42.                                         }
  43.                                 }
  44.                         for (int i=0; i<s.length(); i++) // per ogni carattere della stringa
  45.                         {
  46.                                 char c = s.charAt(i);   // carattere da inserire nel corso dell'iterazione
  47.                                 int fattore = fattoriale( (s.length()-i) -1 );  // il fattore di permanenza della posizione nel ciclo di lavoro attuale
  48.  
  49.                                 /* Mi porto alla prima posizione libera dell'array corrente, con l'indice k */
  50.                                         int k = getFreePosition(mat[0], 0);     // mi restituisce l'indice del primo carattere vuoto, a partire da 0 per ritornare ciclicamente allo stesso valore
  51.                                         if (k<0)
  52.                                                 return null;
  53.                                        
  54.                                 for (int j=0; j<len;j++)        // per ogni permutazione
  55.                                 {
  56.                                         mat[j][k] = c;
  57.                                         if ( (j<len-1)&&( ((j+1) % fattore) == 0) ){
  58.                                                 k = getFreePosition(mat[j+1], k+1);     // mat[j][k] è sicuramente occupata --> parto da k+1
  59.                                                 if (k<0)
  60.                                                 return null;
  61.                                         }
  62.                                 }
  63.                         }
  64.  
  65.                 /* Costruisco le stringhe da restituire */
  66.                         String[] as = new String[len];
  67.                         for (int i=0; i<len; i++)
  68.                         {
  69.                                 as[i] = new String(mat[i]);
  70.                         }
  71.                        
  72.                
  73.                 return as;
  74.         }
  75.  
  76.         private static int getFreePosition(char[] s, int start) // restituisce la successiva posizione libera
  77.         {
  78.                 if (start > s.length)
  79.                         throw new IllegalArgumentException();
  80.                 int n = start;
  81.                 for (; n < s.length; n++)       // controllo da start alla fine dell'array
  82.                         if (s[n] ==  ' ')
  83.                                 return n;
  84.                 for (n=0; n < start; n++)       // dall'inizio dell'array a start (escluso)
  85.                         if (s[n] ==  ' ')
  86.                                 return n;
  87.                 return -1;      // errore: nessuna posizione vuota trovata
  88.         }
  89.  
  90.         public static int fattoriale(int n)
  91.         {
  92.                 if (n<0)
  93.                         throw new IllegalArgumentException();
  94.                 if (n <= 1)
  95.                         return 1;
  96.                        
  97.                 int val = 1;
  98.                 for (int i=n; i>1; i--){
  99.                         val *= i;
  100.                 }
  101.                 return val;
  102.         }
  103. }