[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Algoritmo para permutar




Olá!

100 = <4020> = 4*4! + 0*3! + 2*2! + 0*1!

E também

4! = <1000>
6! = <100000>
4!-1 = <321>

De modo geral, eu defino:

<a[n]a[n-1]...a[1]> = a[n]*n! + a[n-1]*(n-1)! + ... + a[1]*1!, sendo 
0<=a[i]<=i

Cada número só pode ser representado de um modo. Para quem se interessa por 
algoritmos, eu inventei um para achar rapidamente todas as permutações de n 
elementos, vejam:

São dados n elementos, vou simplificar por {1,2,...,n}. Existem n! 
permutações desses elementos. A k-ésima permutação é feita da seguinte 
maneira:

Algoritmo. tomamos <a[n-1]...a[1]> = k. (achar os a[i] é fácil, similar a 
achar 1, 3 e 5 em 135)
Nós temos n espaços vazios onde vamos colocando os elementos que queremos 
permutar. Começamos da esquerda para direita, a primeira casa é o primeiro 
espaço em branco, e contamos a[k] espaços em branco para a direita, é onde 
colocamos o elemento k+1 (o 1 é posto no espaço que sobrar). Sendo que 
devemos colocar os elementos na ordem n,(n-1),...,1.

Exemplo. Para n=4, queremos descobrir a 15a. permutação k = 15 = 2*6+1*2+1*1 
= <211>, daí usamos o algaritmo e vamos preenchendo os espaços em branco.
XX4X  ( 2 espaços em branco a partir do primeiro )
X34X  ( 1 espaço em branco a partir do primeiro )
X342  ( 1 espaço em branco a partir do primeiro )
1342, e essa é a 15a. permutação

Se variarmos k de 0 até 23, teremos todas as permutações possíveis, 
calculadas de um jeito bem rápido (com o auxílio de um computador).


Obrigado!

Eduardo Casagrande Stabel.


Obs. a ordem das permutações eu inventei
________________________________________________________________________
Get Your Private, Free E-mail from MSN Hotmail at http://www.hotmail.com