全排列与整数域的映射

今天突然想到了全排列这个经典问题。
以前了解到的主要方法是经典的基于交换的递归方法。
然后又了解到了基于字典序的方法。

算法的大致流程都是,给定一个排列,如果存在下一个排列则求出下一个排列。

有一个常识就是:n个不重复元素的全排列个数为n!.

那么n!与这n个排列有没有办法映射?(肯定是存在这个映射的)

姑且在此,抛砖引玉,发明一个概念。

变进制数:对于一个数,若各个数位进制不完全相同,那么该数就称为变进制数。
再定义一类特殊的变进制数:
n阶阶乘数:对于一个变进制数,若该变进制数的第n位进制为n,那么该数称为n阶阶乘数。
记为:F(b1,b2,…,bn) b1,b2,…,bn为第n位的值
易知:n阶阶乘数的表示范围为:0~n!-1.

那么全排列与整数域映射的问题就很好解决了:
对于三个整数的全排列

1,2,3的各位逆序数序列为:
0,0,0
3,2,1的各位逆序数序列为:
0,1,2
则对于全排列
b1,b2,b3
其整数域值为
F(逆序数序列)

例如1,2,3的全排列:
1,2,3
1,3,2
2,1,3
2,3,1
3,1,2
3,2,1
对应的3阶阶乘数为:
F(0,0,0)
F(0,0,1)
F(0,1,0)
F(0,0,2)
F(0,1,1)
F(0,1,2)
对应的整数为:
0
1
3
2
4
5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值