hash 全排列hash(康托擴充套件)

2022-04-04 17:28:49 字數 813 閱讀 4121

這裡的雜湊函式是用能對許多全排列問題適用的方法。取n!為基數,狀態第n位的逆序值為雜湊值第n位數。對於空格,取其(9-位置)再乘以8!。例如,1 3 7 2 4 6 8 5 8 的雜湊值等於: 

0*0! + 0*1! + 0*2! + 2*3! + 1*4! + 1*5! + 0*6! + 3*7! + (9-8)*8! = 55596 <9! 

具體的原因可以去查查一些數學書,其中1 2 3 4 5 6 7 8 9 的雜湊值是0 最小,8 7 6 5 4 3 2 1 0 的雜湊值是(9!-1)最大,而其他值都在0 到(9!-1)中,且均唯一。  

例如三個元素的排列

排列    逆序  hash 

123    000    0

132    001    2

213    010    1

231    002    4

312    011    3

321    012    5

**:八數碼問題需要。。。。

c++**:

1

//全排列hash

2 #include 3 #include 4

using

namespace

std;

5int fac=;//

康拖展開判重

6int cantor(const

int *s)

15return sum+1;16

}1718int

main()19;

21 cout22return0;

23 }

康托展開 全排列

今天找到了一篇非常好的介紹康托展開的文章!其核心是這一張圖 letter 儲存所需字母表 void initletter 初始化字母表 int fact int n 階乘 return result void output vector v 輸出生成的結果 cout endl void divisi...

康托展開 全排列

對於n個數的全排列,共有n!中排列方式,如何求某乙個序列在整個排列中的次序 從小到大 以9的全排枚舉例 842697513是1 9全排列的第幾個?高中數學排列組合問題,只需要做到不重不漏 首先看第一位為8,那麼第一位為1 7的全排列都比它小,共有7 8!個。在第一位為8的情況下,其次看第二位為4,那...

全排列康托展開

n個元素有n 個不同的排列。將這n 個排列按字典序排列,並編號為0,1,n 1。每個排列的編號為其字典序值。例如,當n 3時,6 個不同排列的字典序值如下 0 1 2 3 4 5 123 132 213 231 312 321 任務 給定n 以及n 個元素的乙個排列,計算出這個排列的字典序值,以及按...