所謂康拓展開就是當你的狀態很複雜,不能直接判斷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...