全排列的哈希函数,康拓展开



这里的哈希函数是用能对许多全排列问题适用的方法。

取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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值