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