全排列的hash函式,可以利用n位變進製,一般做法是用逆序數,但時間複雜度比較大。
設n位變進製數m,+i位逢i+1進一,顯然m可表示的數的範圍為[0, n!)共n!個
要生成n個數的排列,可以先從n個數挑乙個,再從剩下的n-1個數挑一下,如此反覆n次。
若最初的n個數是 0,1,2 ... n-1,第一次挑選的數是t,則可以將t放入到m的n-1位,
若第二次挑選的數是m,則 0 <= r <= n-1 且 r != t,當r等於n-1時,
不能將r放入到m的n-2位(可以放的最大數為n-2),但是注意到r值不可能為t,
該情況下將它的值改為t,得到的新r值肯定小等於n-2,因而可放入到m的n-2位。
重複上面的處理,最終得到的m值與排列是一一對應的。
#include
<
algorithm
>
#include
<
cstdio
>
#include
<
cassert
>
//template
//struct factorial ; };
////
template<> struct factorial<0> ; };
////
static const int max_n = 12;
//static const int factorial[max_n] = ;
static
inline
bool
init_factorial(
intarr,
intlen)
inthash_permutation(
intarr,
const
intlen)
return
ret;
}int
main()
while
(std::next_permutation(arr, arr
+n));
}
生成1 n的全排列
一 不可重集 includeusing namespace std const int maxn 1000 5 void print n int n,int a,int cur a是儲存全排列的陣列,cur是插入的位置 if cur n for int i 0 i 二 可重集 可重集排列注意如果陣列...
輸出1 n的所有全排列
include define maxn 20 include include using namespace std n個數的全排列等於第乙個位置選x,剩下的位置是n 1個數除去x的全排列,這是遞迴式 遞迴出口最後乙個位置只有乙個可選 用for迴圈實現某個位置上1到n的遍歷 雜湊表記錄某個數當前是否...
N個數的全排列
我採用的方法是類似密碼箱的轉輪來得到所有的排列組合 比如求 1,2,3,4的所有排列組合 採用遞減式輪轉來生成 n 4 以1234為初始值 得到如下的所有4個組合,放入最終的容器中 1 2 3 4 2 3 4 1 3 4 1 2 4 1 2 3 n 3 以上面的四個作為初始值,在第三位開始輪轉 得到...