康托展开

1 篇文章 0 订阅

前一阵人工智能课需要写一个八数码的题,其中用到了康托展开。
但当时是直接使用的公式,并没有仔细阅读具体的原理。
所以,今天整理一下。


简介

康托展开是全排列到自然数的双射,常用于对全排列的哈希。
康托展开实质是表示的是当前排列在全排列中的位置。

公式

n个数字排列的康托展开公式:
这里写图片描述
其中,ai表示第i位数字在当前集合是第ai小的数字。

逆过程

初始化集合Cn为n个数字的全集,Xn=X。

Xi mod (i-1)!,商为qi,余数为ri;
则ai为当前集合中第qi小的数(第0小的数为最小数);
从集合中删除ai,得到集合C(i-1);
X(i-1)=ri;

重复以上过程,即可求出X对应排列。

举例

n=9;

康托展开

3 5 7 4 1 2 9 6 8 展开为 X=2*8!+3*7!+4*6!+2*5!+0*4!+0*3!+2*2!+0*1!+0*0!=98884;
初始集合为{1,2,3,4,5,6,7,8,9},3是第2小的数字,所以a9=2;然后从集合中删除3。
当前集合{1,2,4,5,6,7,8,9},5是第3小的数字,所以a8=3;然后从集合中删除5。
……

康托展开逆过程

98884除以8!,商2,余数18240;当前集合{1,2,3,4,5,6,7,8,9}第2小的数为3,所以x9=3。
18240除以7!,商3,余数3120;当前集合{1,2,4,5,6,7,8,9}第3小的数为5,所以x8=5。
……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值