康托展開學習筆記

2022-04-12 01:46:41 字數 543 閱讀 9843

引入:

對於乙個1~n的排列,如果我們要想將它作為狀態儲存起來,一般都會開乙個大小為n^n的n維陣列,但這樣的話經常會爆空間複雜度,但又想到1~n的排列最多只有n!個,遠小於n^n,故考慮用乙個數代表乙個排列,壓縮空間。康托展開,就是將乙個排列對應成它在全排列中的序數,即這個排列在所有排列中從小到大排第幾。(當然也可以從大到小排)

如何求乙個排列的康托展開?

有乙個公式:rank=a1

(n−1)!+a2

(n−2)!+⋯+an

​0!,其中rank為當前排列x1,x2,...,xn的康托展開值,ai為xi後面的,即xi+1~xn中小於xi的數的個數。

(解釋挖坑)

1

int cantor(int x,int

n)2

11return ans+1;//

+1是因為序數要算上自己。如果是求它前面有多少個排列,則不用加

12 }

例題:洛谷p1379 八數碼難題

典型運用康托展開壓縮狀態

擴充套件:逆康托展開(挖坑)

康托展開 逆康托展開學習筆記

啊。好久沒寫了。可能是最後一篇學習筆記了吧 題目大意 給定序列求其在全排列中的排名 給定排名求排列。這就是康托展開 逆康托展開要幹的事了。下面依次介紹 一 康托展開 首先,知道它是幹嘛的。就是給定乙個全排列之中的序列,求其在整個全排列中的排名。解釋一下 考慮這個序列的第i位,對於這個序列,只有前i位...

康托展開 學習筆記

至於筆者為什麼寫這篇學習筆記,其實也沒有什麼特殊原因 cantorsort2919 相信大家都學過排列組合,我們記 p n n 或 a n n 為 1 sim n 的全排列 並且,全排列還可以按照字典序進行排序,舉個栗子,a b 其中 len a,所以 a 的字典序小於 b 而康托展開 cantor...

康托展開 康托逆展開

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