康托和逆康托展開

2022-01-28 18:28:38 字數 1404 閱讀 7045

1.康托展開的解釋

康托展開就是一種特殊的雜湊函式

把乙個整數x展開成如下形式:

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

其中,a為整數,並且0<=a表示1,2,3,...,n的排列如 按從小到大排列一共6個。123 132 213 231 312 321 。

代表的數字 1 2 3 4 5 6 也就是把10進製數與乙個排列對應起來。

他們間的對應關係可由康托展開來找到。

如我想知道321是中第幾個大的數可以這樣考慮 :

第一位是3,當第一位的數小於3時,那排列數小於321 如 123、 213 ,小於3的數有1、2 。所以有2*2!個。再看小於第二位2的:小於2的數只有乙個就是1 ,所以有1*1!=1 所以小於321的排列數有2*2!+1*1!=5個

。所以321是第6個大的數。 2*2!+1*1!是康托展開。

再舉個例子:1324是排列數中第幾個大的數:第一位是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]=.

int fac=;//...

long cantor(int s,int n)的全排列,並且已經從小到大排序完畢

(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

康托展開和逆康托展開

為什麼我在en wiki上查不到啊tat 嗯,康托展開就是乙個從n排列集合到自然數集合的對映.並且這個對映剛好對應了字典序.比如,設這個函式為c,那麼c 0,c 5,c 3.用於排列與數字的轉換.使用的時候一定要注意先把排列離散化成0,1,n 1的排列再做.否則要用n 2的時間來找 在全集中比數i小...

康托展開和康托逆展開

x a n n 1 a n 1 n 2 a i i 1 a 1 0 其中,a i 為整數,並且x a n n 1 a n 1 n 2 a i i 1 a 1 0 這就是康托展開。1324是排列數中第幾個大的數 第一位是1小於1的數沒有,是0個,0 3 第二位是3小於3的數有1和2,但1已經在第一位了...

康托展開和逆康托展開

康托展開是乙個全排列到乙個自然數的雙射,常用於構建hash表時的空間壓縮。設有n個數 1,2,3,4,n 可以有組成不同 n 種 的排列組合,康托展開表示的就是是當前排列組合在n個不同元素的全排列中的名次。x a n n 1 a n 1 n 2 a i i 1 a 1 0 其中,a i 為整數,並且...