【问题标题】:Space complexity of a recursive algorithm递归算法的空间复杂度
【发布时间】:2015-05-13 22:45:45
【问题描述】:

我有一个递归算法来查找 Java 中的回文。如果给定的字符串是回文,它应该返回 true。否则为假。此方法使用子字符串方法,查找复杂度有点棘手。

这是我的算法:

static boolean isPalindrome (String str) {
    if (str.length() > 1) {
        if (str.charAt(0) == (str.charAt(str.length() - 1))) {
    if (str.length() == 2) return true;
            return isPalindrome(str.substring(1, str.length() - 1));
        }
        return false;
    }
    else {
        return true;
    }
}

这个算法的空间复杂度是多少?

我的意思是,当我调用substring() 方法时,它会一直创建一个新字符串吗? substring 方法在 Java 中的实际作用是什么?

【问题讨论】:

  • Here's 源代码。自己看吧。
  • 从 OpenJDK 7u6 开始,substring 创建一个全新的副本并花费 O(n) 时间;接受开始和结束索引的重载可能会更好。
  • 看起来像 O(n) 构造一个新字符串,除非请求的子字符串已经是完整的字符串。
  • 谢谢@SotiriosDelimanolis .......看起来,它会增加时间复杂度。必须做得更好。
  • 一个更简单的解决方案 - 并且可以正确处理 Unicode 代理对 - 是调用 StringBuilder#reverse() docs.oracle.com/javase/7/docs/api/java/lang/… 然后与输入字符串进行比较。

标签: java algorithm recursion space-complexity


【解决方案1】:

在旧版本的 Java (mainly in Java 6 and before)* 中,substring 返回一个新实例,该实例共享较长字符串的内部char 数组(很好地说明了here)。然后substring 的时间和空间复杂度为 O(1)

较新的版本使用String 的不同表示,它不依赖于共享数组。相反,substring 分配了一个刚好需要大小的新数组,并从较长的字符串中复制内容。那么substring的时间和空间复杂度为O(n)

*实际上这个变化是在 Java 7 的更新 6 中引入的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    相关资源
    最近更新 更多