Welcome to Scribd, the world's digital library. Read, publish, and share books and documents. See more
Download
Standard view
Full view
of .
Save to My Library
Look up keyword
Like this
12Activity
0 of .
Results for:
No results containing your search query
P. 1
Generazione_permutazioni_v1.2

Generazione_permutazioni_v1.2

Ratings: (0)|Views: 2,362 |Likes:
Published by theDarshan
a review of foremost algorithm for generating permutation, written in Italian and released under the Creative Commons licence

Tags: algoritmi numerici, algoritmica, algoritmo, implementazione, iterativo, java, johnson, Johnson-Trotter, ottimizzato, permutazioni, Steinhaus, trotter,factoriadic,Lehmner code
a review of foremost algorithm for generating permutation, written in Italian and released under the Creative Commons licence

Tags: algoritmi numerici, algoritmica, algoritmo, implementazione, iterativo, java, johnson, Johnson-Trotter, ottimizzato, permutazioni, Steinhaus, trotter,factoriadic,Lehmner code

More info:

Published by: theDarshan on Apr 07, 2010
Copyright:Attribution Non-commercial Share Alike

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

02/07/2013

pdf

text

original

 
Algoritmi per la generazione di permutazioni
Vincenzo La Spesa4 marzo 2010
v1.2
Indice
Quest’opera `e stata rilasciata sotto la licenza Creative Commons Attribuzione-Non commerciale-Condividi allo stesso modo 2.5 Italia. Per leggere una copia della li-cenza visita il sito web http://creativecommons.org/licenses/by-nc-sa/2.5/it/ o spe-disci una lettera a Creative Commons, 171 Second Street, Suite 300, San Francisco,California, 94105, USA.
1
 
1 Algoritmo iterativo per generare permutazioni in ordine lessicografico
L’algoritmo seguente `e probabilmente il pi`u semplice algoritmo iterativo per listare lepermutazioni di un insieme di elementi, analizza semplicemente la permutazione attualeper ricavarne la prossima basandosi sul fatto che le permutazioni devono seguire unordinamento lessicografico (nel caso numerico qui analizzato ogni permutazione deveessere la minima permutazione maggiore di quella corrente)considerando la permutazione come un vettore di n elementi numerici l’algoritmodetermina la permutazione successiva nel seguente modo:1. a partire dall’ultimo elemento scorre l’array cercando il primo elemento precedutoda un elemento minore2. se non esiste si `e giunti all’ultima permutazione possibile e l’algoritmo deve termi-nare3. se esiste ricomincia a scorrere il vettore dalla fine cercando il primo elementomaggiore all’elemento trovato al punto14. si invertono gli elementi trovati al punto1 e al punto35. se lo scambio non `e avvenuto tra elementi di livello minimo (l’ultimo e il penultimo)si ripristina l’ordinamento interno invertendo le posizioni degli elementi che sitrovano tra l’elemento trovato al punto1 e quello trovato al punto3l’algoritmo `e molto semplice e molto generico ma non `e efficiente, infatti il fatto di doveranalizzare a ogni iterazione la struttura attuale del vettore ne incrementa di molto lacomplessit`a.Listing 1: Algoritmo semplice
public boolean
prossima ()
{
int
i = len
1;
while
( i
>
0 && ( elementi [ i
1]
>
= elementi [ i ])) i
−−
;
i
( i==0)
return false
;
int
j = len ;
// (i 
1) `e l elemento trovato con i l ciclo precedente
while
( elementi [ j
1]
<
= elementi [ i
1]) j
−−
;swap( i
1, j
1);i++; j = len ;
// inverto gli elementi tra i due elementi scambiat
while
( i
<
j )
{
swap( i
1, j
1);i++; j
−−
;
}
return true
;
}
2
 
2 Algoritmo ricorsivo per generare permutazioni
L’uso di un algoritmo ricorsivo per la generazione di permutazioni non `e particolarmen-te conveniente perche non permette di generare una permutazione per volta, e inoltrel’approccio iterativo `e di pers`e pi`u veloce perche non usa memoria di stack, detto questoho deciso di includere comunque questo algoritmo come esempio “didattico”.L’implementazione ricorsiva `e una tipica applicazione dell’approccio
divide et impera Le permutazioni di un vettore di n elementi si ottengono calcolando le permutaziondel sottovettore di n-1 elementi e poi scambiando l’n-esimo elemento con ogni elemen-to del sottovettore. Il caso base `e la permutazione di un vettore di due elementi che `esemplicemente uno scambio
Listing 2: Algoritmo ricorsivo
static void
permuta ricorsivo (
int
[ ] elementi ,
int
da ,
int
a)
{
int
k;
i
(a
>
da)
{
for
(k = a; k
>
= da; k
−−
)
{
Array util .swap( elementi , k, a );permuta ricorsivo ( elementi , da , a
1);Array util .swap( elementi , k, a );
}}
else
{
System . out . println ( Array util .dump( elementi ));
}}
2,1,3,4 2,1,4,3 4,1,3,2 2,4,3,11,3,2,4 1,4,2,3 1,3,4,2 4,3,2,13,1,2,4 4,1,2,3 3,1,4,2 3,4,2,13,2,1,4 4,2,1,3 3,4,1,2 3,2,4,12,3,1,4 2,4,1,3 4,3,1,2 2,3,4,1Tabella 1: Esecuzione dell’algoritmo su un vettore di 4 elementi3

Activity (12)

You've already reviewed this. Edit your review.
1 hundred reads
1 thousand reads
theDarshan liked this
theDarshan liked this
Francesco Frank liked this

You're Reading a Free Preview

Download
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->