首页 > 其他 > 详细

康拓展开—理解

时间:2015-03-26 09:13:40      阅读:153      评论:0      收藏:0      [点我收藏+]

1公式编辑

把一个整数X展开成如下形式:
X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[2]*1!+a[1]*0![1] 
其中,a为整数,并且0<=a[i]<i(1<=i<=n)
理解: 对一组数进行全排列后,可以得出它在其中的位置数(由小到大), 另外也是最重要的,可以实现对数据的压缩!


public class Main7
{
	public static final int[]fac = {1,1,2,6,24,120,720,5040,40320,362880};
	
    public static void main(String[] args)
	{
    	String str = "12345";
    	
	   // 建立Hash表  , 得出num在 str这三个数字全排列中是第几个
    	String num1 = "12453";
    	System.out.println(getHash(num1, str));
    	
       // 逆Hash表 , 给出一个数字,得出他的顺序
        int num2 = 16;
        System.out.println(reverHash(num2, str));
	}

	private static String reverHash(int num, String str)
	{
	    num--;	
	    boolean step[] = new boolean[str.length()];
	    StringBuffer sb = new StringBuffer();
	    int j,k;
	    for (int i = 0; i < str.length(); i++)
	    {
	    	int t = num / fac[str.length()-i-1];
	    	num -= t * fac[str.length()-i-1];
	    	for (j = 0, k = 0; k <= t; j++)
	    	    if (!step[j]) k++;	
	    	step[j-1] = true;
	    	sb.append(str.charAt(j-1));
	    }
	    return sb.toString();
	}

	private static int getHash(String num, String str)
	{
        int sum = 0;
		for (int i = 0; i < num.length(); i++)
		{
			int temp = 0;
			for (int j = i + 1; j < num.length(); j++)
              if (num.charAt(i) > num.charAt(j)) temp++;
			sum += temp * fac[str.length()-i-1];
		}
		return sum+1;
	}
}

具体详情: 参考 康托展开 百度百科。

康拓展开—理解

原文:http://blog.csdn.net/first_sight/article/details/44628753

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!