• hash 全排列hash(康托扩展)


    这里的哈希函数是用能对许多全排列问题适用的方法。取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

    转自:http://blog.csdn.net/tiaotiaoyly/article/details/1720453

    八数码问题需要。。。。

    c++代码:

     1 //全排列hash
     2 #include <cstdio>
     3 #include <iostream>
     4 using namespace std;
     5 int fac[]={1,1,2,6,24,120,720,5040,40320,362880};//康拖展开判重
     6 int cantor(const int *s){ //康托展开求序列的hash值
     7     int sum=0;
     8     for(int i=0;i<9;i++){
     9         int num=0;
    10         for(int j=0;j<i;j++)
    11             if(s[j]>s[i])
    12                num++;
    13         sum+=(num*fac[i]);
    14     }
    15     return sum+1;
    16 }
    17 
    18 int main()
    19 {
    20     int a[]={1,2,3,4,5,6,7,8,0};
    21     cout<<cantor(a)<<endl;
    22     return 0;
    23 }
  • 相关阅读:
    重定向管道
    系统安全
    Linux启动流程
    压缩解压
    Vim
    ssh
    sudo
    Raid
    rsync
    quota
  • 原文地址:https://www.cnblogs.com/Missa/p/2708981.html
Copyright © 2020-2023  润新知