繁体   English   中英

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

[英]Finding computational complexity of recursive algorithm for interleaving strings

我开发了以下代码来确定字符串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是String s长度。 看到这种情况的方式如下:每次输入isInterleaving方法时,您都执行了几个简单的检查,这些检查在O(1)时间内运行(假设substring()方法为O(1) )。 如果任这些检查的是真实的,那么你递归,但你退缩的字符串大小s 1。每次调用里面isInterleaving ,我们会是0,1,或2递归调用isInterleaving 在最坏的情况下,我们将对isInterleaving进行2次递归调用。 这导致指数运行时间,因为每个对isInterleaving调用isInterleaving可能导致另外两个调用。 因此,最坏情况下的运行时为O(2^n)

推论这一点的另一种方法是检查运行时,因为我们使用了越来越长的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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM