查找交织字符串的递归算法的计算复杂度

时间:2019-04-29 01:22:09

标签: 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.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;
   }

1 个答案:

答案 0 :(得分:0)

运行时为O(2^n),其中n是字符串s的长度。看到这种情况的方式如下:每次输入isInterleaving方法时,您都会执行几次在O(1)时间运行的简单检查(假设substring()方法为{{1 }})。如果这些检查中的任何一项为真,则进行递归,除了将字符串O(1)的大小缩小1。在对s的每次调用中,我们将使0、1或2递归调用isInterleaving。在最坏的情况下,我们将对isInterleaving进行2次递归调用。由于每次调用isInterleaving都会导致两个额外的调用,因此会导致指数运行时间。因此,isInterleaving的最坏情况是运行时间。

另一种推断方法是检查运行时,因为我们使用了越来越长的String:

情况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)