Java 检查置换的递归函数的时间复杂性是多少?

Java 检查置换的递归函数的时间复杂性是多少?,java,algorithm,recursion,big-o,Java,Algorithm,Recursion,Big O,以下函数的时间复杂度是多少?在检查字符串时,它与长度/的关系如何变化?我注意到长度为6时,函数执行速度很快。一旦我将字符串增加到“abcdefg”并将长度增加到7,它就会开始减速。对于您添加的每个附加角色,关系是否为指数关系 public static boolean permutate(String str, int length) { if (length < 0) return false; if (str.e

以下函数的时间复杂度是多少?在检查字符串时,它与长度/的关系如何变化?我注意到长度为6时,函数执行速度很快。一旦我将字符串增加到“abcdefg”并将长度增加到7,它就会开始减速。对于您添加的每个附加角色,关系是否为指数关系

    public static boolean permutate(String str, int length)
    {
        if (length < 0)
            return false;

        if (str.equals("abcdef"))
            return true;
       

        for(char c = 'a'; c <= 'z'; c++)
        {
            if(permutate(str + c, length - 1))
                return true;
        }

        return false;
    }
公共静态布尔置换(字符串str,int-length)
{
如果(长度<0)
返回false;
如果(str.equals(“abcdef”))
返回true;

因为(字符c='a';c看起来像效率
O(26^length)
,所以,非常可怕

函数中的各种顶级
if
语句都是常量时间,因此我们不必担心它们,但是
for
循环每次调用都会执行26次,每次都会再次调用自己,深度为
length
。因此,总运行时间的顺序是
26
长度为
的r
。作为一个复杂度类别,它可以减少为
O(x^n)
,或“指数”


您在问题中没有提到这个函数应该实现什么(它看起来是一种非常低效的方式来执行
“abcdef”。startsWith(str)
),所以我真的无法帮助优化。

想象一下,你的字母表中只有2个符号而不是26个,然后添加一个新的位置将使可能的排列加倍:)因此,在这种情况下,它将使它们加倍……因为你尝试每种排列,直到结果匹配为止,它可以很容易地表示为:O(n^m)n是26个待测试字符的26,m是要检查的字母数。因此,在您的例子中,n是26^6或26^7,即:308915776和8031810176。堆栈大小将很快被超过!@whitellama堆栈大小在这里不是一个问题,因为递归的宽度大于深度-尽管它具有令人难以置信的大量的总运行次数,其中只有七次运行会同时在同一堆栈中,因此堆栈溢出的可能性很小。到目前为止,您尝试了什么?首先,您可以测量不同长度的时间并绘制它们。@user3587180没有错,+1。