全排列的哈希函数,康拓展开
2015-01-31 14:13
330 查看
这里的哈希函数是用能对许多全排列问题适用的方法。
取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;
}
这里的哈希函数是用能对许多全排列问题适用的方法。
取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;
}
相关文章推荐
- 蓝桥杯——排列序数——康拓展开(全排列)
- 全排列的编码与解码(康拓展开)
- 全排列散列,康拓展开
- hdu3567 Eight II 康拓展开+打表+路径回溯+映射
- nyoj 143 第几是谁(康拓展开的逆运算)
- POJ 1077 Eight (康拓展开) HDU 1043 Eight
- 康拓展开和逆康拓展开
- NYOJ 题目143 第几是谁?(康拓展开)
- 康拓展开与逆康拓展开原理及实现
- 南阳理工OJ 139 我排第几个(康拓展开)
- 康拓展开以及逆展开 板子
- Eight 全排列的哈希函数
- HDU Eight( 康拓展开)
- POJ 1077 Eight(康拓展开 BFS 双向BFS)
- Codeforces Round #285 (Div. 1) problem B. Misha and Permutations Summation 康拓展开。
- 康拓展开
- QDU第二次月赛 排在第几个(康拓展开)
- HDOJ 题目1043 Eight(单向BFS,康拓展开,打表)
- 康拓展开和逆康拓展开
- 康拓展开及应用(八数码编码,排列组合)