僅僅只是為了自己的另一篇部落格水了乙份
康托展開是指乙個全排列到乙個自然數的雙射,因為全排列是不重複的,所以也有逆康拓展開
在八數碼問題中,如果想法簡單一點,直接用陣列987654321來開,就算是bool型別也會爆
但是用康托展開對映後,最大只需要開到
令x為康托展開後的對應值
這裡的a[i]表示在i後面還有幾個比它本身小的值
注意,此處計算出來的x應為從0開始排的結果,如果習慣從1開始則還要+1
對於數列
我們用康托展開試一下
所以這個數列應該是全排的第51個
大家可以手推一下,也可以把資料換小一點驗證
還是用剛剛那個資料
康拓返回值是50
具體過程如下
il it cantor(ch s) {
memset(flag,1,sizeof(flag));
it ans=0,temp;
for(it i=0;i<9;i++) {
flag[s[i]-'0']=0;//已經掃過,後面就不必再計算了
temp=0;
for(it j=0;j逆康拓展開因為這道題裡不需要,作者就偷乙個懶,請大家自己想好辣
康拓展開 康拓逆展開
康拓展開 已知有一集合a包含n個不同的元素,其中 k1,k2,k3.kn 2 是a的乙個排列。假設此排列為a按字典序從小到大排列的排列中的第x個排列,則x a1 n 1 a2 n 2 an 2 1 an 1 0 其中ai為ki 1.kn中比ki小的數的個數 例如 3214是1234的第2 3 1 2...
康拓展開與康拓逆展開
x a n n 1 a n 1 n 2 a i i 1 a 1 0 其中a i 為當前未出現的元素中是排在第幾個 從0開始 這就是康托展開。公式把乙個整數x展開成如下形式 x a n n 1 a n 1 n 2 a i i 1 a 2 1 a 1 0 其中a i 為 當前元素 在 所有未出現的元素 ...
康拓展開和逆康拓展開
康托展開就是一種特殊的雜湊函式 把乙個整數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進...