Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 置换函数的运行时间_Java_Performance_Algorithm_Recursion_Permutation - Fatal编程技术网

Java 置换函数的运行时间

Java 置换函数的运行时间,java,performance,algorithm,recursion,permutation,Java,Performance,Algorithm,Recursion,Permutation,我的书为一个函数提供了以下代码,该函数计算字符串唯一字符的所有排列(请参见下面的代码),并指出运行时间为O(n!),“因为有n!个排列。” 我不明白他们是如何将运行时间计算为O(n!)。我想他们的意思是“n”是原始字符串的长度。我认为运行时间应该类似于O((n+1)XY),因为getPerms函数将被调用(n+1)次,X和Y可以分别表示外部和内部for循环的运行时间。有人能给我解释一下为什么这是错的/这本书的答案是对的吗 谢谢 public static ArrayList<String&

我的书为一个函数提供了以下代码,该函数计算字符串唯一字符的所有排列(请参见下面的代码),并指出运行时间为O(n!),“因为有n!个排列。”

我不明白他们是如何将运行时间计算为O(n!)。我想他们的意思是“n”是原始字符串的长度。我认为运行时间应该类似于O((n+1)XY),因为getPerms函数将被调用(n+1)次,X和Y可以分别表示外部和内部for循环的运行时间。有人能给我解释一下为什么这是错的/这本书的答案是对的吗

谢谢

public static ArrayList<String> getPerms(String str)
{
    if (str == null)
        return null;

    ArrayList<String> permutations = new ArrayList<String>();

    if (str.length() == 0)
        permutations.add("");
        return permutations;

    char first = str.charAt(0); //first character of string
    String remainder = str.substring(1); //remove first character

    ArrayList<String> words = getPerms(remainder);
    for (String word: words)
    {
        for (i = 0; i <= word.length(); i++)
        {
            String s = insertCharAt(word, first, i);
            permutations.add(s)
        }
    }

    return permutations;

}

public static String insertCharAt(String word, char c, int j)
{
    String start = word.substring(0, i);
    String end = word.substring(i); 
    return start + c + end;
}
publicstaticarraylistgetperms(stringstr)
{
如果(str==null)
返回null;
ArrayList置换=新的ArrayList();
如果(str.length()==0)
排列。添加(“”);
返回置换;
char first=str.charAt(0);//字符串的第一个字符
字符串余数=str.substring(1);//删除第一个字符
ArrayList words=getPerms(余数);
for(字符串字:字)
{

对于(i=0;i而言,
N
元素的排列计数为
N*(N-1)*(N-2)*…*2*1
,即
N!

第一个字符可以是
N
字符中的任意一个。下一个字符可以是剩余
N-1
字符中的一个。现在我们已经有了
N*(N-1)
可能的情况

因此,继续,我们将在每个步骤中有
N*(N-1)*(N-2)*……
案例


因为
N
元素的排列计数是
N!
,那么就没有一个实现可以比N更快地排列长度
N
的数组。

根据我们的直觉,显然没有一个现有的算法可以生成性能优于O(N!)的N个项目的排列因为有n!的可能性

您可以将递归代码简化为递归方程,因为
gePerm(n)
其中n是一个长度为n的字符串,将调用
getPerm(n-1)
。然后,我们使用它返回的所有值,并放置一个内部循环,循环n次。因此

Pn=nPn-1
P1=1

通过伸缩方程,很容易看出Pn=n


如果你很难想象我们是如何得出这个等式的,你也可以这样想

ArrayList<String> words = getPerms(remainder);
for (String word: words)                          // P(n-1)
{
    for (i = 0; i <= word.length(); i++)          // nP(n-1)
    {
        String s = insertCharAt(word, first, i);
        permutations.add(s)
    }
}
arraylistwords=getPerms(余数);
for(String-word:words)//P(n-1)
{

(i=0;谢谢。请你解释一下你的句子:“第一个字符可以是N个字符中的任意一个”?我想这本书采用了“第一个字符”仅作为字符串开头的字符。因此,我认为第一个字符只能是一个可能的字符,而不是N个字符中的任何一个?请看字符串“123”的简短示例。该实现修复了第一个字符“1”,然后递归调用自己,并接收字符串“23”和“32”。然后在所有可能的位置将第一个字符插入到这些字符串中:“123”、“213”、“231”表示第一个字符串,“132”、“312”、“321”表示第二个字符串。因此,第一个字符实际上并不是固定的。@shekharsuman这是本书中提供的唯一代码。我同意它是不完整的。