全排列的編碼與解碼 康托展開

2022-03-04 23:48:02 字數 491 閱讀 3651

康托展開是乙個全排列到乙個自然數的對映,可以快速求出乙個全排列在所有全排列中字典序排第幾

$\large x=a_n*(n-1)!+a_*(n-2)!+……+a_1*0!$

其中$a_i$表示全排列中後i個元素,第n-i+1個元素排第幾(然後要減一)

$a_i*(i-1)!$表示所有全排列中前n-i個元素與當前全排列相同,且第n-i+1個元素比當前全排列小的所有全排列都比當前全排列小

這樣所有數相加就代表比當前全排列小的全排列的個數

const

int fac=;//

階乘,不夠用可以再加

int cantor(int a,int k)

ans+=tmp*fac[k-i-1

]; }

return

ans;

}void uncantor(int a,int k,int num)

}}

全排列的編碼與解碼 康托展開

對於乙個集合 很明顯它有n 種全排列,把它們全都按照字典序排好序 從小到大 對應順序,假如問你第x個全排列是什麼,或者某個全排列在其中的序號是多少,可以利用康拓展開式來求。康托展開式 x a n n 1 a n 1 n 2 a i i 1 a 2 1 a 1 0 康托展開可以實現按字典序排序的序列與...

全排列的編碼與解碼 康托展開

康托展開 全排列到乙個自然數的雙射 x an n 1 an 1 n 2 ai i 1 a2 1 a1 0 ai為整數,並且0 ai適用範圍 沒有重複元素的全排列 二 全排列的編碼 的排列總共有n 種,將它們從小到大排序,怎樣知道其中一種排列是有序序列中的第幾個?如 按從小到大排列一共6個 123 1...

康托展開 全排列

今天找到了一篇非常好的介紹康托展開的文章!其核心是這一張圖 letter 儲存所需字母表 void initletter 初始化字母表 int fact int n 階乘 return result void output vector v 輸出生成的結果 cout endl void divisi...