【问题标题】:Finding computational complexity of recursive algorithm for interleaving strings查找用于交织字符串的递归算法的计算复杂度
【发布时间】:2019-04-30 01:18:54
【问题描述】:

我开发了以下代码来确定字符串 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;
   }

【问题讨论】:

    标签: java recursion


    【解决方案1】:

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

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

    案例 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 啊,是的,你是对的,每次调用都可能导致另外 2 次调用 isInterleaving,我错过了。我会更新我的答案,谢谢。另外,我只是试图分析算法的运行时间,不一定是正确性或完整性(我确实认为算法本身存在问题)。
    • 感谢您的帮助。是的 charAt(0) 被添加到字符串的末尾以允许重复。作业中没有指定 x 或 y 是否可以为空的条件,但我会记住这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    • 2017-06-13
    • 2013-11-15
    • 2013-04-28
    • 2011-02-12
    相关资源
    最近更新 更多