string - 字符串子序列递归的时间复杂度

标签 string algorithm recursion big-o time-complexity

如何计算下面算法的时间复杂度?有人可以简单地向我解释一下吗:

public static void print(String prefix, String remaining, int k) {
    if (k == 0) {
        StdOut.println(prefix);
        return;
    }
    if (remaining.length() == 0) return;
    print(prefix + remaining.charAt(0), remaining.substring(1), k-1);
    print(prefix, remaining.substring(1), k);
}


public static void main(String[] args) { 
    String s = "abcdef";
    int k = 3;
    print("", s, k);
}

最佳答案

假设mprefix的长度,nremaining的长度。那么复杂度由下式给出

T(m, n, k) = Θ(m + n) + T(m + 1, n - 1, k - 1) + T(m, n - 1, k).

Θ(m + n) 项源于

prefix + remaining.charAt(0), remaining.substring(1)

这通常需要创建两个长度分别约为 mn 的新字符串(这在不同的实现中可能有所不同)。


除此之外,它很难解决(至少对我而言),除了一些非常简单的界限。例如,很明显,复杂度至少是前缀长度和 k 中最小值的指数,因为

T(m, n, k) ≥ 2 T(m, n - 1, k - 1) ↠ T(m, n, k) = Ω(2min(n, k) )

关于string - 字符串子序列递归的时间复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34802626/

相关文章:

arrays - 如何使递归函数找到数组中最大数字的索引?

python - 如何在 Python 中检测小写字母?

r - 在字符之间插入定界符

c++ - 从中心而不是从左、中间旋转

java - 迷宫递归解决StackOverflow报错

javascript - 在javascript中搜索json对象的递归函数

javascript - 避免调用堆栈错误

string - 替换文件中字符串的命令

c++ - string::at 和 string::operator[] 有什么区别?

json - 如何从文本中提取需要的信息?