康托展开与逆康托展开
序言:
本文记录康托展开与逆康拓展开的原理以及其应用。
1.概述
举例而言,对于 1 ~ 4 的一个全排列 [1, 2, 3, 4] 和 [4, 3, 2, 1],我们知道,从字典序而言,前者是该全排列集的第一个,后者是该集的最后一个。那么,所谓康托展开,即给定一个 nnn 位数的全排列,我们可以根据康托展开公式确定其应当是字典序中的第“几”个全排列。
由于康托展开计算的是某个全排列方式在该全排列集合中的字典序(或者说是排名),其映射关系唯一且单调,故该映射关系是可逆的。即,我们给定一个全排列的所有字符,以及某个字典序号,我们可以利用逆康托展开得到相应的那个全排列。
2.康托展开
给定一个全排列,计算其字典序。直观起见,我们举例[2, 3, 4, 1]来说明康托展开的运作步骤:
命所求字典序为 rank=0rank = 0rank=0
- 第 1 位是 2, 那么以 1 打头的所有全排列一定排在这个全排列之前,那么以 1 打头的全排列有 (3!) = 6种,rank=rank+1∗3!=6rank = rank + 1*3! = 6rank=rank+1∗3!=6。
- 第 2 位是 3,那么以 1 与 2 作为第二位的所有全排列一定在这个圈排列之前。不过我们已经让 2 打头了,因此不需要再考虑 2 占第二位的情况,只需要计算 1 占第二位的情况。rank=rank+1∗2!=8rank = rank + 1 * 2! = 8r