博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[总结] 康托展开及其逆运算
阅读量:5067 次
发布时间:2019-06-12

本文共 1446 字,大约阅读时间需要 4 分钟。

这里先贴一道

我们先科普一下康托展开

定义:

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

放一下程序的实现

int contor(int x[]){    int p=0;    for(int i=1;i<=n;i++){        int t=0;        for(int j=i+1;j<=n;j++){            if(x[i]>x[j]) t++;        }        p+=t*fac[n-i];    }    return p+1;}

康托展开的逆:

康托展开是一个全排列到自然数的双射,可以作为哈希函数。

所以当然也可以求逆运算了。

逆运算的方法:

假设求4位数中第19个位置的数字。

① 19减去1  → 18

② 18 对 3! 作除法 → 得3余0

③  0对 2! 作除法 → 得0余0

④  0对 1! 作除法 → 得0余0

据上面的可知:

我们第一位数(最左面的数),比第一位数小的数有3个,显然 第一位数为→ 4

比第二位数小的数字有0个,所以 第二位数为→1

比第三位数小的数字有0个,因为1已经用过,所以第三位数为→2

第四位数剩下 3

该数字为  4123  (正解)

 

再上代码

void reverse_contor(int x){    memset(vis,0,sizeof vis);    x--;    int j;    for(int i=1;i<=n;i++){        int t=x/fac[n-i];        for(j=1;j<=n;j++){            if(!vis[j]){                if(!t) break;                t--;            }        }        printf("%d ",j);        vis[j]=1;        x%=fac[n-i];    }    puts("");}

 

转载于:https://www.cnblogs.com/YoungNeal/p/8504123.html

你可能感兴趣的文章
jdk1.8 api 下载
查看>>
getElement的几中属性介绍
查看>>
HTML列表,表格与媒体元素
查看>>
雨林木风 GHOST_XP SP3 快速装机版YN12.08
查看>>
java对象的深浅克隆
查看>>
数据结构3——浅谈zkw线段树
查看>>
Introduction to my galaxy engine 2: Depth of field
查看>>
Python 3.X 练习集100题 05
查看>>
设计器 和后台代码的转换 快捷键
查看>>
Monkey测试结果分析
查看>>
STL——配接器、常用算法使用
查看>>
STL容器之vector
查看>>
无法向会话状态服务器发出会话状态请求
查看>>
数据中心虚拟化技术
查看>>
01入门
查看>>
复习文件操作
查看>>
SQL Server 使用作业设置定时任务之一(转载)
查看>>
第二阶段冲刺-01
查看>>
BZOJ1045 HAOI2008 糖果传递
查看>>
发送请求时params和data的区别
查看>>