Endsieg77's Studio.

Cantor Expansion

2021/01/08 Share

9位康托展开代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<bits/stdc++.h>
using namespace std;
int factorial[] = {1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880};
int a[10];
int CantorExpansion(int *stat) {
int index = 0, counted;
for(int i = 0; i < 9; ++i) {
counted=0;
for(int j = i + 1; j < 9; ++j)
if(stat[j] < stat[i])
++counted;
index += counted * factorial[8 - i];
}
return index;
}
int main(int argc, char *argv[]) {
for(int i = 0; i < 9; ++i) cin >> a[i];
cout << CantorExpansion(a) << endl;
return 0;
}

康托展开从一个不重复序列中得到某个排列在全排列中的字典序。


以9位(01235678)为例:

State 012345678 012345687 012345768 876543210
Cantor Value 0 1 2 362880

原理:


  1. 从第一位开始,寻找往后序列中比第一位小的数,将其放在首位,剩下的数全排列

  2. 固定第一位,寻找往后序列比第二位小的数,将其放在第二位,剩下的数全排列

  3. 往后按此规律即可,直到遍历到最后一位
    则返回值:

CATALOG
  1. 1. 9位康托展开代码:
    1. 1.1. 康托展开从一个不重复序列中得到某个排列在全排列中的字典序。
    2. 1.2. 原理: