1到n全排列的hash函式(o n )

2022-03-05 17:19:29 字數 1030 閱讀 1382

全排列的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 以上面的四個作為初始值,在第三位開始輪轉 得到...