Sink

沉舟侧畔千帆过

  • 主页
  • 归档
  • 书籍
  • 书签
  • 技能树
  • 工具箱
  • LeetCode
  • 关于我
所有文章 友情链接 +1s

  • 主页
  • 归档
  • 书籍
  • 书签
  • 技能树
  • 工具箱
  • LeetCode
  • 关于我

康托展开

Published on 2009 / 11 / 10

康托展开的公式

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

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

其中,a为整数,并且 0 <= a[i] < i(1<=i<=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++语言):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
unsigned long cantor(unsigned long S) {
long x = 0, i, p, k, j;
bool hash[8] = {false};
for (i = 8; i >= 2; i--) {
k = S >> 3 * (i - 1);
S -= k << 3 * (i - 1);
hash[k] = true;
p = k;
for (j = 0; j <= k - 1; j++)
if (hash[j])
p--;
x += fac[i - 1] * p;
}
return x;
}

康托展开的代码(Pascal语言):

s为数组,用来存储要求的数,形如(1,3,2,4)。n为数组中元素个数。fac[x]为x!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function cantor:longint:;
var
i,j,temp:integer;
num:longint;
begin
num:=0;
for i:=1 to n-1 do
begin
temp:=0;
for j:=i+1 to n do
if s[j]<s[ i ] then inc(temp);
num:=num+fac[n-i]*temp;
end;
cantor:=num+1;
end;

康托展开的代码(C语言):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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++) {
temp = 0;
for (int j = i + 1; j <= n; j++) {
if (s[j] < s[i]) temp++;
}
num += fac[n - i] * temp;
}
return (num + 1);
}
赏

很惭愧,就做了一点微小的工作

支付宝
微信
2009年年末,病了
本部的蹂躏之旅
Copyrights © 2009 - 2025 Sink. All Rights Reserved.
Hexo Illya
  • 所有文章
  • 友情链接
  • +1s

tag:

  • ubuntu
  • dns
  • deepin
  • rfc
  • django
  • database
  • work
  • python
  • greenplum
  • postgres
  • how-to
  • linux
  • react
  • firefox
  • nginx
  • vijos
  • go
  • toml
  • tools
  • usaco
  • IPv6
  • gpg

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • 浮云计算
  • 成成个人学习小站
  • Victor 的自留地
  • amtoaer
  • lxkaka
  • 酷壳CooShell
  • 曜彤.手记

一个人的命运啊,当然要靠自我奋斗,但是也要考虑到历史的行程。

很惭愧,就做了一点微小的工作,谢谢大家。