[总结] 康托展开及其逆运算
这里先贴一道 例题 我们先科普一下康托展开 定义: X=an*(n-1)!+an-1*(n-2)!+...+ai*(i-1)!+...+a2*1!+a1*0! ai为整数,并且0<=ai<i(1<=i<=n) 简单点说就是,判断这个数在其各个数字全排列中从小到大排第几位。 比如 1 3 2,在1、2、3的全排列中排第2位。 康托展开有啥用呢? 维基: n位(0~n-1)全排列后,其康托展开唯一且最大约为n!,因此可以由更小的空间来储存这些排列。由公式可将X逆推出对应的全排列。 它可以应用于哈希表中空间压缩, 而且在搜索某些类型题时,将VIS数组量压缩。比如:八数码,魔板等题 康托展开求法: 比如 2 1 4 3 这个数,求其展开: 从头判断,至尾结束, ① 比 2(第一位数)小的数有多少个->1个 就是1,1*3! ② 比 1(第二位数)小的数有多少个->0个 0*2! ③ 比 4(第三位数)小的数有多少个->3个 就是1,2,3,但是1,2之前已经出现,所以是 1*1! 将所有乘积相加=7 比该数小的数有7个,所以该数排第8的位置。 1234 1243 1324 1342 1423 1432 2134 2143 2314 2341 2413 2431 3124 3142 3214 3241 3412 3421 4123 4132 4213 4231 4312 4321