这里的哈希函数是用能对许多全排列问题适用的方法。
取n!为基数,在第n位的逆序数为哈希值第n位数。
例: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)中,且均唯一。
9位全排列 不一定非要是1~9,或者0~8,也可以是不连续的 只要其逆序关系一定 这样哈希出来的值都是一样的 例如 9位排列:765432108 和 876543219的哈希的值全是40319
例如三个元素的排列
排列 逆序 Hash
123 000 0
132 001 2
213 010 1
231 002 4
312 011 3
321 012 5
应用 : poj 1077 八数码 问题
9位全排列的hash函数:
int h[10] = {1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880};//从 0! 到 8!
int cantor(string s)//以字符串的形式传入 也可以改为数组等
{
int sum=0;
for(int i=0;i<9;i++){
int num=0;
for(int j=0;j<i;j++)
if(s[j]>s[i])
num++;
sum+=(num*h[i]);
}
return sum;
}