白話康拓展開

2021-09-19 08:53:13 字數 1076 閱讀 3809

參考博文

主要內容:之前就聽說過處理離散的一組很大的數時,可以將這些數對映但一直不知道該怎麼對映,今天做hdu1043時了解到了康托展開,故在此記錄並用大白話解釋康托展開。

什麼是康拓展開:首先知道康托展開是幹嘛的,我們拿乙個數34152,可以看到這個數可以當成是1,2,3,4,5這五個數的一種排列,這樣的排列有5!個。而康託展開就是相當將這些排列從0開始編號,,這樣編號後就可以發現乙個很大的數被對映成了乙個很小的數。如12345這五個數的全排列一共才5!種,可見5!-1和原來的幾萬的數小了很多。

怎麼康拓展開:好了,下面貼公式。x=an*(n-1)!+an-1*(n-2)!+…+ai*(i-1)!+…+a21!+a10!

公式的解釋如下:

an就是每個數前面按單調遞增少了的數的個數,如4前面本該有1,2,3但只有3,少了兩個,所以a4=2。如5前面本該有1,2,3,4,但只有1,3,4,少乙個,a2=1。

n-1的n是數的個數,對於34152來說是5。

最後得出34152的展開後為61.

康拓展開怎麼還原:當然康托展開後也可以還原,對上面的公式逆著算就好。

已知展開後為61

用 61 / 4! = 2餘13,說明 ,說明比首位小的數有2個,所以首位為3。

用 13 / 3! = 2餘1,說明 ,說明在第二位之後小於第二位的數有2個,所以第二位為4。

用 1 / 2! = 0餘1,說明 ,說明在第三位之後沒有小於第三位的數,所以第三位為1。

用 1 / 1! = 1餘0,說明 ,說明在第二位之後小於第四位的數有1個,所以第四位為5。

最後貼上別人的**,在文章開始有鏈結

康拓展開**

//返回陣列a中當下順序的康拖對映

int cantor(int *a,int n)

; // 階乘

//康托展開逆運算

void decantor(int x, int n)

}

康拓展開和逆康拓展開

康托展開就是一種特殊的雜湊函式 把乙個整數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進...

康拓展開與逆康拓展開

首先解釋一下,所謂的康拓展開,就是能夠通過乙個式子,得到乙個排列在所有排列中的按字典序排好後的位次。而逆康托展開,則是給出排列的位次,能夠計算出排列是什麼。下面先給出康拓展開的公式 其中ai 為整數,並且 0 ai ai表示原數的第 i位在當前未出現的元素中是排在第幾個 康拓展開是乙個雙射,因此常用...

康拓展開和逆康拓展開

康拓展開模板題 複雜度o n 2 的會tle 看資料就知道了 雖然某題解說可以,不知道是不是後期加強了資料 然而我還是寫了o n 2 的 include typedef long long ll ll f 1000010 const ll mod 998244353 int a 1000010 b ...