全排列與整數域的對映

2021-07-03 09:59:56 字數 870 閱讀 8486

今天突然想到了全排列這個經典問題。

以前了解到的主要方法是經典的基於交換的遞迴方法。

然後又了解到了基於字典序的方法。

演算法的大致流程都是,給定乙個排列,如果存在下乙個排列則求出下乙個排列。

有乙個常識就是:n個不重複元素的全排列個數為n!.

那麼n!與這n個排列有沒有辦法對映?(肯定是存在這個對映的)

姑且在此,拋磚引玉,發明乙個概念。

變進製數:對於乙個數,若各個數字進製不完全相同,那麼該數就稱為變進製數。

再定義一類特殊的變進製數:

n階階乘數:對於乙個變進製數,若該變進製數的第n位進製為n,那麼該數稱為n階階乘數。

記為:f(b1,b2,…,bn) b1,b2,…,bn為第n位的值

易知:n階階乘數的表示範圍為:0~n!-1.

那麼全排列與整數域對映的問題就很好解決了:

對於三個整數的全排列

記 1,2,3的各位逆序數序列為:

0,0,0

3,2,1的各位逆序數序列為:

0,1,2

則對於全排列

b1,b2,b3

其整數域值為

f(逆序數序列)

例如1,2,3的全排列:

1,2,3

1,3,2

2,1,3

2,3,1

3,1,2

3,2,1

對應的3階階乘數為:

f(0,0,0)

f(0,0,1)

f(0,1,0)

f(0,0,2)

f(0,1,1)

f(0,1,2)

對應的整數為:

0 1

3 2 4 5

全排列與整數劃分演算法分析

1.全排列演算法 題目 求出1 n的全排列.思想 交換第1個元素與第i個元素,得到n個序列 把每個序列分成兩部分 第乙個元素,其餘的元素 對其餘元素執行全排列操作,記得操作完後,將這兩個元素交換回來,以方便下面的交換.演算法實現 void swap int a,int b 交換a和b void pe...

全整數域的高精度類

包含以下內容 輸入,輸出,加法,減法,乘法,整除 除數為高精度 冪運算,模運算,運算帶等號,由int string賦值,六種大小比較 時間複雜度 加法 o n 減法 o n 乘法 o n 2 除法 o n 3 取模 o n 3 bignum.h ifndef bignum h define bign...

全排列的編碼與解碼

看 演算法競賽入門經典 第七章,隱式圖的遍歷,八數碼一題。學到了全排列的編碼與解碼。用處 每乙個排列代表乙個圖的狀態,比如 8,3,2,4,5,6,7,0,1 表示成圖就是 8 3 2 4 5 6 7 0 1 我們將0 8的全排列和0 9!一一對映起來。比如0,1,2,3,4,5,6,7,8 對應的...