紹介:
1〜nの配置の場合、それを状態として保存する場合は、通常、サイズn ^ nのn次元配列を開きますが、この場合、スペースの複雑さが爆発することがよくありますが、1〜nと考えます配置はnまでです!n ^ nよりもはるかに小さいため、数値を使用して配置を表し、スペースを圧縮することを検討してください。カンター展開は、順列を順列全体の序数に対応させることです。つまり、この順列の順列をすべての順列で小さいものから大きいものに変換します。(もちろん大から小までアレンジ可能)
Cantorの配列を見つける方法は?
式がある:R&LT A N- K = A 1 (N- - 1 )!+ A 2 (N- - 2 )!+ ⋯ + A N- 0 現在ランクがX1、X2、...、のXNに配置され、!カントールアンワインド値、AI xiの裏面、即ち、X I + 1〜X N-数以下XIの数より。
(掘削について説明)
1 int cantor(int x []、int n) 2 { // カンター展開、nはnビットの完全配列を意味し、x []は完全配列数(配列で表される)を意味する 3 int ans = 0、sum = 0 ; 4 for(int i = 1 ; i <n; i ++ ){ 5 for(int j = i + 1 ; j <= n; j ++ ) 6 if(x [j] < x [i]) 7 sum ++; // 8 ans + = sum * factorial [ni];の数を記録し ます// 累積階乗はxiより小さい前処理済み階乗値です 9 sum = 0 ; // カウンタは 10に リセットされます } 11 return ans + 1 ; // +1は、序数がそれ自体としてカウントされるためです。その前にある順列の数を見つけたい場合は、 12 を追加する必要はありません }
質問の例:
Cantor拡張圧縮状態の一般的な使用
拡張:逆Cantor拡張(掘る)