康托和逆康托展开

1.康托展开的解释

康托展开就是一种特殊的哈希函数

  把一个整数X展开成如下形式:

  X=a[n]*n!+a[n-1]*(n-1)!+...+a[2]*2!+a[1]*1!

  其中,a为整数,并且0<=a<i,i=1,2,..,n

  {1,2,3,4,...,n}表示1,2,3,...,n的排列如 {1,2,3} 按从小到大排列一共6个。123 132 213 231 312 321 。

  代表的数字 1 2 3 4 5 6 也就是把10进制数与一个排列对应起来。

  他们间的对应关系可由康托展开来找到。

  如我想知道321是{1,2,3}中第几个大的数可以这样考虑 :

  第一位是3,当第一位的数小于3时,那排列数小于321 如 123、 213 ,小于3的数有1、2 。所以有2*2!个。再看小于第二位2的:小于2的数只有一个就是1 ,所以有1*1!=1 所以小于321的{1,2,3}排列数有2*2!+1*1!=5个
。所以321是第6个大的数。 2*2!+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是第三个大数。

 

  康托展开的代码(C语言):
  //参数int s[]为待展开之数的各位数字,如需展开2134,则s[4]={2,1,3,4}.
  int fac[]={1,1,2,6,24,120,720,5040,40320,362880};//...
  long cantor(int s[],int n){
  int i,j,temp,num;
  num=0;
  for(i=1;i<n;i++){//n为位数
  temp=0;
  for(int j=i+1;j<=n;j++){
  if(s[j]<s[i]) temp++;
  }
  num+=fac[n-i]*temp;
  }
  return (num+1);
  }
\

 

康托展开的逆运算
  例 {1,2,3,4,5}的全排列,并且已经从小到大排序完毕

  (1)找出第96个数

  首先用96-1得到95

  用95去除4! 得到3余23

  用23去除3! 得到3余5

  用5去除2!得到2余1

  用1去除1!得到1余0有3个数比它小的数是4

  所以第一位是4

  有3个数比它小的数是4但4已经在之前出现过了所以是5(因为4在之前出现过了所以实际比5小的数是3个)

  有2个数比它小的数是3

  有1个数比它小的数是2

  最后一个数只能是1

  所以这个数是45321

  (2)找出第16个数

  首先用16-1得到15

  用15去除4!得到0余15

  用15去除3!得到2余3

  用3去除2!得到1余1

  用1去除1!得到1余0

  有0个数比它小的数是1

  有2个数比它小的数是3 但由于1已经在之前出现过了所以是4(因为1在之前出现过了所以实际比4小的数是2)

  有1个数比它小的数是2 但由于1已经在之前出现过了所以是3(因为1在之前出现过了所以实际比3小的数是1)

  有1个数比它小得数是2 但由于1,3,4已经在之前出现过了所以是5(因为1,3,4在之前出现过了所以实际比5小的数是1)

  最后一个数只能是2

  所以这个数是14352

 

 

 

时间: 2024-09-20 08:14:30

康托和逆康托展开的相关文章

简单的数学思想

l  筛法求素数 把从1开始的.某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉.剩下的数中选择最小的数是素数,然后去掉它的倍数.依次类推,直到筛子为空时结束.如有: 1 2 3 4 5 6 7 89 10 11 12 13 14 1516 17 18 19 20 21 22 23 24 2526 27 28 29 30 1不是素数,去掉.剩下的数中2最小,是素数,去掉2的倍数,余下的数是: 3 5 7 9 11 13 1517 19 21 23 25 27 29 剩下的数中3最小

全排列的编码与解码:康托展开 (附完整代码)

一.康托展开:全排列到一个自然数的双射 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}中

正则匹配原理之 逆序环视深入 ._正则表达式

说明:部分内容有待进一步研究和修正,因为最近工作太忙,暂时抽不出时间来,未研究过的可以跳过这一篇,想研究的不要被我的思路所左右了,有研究清楚的还请指正1 问题引出 前几天在CSDN论坛遇到这样一个问题: var str="8912341253789"; 需要将这个字符串中的重复的数字给去掉,也就是结果89123457. 首先需要说明的是,这种需求并不适合用正则来实现,至少,正则不是最好的实现方式. 这个问题本身不是本文讨论的重点,本文所要讨论的,主要是由这一问题的解决方案而引出的另一个

《逆袭大学》文摘——9.5 用算法和数学奠定专业基础

有不少读者给我来信,咨询的是关于数学和算法对学习计算机的意义.这样的话题,在我的专栏中很多文章里都提到过.在拙作<逆袭大学--传给IT学子正能量>中,在这方面写了不少文字,现将其中的9.5节全文摘录在此文中,以供参考. 更多话题,见<逆袭大学--传给IT学子正能量>全书目录. 9.5 用算法和数学奠定专业基础 一个程序设计的初学者,在刚刚开始学习时,会认为编程中语言是最重要的.没有语言,没有掌握好编程语言,写不出程序来.而后又知道熟练运用语言仅仅是学会了一种表达的方式而已,如同一个

《士兵突击》第二季12强迎来强悍对手巨人城废墟本周展开残酷巷战

卫视加多宝凉茶<士兵突击>第二季将在本周五播出第10集.在上一集"寂静村"猎杀行动之后,幸运晋级的12强本周将在"巨人城废墟"迎来一场残酷的巷战.强悍对手 残酷巷战在上一集的猎杀行动中,3名退役老兵反串歹徒,为猛虎和猎豹两队制造了不小的麻烦.最后一次猎杀任务,猎豹队伤亡惨重,甚至队长宋晓东也被击中退出比赛,最终导致了猎豹队整体失利.在本周第十集的较量中,他们所遇到的对手将更加强悍.这一集中,12名现役特警将化身悍匪,向队员们的防守阵地发动亡命突袭,双方将

土豪逆袭?民营银行看你的了

在各路实业大亨和金融机构大佬的密切关注下,市场期待已久的民营银行终于是破茧而出羽化成蝶了.银监会已经正式批准了三家民营银行的筹建申请,它们分别是华北.麦购为主发起人的天津金城银行:腾讯.百业源.立业为主发起人的深圳前海微众银行:正泰.华峰为主发起人的温州民商银行.到此为止,这场已经喧闹了一年多是件的民营银行试点名额之争总算是有了一个较为明确的定论.但是,在商业银行业务同质化.利率市场化.坏账隐忧不断攀升的大环境下,"土豪"进军金融圈到底是福是祸?而民营银行的新兵又应该怎样与传统银行周旋

《逆袭大学》文摘——7.1.2 中学生学习单片机的启示

7.1 找寻失去的学习潜质 (主题)学习能力最强.进步最快的时期,是婴儿期.我们要像婴儿一般地去学习. 7.1.1 我们原本就有的学习潜质 引用台湾大学教授黄武雄先生的著作<童年与解放>,儿童的三大学习潜质: 首先,辨认整体特征的能力是婴儿天生具有的自然能力. 其次,体验的勇气是婴儿的另一潜质. 再次,宽容而心无偏见,是婴儿的第三个原始创造特质. 7.1.2 中学生学习单片机的启示 学习无止境.三人行,必有我师.这样的至理名言在我的教育实践中时时显现.我从我的学生成功的学习中获得灵感,进而将之

负荷按容分配的无线并联逆变系统收敛性分析

南昌航空大学信息工程学院.科华恒盛股份有限公司.钦州学院物理与电子工程学院的研究人员刘斌.卢雄伟.熊勇等,在2015年第21期<电工技术学报>上撰文,对于非同等功率等级的逆变器无线并联系统而言,因为均分系统负荷可能导致小容量逆变器无法工作,所以必须让负荷按照正比于逆变器模块容量的方式实现分配. 围绕下垂控制原理,通过对输出电压幅值和频率进行收敛性分析,推导出逆变负荷按容分配的充分条件,这一充分条件对下垂控制系数的确定具有很好的指导作用.此外,通过引入虚拟阻抗法和双环调节器,搭建了由两台不同容量

我为什么说程序猿几乎不可能逆袭为CIO(论一个CIO的自我修养)

文/张淑丽 随着企业发展,像CFO.CTO.COO等各种CXO纷纷出现,CIO(Chief Information Officer,即首席信息官)也不例外.无论大小企业都开始设置CIO这一职位,很多IT部门的主管,甚至是搞搞公司电脑运维的基层职员都开始被称为CIO.但是拜托,目前,CIO只有在一些全球500强的大企业才设立的职位,如Coca Cola, DSM 等名声响当当的大企业.在美国,企业的CIO相当于副总经理直接对最高决策者负责.而到了中国,遍地CIO. 数字时代 CIO的演变之路 企业