52梯控论坛

 找回密码
 立即注册
搜索
查看: 24749|回复: 88
打印 上一主题 下一主题

康拓编码与解码

  [复制链接]
跳转到指定楼层
楼主
发表于 2018-12-26 12:43:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

一、康托展开:全排列到一个自然数的双射

X=an*(n-1)!+an-1*(n-2)!+...+ai*(i-1)!+...+a2*1!+a1*0!

ai为整数,并且0<=ai<i(1<=i<=n)

适用范围:没有重复元素的全排列


二、全排列的编码:

{1,2,3,4,...,n}的排列总共有n!种,将它们从小到大排序,怎样知道其中一种排列是有序序列中的第几个?

如 {1,2,3} 按从小到大排列一共6个:123 132 213 231 312 321。想知道321是{1,2,3}中第几个大的数。

这样考虑:第一位是3,小于3的数有1、2 。所以有2*2!个。再看小于第二位,小于2的数只有一个就是1 ,所以有1*1!=1 所以小于32

的{1,2,3}排列数有2*2!+1*1!=5个。所以321是第6个大的数。2*2!+1*1!是康托展开。(注意判断排列是第几个时要在康托展开的结果后+1)

再举个例子:1324是{1,2,3,4}排列数中第几个大的数:第一位是1小于1的数没有,是0个,0*3!,第二位是3小于3的数有1和2,但1已经在第一位了,所以只有一个数2,1*2! 。第三位是2小于2的数是1,但1在第一位,所以有0个数,0*1!,所以比1324小的排列有0*3!+1*2!+0*1!=2个,1324是第三个大数。

又例如,排列3 5 7 4 1 2 9 6 8展开为98884,因为X=2*8!+3*7!+4*6!+2*5!+0*4!+0*3!+2*2!+0*1!+0*0!=98884.

解释:

排列的第一位是3,比3小的数有两个,以这样的数开始的排列有8!个,因此第一项为2*8!

排列的第二位是5,比5小的数有1、2、3、4,由于3已经出现,因此共有3个比5小的数,这样的排列有7!个,因此第二项为3*7!

以此类推,直至0*0!


[cpp] view plain copy




  • #include<cstdio>  
  • const int fac[] = {1, 1, 2, 6, 24, 120, 720, 5040, 40320};///阶乘  
  •   
  • int KT(int s[], int n)  
  • {  
  •     int i, j, cnt, sum;  
  •     sum = 0;  
  •     for (i = 0; i < n; ++i)  
  •     {  
  •         cnt = 0;  
  •         for (j = i + 1; j < n; ++j)  
  •             if (s[j] < s) ++cnt;  
  •         sum += cnt * fac[n - i - 1];  
  •     }  
  •     return sum;  
  • }  
  •   
  • int main()  
  • {  
  •     int a[] = {3, 5, 7, 4, 1, 2, 9, 6, 8};  
  •     printf("%d\n", 1 + KT(a, sizeof(a) / sizeof(*a))); ///1+98884  
  • }  


三、全排列的解码

如何找出第16个(按字典序的){1,2,3,4,5}的全排列?

1. 首先用16-1得到15

2. 用15去除4! 得到0余15

3. 用15去除3! 得到2余3

4. 用3去除2! 得到1余1

5. 用1去除1! 得到1余0

有0个数比它小的数是1,所以第一位是1

有2个数比它小的数是3,但1已经在之前出现过了所以是4

有1个数比它小的数是2,但1已经在之前出现过了所以是3

有1个数比它小的数是2,但1,3,4都出现过了所以是5

最后一个数只能是2

所以排列为1 4 3 5 2


评分

参与人数 3752币 +370 积分 +80 收起 理由
德国牧羊犬 + 10
红灯笼 + 10
月亮船 + 10 + 5
华天大酒店 + 10 + 5
caonimei + 10 + 10
梅川裤子 + 10 + 5
芙蓉王 + 10
yuxin + 10
weibo + 10
马德华 + 10
市长秘书 + 10
hao123 + 10 + 23
见习爱神 + 10
牛魔王 + 10 + 7
新疆大枣 + 10 + 10
uuuppp + 10
PLAaaa + 10
韦小宝 + 10
避孕套 + 10
爱新觉罗 + 10

查看全部评分

推荐
发表于 2020-3-4 09:35:48 | 只看该作者
学习来了,虽然看不太懂
回复 支持 1 反对 0

使用道具 举报

板凳
发表于 2018-12-26 13:40:42 | 只看该作者
小手一抖,积分到手!
6#
发表于 2018-12-26 18:16:57 | 只看该作者
谢谢楼主,共同发
7#
发表于 2018-12-26 18:37:20 | 只看该作者
莫名其妙,不知所云!
9#
发表于 2018-12-26 20:42:15 来自手机 | 只看该作者
只说了一片叶子,看不见大树
10#
发表于 2018-12-27 07:33:02 | 只看该作者
小手一抖,积分到手!
11#
发表于 2018-12-28 16:04:30 | 只看该作者
我是来学习的,,,,
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

在线客服

QQ|52梯控│电梯卡延期│电梯卡复制

GMT+8, 2024-11-28 15:39

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表