关闭

全排列散列,康拓展开

294人阅读 评论(0) 收藏 举报
分类:

康拓展开类似一个哈希函数,把每一个排列编码成唯一的整数
逆展开就是把这个整数还原为原来的那个排列。

一般搜索的时候,用来标记,比如八数码

/*
O(n*n)
全排列散列,康拓展开,康拓逆展开
n数据范围,a[] 排列数组,下标0开始
ans:排名,0开始
*/
int contor(int a[]){
    int ans = 0, n = 3;
    for(int i=0;i<n;i++){
        int tp = 0;
        for(int j=i+1;j<n;j++)if(a[j]<a[i])tp++;
        ans+=tp*fac[n-1-i];
    }
    return ans;
}
void uncontor(int x,int a[]){
    bool used[10]={0};
    int i,j,tp,n=3;
    for(i=0;i<n;i++){
        tp = x / fac[n-i-1];
        for(j=0;j<n;j++)if(!used[j]){
            if(tp--==0)break;
        }
        a[i] = j+1;
        used[j] = 1;
        x %= fac[n-1-i];
    }
}


//--end--
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:158783次
    • 积分:6564
    • 等级:
    • 排名:第3619名
    • 原创:522篇
    • 转载:3篇
    • 译文:0篇
    • 评论:12条
    文章分类
    最新评论