Algoritmos de permutação rápida -> número -> mapeamento de permutação

Eu tenho n elementos. Por exemplo, digamos, 7 elementos, 1234567. Sei que existem 7! = 5040 permutações possíveis destes 7 elementos.

Eu quero um algoritmo rápido composto por duas funções:

f (número) mapeia um número entre 0 e 5039 para uma permutação única e

f '(permutação) mapeia a permutação de volta para o número do qual ela foi gerada.

Eu não me importo com a correspondência entre número e permutação, desde que cada permutação tenha seu próprio número único.

Então, por exemplo, eu posso ter funções onde

f(0) = '1234567'
f'('1234567') = 0

O algoritmo mais rápido que vem à mente é enumerar todas as permutações e criar uma tabela de consulta em ambas as direções, de modo que, uma vez criadas as tabelas, f (0) seria O (1) e f ('1234567') seria um pesquisa em uma string. No entanto, isso é fome de memória, especialmente quando n se torna grande.

Alguém pode propor outro algoritmo que funcione rapidamente e sem a desvantagem da memória?