資料 康托展開

2022-05-21 03:56:12 字數 1965 閱讀 6883

所謂康拓展開就是當你的狀態很複雜,不能直接判斷hash的時候,就要用到這個來記錄狀態,保證狀態一一對應!

康托展開也可以看成是變進製數:第i位的權值是(n-i)!,第i位的數字是它右邊比它小的數字的個數。

為了程式實現方便,可以反個向,第i位的權值是(i-1)!,第i位的數字是它左邊比它小的數字的個數。實質一回事。

function cantor(a:tstatus):longint;

var i,j,count,js,ans:longint;

begin

ans:=0;

js:=1;

for i:=2 to n do

begin

js:=js*(i-1); //計算第i位權值

count:=0;

for j:=1 to i-1 do

if a[j]康托展開有什麼用處呢?因為這種對映是一對一的關係,不會產生衝突,因此它在hash應用中有不錯的表現。所以,作為排列數的hash對映是康托展開的主要應用,usaco 3.2.5 magic squares就是乙個很好的應用

如果想深入的就看看下面的。。。

康托展開  

康托展開的公式

把乙個整數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]表示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是第三個大數。

康托展開的**實現

後文的pascal程式經檢驗可以正確工作,並指示出了乙個簡潔的計算方法,和前文的運算思路略有不同,不需要檢驗某數碼是否使用過,只需檢查第(n+1-i)位之後比第(n+1-i)位小的位的數量,將這個數量作為公式中的a[i]。(1<=i<=n)

並附此演算法c++版本。

康托展開的**(c++語言):

unsigned long cantor(unsigned long s)

;  for (i=8;i>=2;i--)

return x;

}

康托展開的**(pascal語言):

s為陣列,用來儲存要求的數,形如(1,3,2,4)。

n為陣列中元素個數。

fac[x]為x!

function cantor:longint:;

vari,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]康托展開的**(c語言):

//引數int s為待展開之數的各位數字,如需展開2134,則s[4]=.

int fac=;//...

long cantor(int s,int n)

num+=fac[n-i]*temp;

}  return (num+1);

康托展開 康托逆展開

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 為當前未出現的...

康托展開 逆康托展開

康托展開 問題 給定的全排列,計算出它是第幾個排列 求序列號 方法 康托展開 對於乙個長度為 n 的排列 num 1 n 其序列號 x 為 x a 1 n i a 2 n 2 a i n i a n 1 1 a n 0 其中a i 表示在num i 1 n 中比num i 小的數的數量 includ...

康托展開 逆康托展開

用途 康托展開是一種雙射,用於排列和整數之間的對映,可用於排列的雜湊 康托展開 公式 i n1pi i 1 sum limits p i i 1 i n 1 pi i 1 其中p ip i pi 為第i ii個數構成的逆序的個數,n為排列數的個數 例 排列 2134 i n1pi i 1 sum l...