全排列散列,康拓展开

原创 2016年08月29日 16:32:46

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

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

/*
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--
版权声明:一个菜逼的笔记,并没有什么题解。。。

全排列计算(康托展开)

题目描述 给出一个1~n的全排列中的某一个,求它是按字典序排列的第几个。 输入输出格式 输入格式: 第一行,一个n; 第二行,依次是n个数。 输出格式: ...
  • update7
  • update7
  • 2017年02月23日 21:38
  • 15682

康拓展开及其逆运算和全排列函数

有所摘抄,但重要的是自己的想法。   康托展开是一个全排列到一个自然数的双射,常用于构建哈希表时的空间压缩。 康托展开的实质是计算当前排列在所有由小到大全排列中的顺序,因此是可逆的。     ...
  • yo_bc
  • yo_bc
  • 2017年01月14日 16:57
  • 713

康拓排列--全排列的解码与编码

原文链接:http://www.2cto.com/kf/201311/260148.html 一、康托展开:全排列到一个自然数的双射   X=an*(n-1)!+an-1*(n-2)!+.....
  • u011531613
  • u011531613
  • 2017年03月15日 20:59
  • 380

全排列的编码与解码——康托展开 (附完整代码)

一、康托展开:全排列到一个自然数的双射 X=an*(n-1)!+an-1*(n-2)!+...+ai*(i-1)!+...+a2*1!+a1*0! ai为整数,并且0  适用范围:没有重复元素的...
  • synapse7
  • synapse7
  • 2013年11月23日 15:48
  • 6013

全排列剖析:求n个数第k个排序----康托展开

康托展开的公式:(不用记,看形势就行,下面会有例子) X=an*(n-1)!+an-1*(n-2)!+...+ai*(i-1)!+...+a2*1!+a1*0! ai为整数,并且0 适用范围:没有重...
  • modiziri
  • modiziri
  • 2014年03月28日 12:30
  • 3456

全排列的编码与解码(康拓展开)

一、康托展开:全排列到一个自然数的双射   X=an*(n-1)!+an-1*(n-2)!+...+ai*(i-1)!+...+a2*1!+a1*0!   ai为整数,并且0 ...
  • u010585135
  • u010585135
  • 2015年05月04日 16:01
  • 341

全排列hash-康拓展开

这是对很多全排列问题适用的方法,而且还能用于一些题目的判重 第一位是3,当第一位的数小于3时,那排列数小于321 如 123、 213 ,小于3的数有1、2 。所以有2*2!个。再看小于第二位2的:...
  • Fun_Zero
  • Fun_Zero
  • 2015年10月11日 20:36
  • 768

全排列散列 - (康托展开 和 逆康托展开)

首先明确我们要求的是什么样的题目。 例如,给定数组a[10] = {1,2,3,4,5,6,7,8,9,10}; 我们把排列{1,2,3,4,5,6,7,8,9,10}规定为0 我们把排列{1,2,3...
  • qq_34594236
  • qq_34594236
  • 2017年04月26日 21:29
  • 203

Java基础-理解散列与散列码

1.从HashMap说起我们知道Map以键值对的形式来存储数据。有一点值得说明的是,如果要使用我们自己的类作为键,我们必须同时重写hashCode() 和 equals()两个方法。HashMap使用...
  • qq_21430549
  • qq_21430549
  • 2016年08月16日 23:28
  • 3980

redis基础之数据类型--散列类型

Redis是采用字典结构以键值对的形式存储数据的,而散列
  • Y2701310012
  • Y2701310012
  • 2014年11月06日 22:48
  • 2189
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:全排列散列,康拓展开
举报原因:
原因补充:

(最多只允许输入30个字)