Java 求交错字符串递归算法的计算复杂度

Java 求交错字符串递归算法的计算复杂度,java,recursion,Java,Recursion,我开发了以下代码来确定字符串s是否是字符串x和y的交错。在s中可以重复x和y,字符不必是连续的。例如,如果字符串s=“11011001”、字符串x=“110”和字符串y=“01”,它将返回true 我希望有人能帮我确定算法的计算复杂度。我已经在下面粘贴了算法(java),但不确定如何找到它的计算复杂性。任何帮助都将不胜感激。谢谢 public static boolean isInterleaving (String x, String y, String s) { if (s.lengt

我开发了以下代码来确定字符串s是否是字符串x和y的交错。在s中可以重复x和y,字符不必是连续的。例如,如果字符串s=“11011001”、字符串x=“110”和字符串y=“01”,它将返回true

我希望有人能帮我确定算法的计算复杂度。我已经在下面粘贴了算法(java),但不确定如何找到它的计算复杂性。任何帮助都将不胜感激。谢谢

public static boolean isInterleaving (String x, String y, String s) {
   if (s.length()==0)
       return true;

   if (s.charAt(0)==x.charAt(0)) {
       x = x.substring(1) + x.charAt(0);
       if (isInterleaving(x, y, s.substring(1)))
           return true;
   }
   if (s.charAt(0)==y.charAt(0)) {
       y = y.substring(1) + y.charAt(0);
       if (isInterleaving(x, y, s.substring(1)))
           return true;
   }
   return false;
   }
运行时是
O(2^n)
其中
n
是字符串
s
的长度。查看这一点的方法如下:每次输入
isInterleaving
方法时,都会执行在
O(1)
时间内运行的两个简单检查(假设
substring()
方法是
O(1)
)。如果这些检查中的任何一个为真,那么您将递归,只是将字符串
s
的大小缩小了1。在对
isInterleaving
的每次调用中,我们将对
isInterleaving
进行0、1或2次递归调用。在最坏的情况下,我们将对isInterleaving进行2个递归调用。这会导致指数运行时,因为对
isInterleaving
的每个调用都会导致另外两个调用。因此,最坏情况下的运行时为
O(2^n)

另一种推断方法是检查运行时,因为我们需要越来越长的字符串:

案例0(s.length()==0):运行时显然是常量,称之为C

案例1(s.length()==1):可能导致两个递归调用,每个调用都具有案例0所述的运行时。因此,运行时为2*C

案例2(s.length()==2):可能导致两个递归调用,每个调用都与案例1相同,因此运行时为2*2*c=2^2*c

归纳地说,当s.length()==n时,我们有一个2^n*C的运行时。由于C是一个常数,在考虑“Big-O”时可以忽略它,因此运行时是
O(2^n)
运行时是
O(2^n)
其中
n
是字符串
s
的长度。查看这一点的方法如下:每次输入
isInterleaving
方法时,都会执行在
O(1)
时间内运行的两个简单检查(假设
substring()
方法是
O(1)
)。如果这些检查中的任何一个为真,那么您将递归,只是将字符串
s
的大小缩小了1。在对
isInterleaving
的每次调用中,我们将对
isInterleaving
进行0、1或2次递归调用。在最坏的情况下,我们将对isInterleaving进行2个递归调用。这会导致指数运行时,因为对
isInterleaving
的每个调用都会导致另外两个调用。因此,最坏情况下的运行时为
O(2^n)

另一种推断方法是检查运行时,因为我们需要越来越长的字符串:

案例0(s.length()==0):运行时显然是常量,称之为C

案例1(s.length()==1):可能导致两个递归调用,每个调用都具有案例0所述的运行时。因此,运行时为2*C

案例2(s.length()==2):可能导致两个递归调用,每个调用都与案例1相同,因此运行时为2*2*c=2^2*c


归纳地说,当s.length()==n时,我们有一个2^n*C的运行时。由于C是一个常数,在考虑“Big-O”时可以忽略它,因此运行时为
O(2^n)

这是否正确?每次调用isInterleaving都会导致另外两次调用interleaving。这使得复杂度为o(2^n)。此外,算法中似乎存在错误:x或y为空的检查缺失,我不明白为什么x.charAt(0)或y.charAt(0)被添加到字符串的末尾,而不仅仅是被丢弃。啊,字符被添加到末尾是为了处理重复。但是,每个字符串x和y必须至少有一个吗?x和y的每次使用都必须完整吗?@ThomasBitonti啊,是的,你是对的,每次调用都可能导致另外两次调用isInterleaving,我错过了。我会更新我的答案,谢谢。另外,我只是试图分析算法的运行时,不一定是正确性或完整性(我确实认为算法本身存在问题)。谢谢你的帮助。是,将字符(0)添加到字符串的末尾以允许重复。赋值中没有指定x或y是否可以为空的条件,但我会记住这一点。这是正确的吗?每次调用isInterleaving都会导致另外两次调用interleaving。这使得复杂度为o(2^n)。此外,算法中似乎存在错误:x或y为空的检查缺失,我不明白为什么x.charAt(0)或y.charAt(0)被添加到字符串的末尾,而不仅仅是被丢弃。啊,字符被添加到末尾是为了处理重复。但是,每个字符串x和y必须至少有一个吗?x和y的每次使用都必须完整吗?@ThomasBitonti啊,是的,你是对的,每次调用都可能导致另外两次调用isInterleaving,我错过了。我会更新我的答案,谢谢。另外,我只是试图分析算法的运行时,不一定是正确性或完整性(我确实认为算法本身存在问题)。谢谢你的帮助。是,将字符(0)添加到字符串的末尾以允许重复。赋值中没有指定x或y是否可以为空的条件,但我会记住这一点。