我目前正在解决一个问题,该问题要求我找到 0、1、2、3、4、5、6、7、8、9 的第百万个字典排列。乍一看,我想到了一个非常粗略的解决方案,其复杂度约为O(n^3)
public static String permute(char[] a){
ArrayList<String> array = new ArrayList<String>();
int counter = 1;
for (int i = 0; i < a.length; i++){
array[counter] += a[i];
for (int j = 0; j < i; j++){
array[counter] += a[j];
for(int k = a.length; k > i; k--){
array[counter] += a[k];}counter++;}
}
}
代码可能并不完美,但想法是选择一个数字,然后移动到数组的末尾。第二个数组创建所选数字后面的数字,第三个数组在它之后创建数字。这似乎是一个糟糕的算法,我记得过去的算法是这样的。
public static HashSet<String> Permute(String toPermute) {
HashSet<String> set = new HashSet<String>();
if (toPermute.length() <= 1 )
set.add(toPermute);
else {
for (int i = 0; i < toPermute.length(); i++ )
for (String s: Permute(toPermute.substring(0,i)+ toPermute.substring(i+1)))
{
set.add(toPermute.substring(i,i+1)+s);}
}
return set;
}
}
问题是这个算法使用无序集,我不知道它如何变得足够有序,让我找到第百万个排列。除了它可能是O(n^2)的事实之外,我也不知道它的复杂性,因为它调用自己n次然后取消堆栈。