1公式编辑
把一个整数X展开成如下形式:
其中,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;
}
}
具体详情: 参考 康托展开 百度百科。