gpt4 book ai didi

java - 如何计算此解决方案的时间和空间复杂度?

转载 作者:搜寻专家 更新时间:2023-11-01 03:46:04 25 4
gpt4 key购买 nike

我正在解决 this leetcode 上的问题。无法计算出我的解决方案的时间和空间复杂度。

特别想不明白怎么申请Master Theorem在这里以防我们有 FOR 循环。这里的 a 和 b 是什么?由于输入分为多次并且针对不同大小的子问题。另一个复杂问题是内存。

class Solution {
private Map<String, List<Integer>> cache = new HashMap<>();
public List<Integer> diffWaysToCompute(String equation) {
if (cache.containsKey(equation)) return cache.get(equation);
if (!(equation.contains("+") || equation.contains("-") || equation.contains("*"))) return Collections.singletonList(Integer.valueOf(equation));
List<Integer> result = new ArrayList<>();

for (int i = 0; i < equation.length();i++) {
char ch = equation.charAt(i);

if (ch == '+' || ch == '-' || ch == '*') {
List<Integer> left = diffWaysToCompute(equation.substring(0, i));
List<Integer> right = diffWaysToCompute(equation.substring(i+1, equation.length()));

result.addAll(crossCalc(left, right, ch));
}
}

cache.put(equation, result);

return result;
}

private List<Integer> crossCalc(List<Integer> left, List<Integer> rigth, char sign) {
List<Integer> result = new ArrayList<>();
for (Integer l : left) {
for (Integer r : rigth) {
if (sign == '-') {
result.add(l - r);
} else if (sign == '+') {
result.add(l + r);
} else {
result.add(l*r);
}
}
}
return result;
}
}

我正在寻找如何计算时间复杂度的解释,而不仅仅是答案。如果你能解释有和没有内存的复杂性,最好。谢谢!

最佳答案

你的算法的时间复杂度等于正确匹配的包含 n 对括号的表达式的数量。

它被称为加泰罗尼亚数,它等于 C(2 * n, n)/(n + 1) = (2 * n)!/((n + 1)! * n!).

此外,还有一个计算加泰罗尼亚数的递归公式:

f(n+1) = f(0)f(n) + f(1)f(n-1) + f(2)f(n-2) + ... + f(n-2)f(2) + f(n-1)f(1) + f(n)f(0)

而且您知道,它与您的算法时间复杂度方程式相同!

T(n+1) = T(0)T(n) + T(1)T(n-1) + T(2)T(n-2) + ... + T(n-2)T(2) + T(n-1)T(1) + T(n)T(0)

该算法的内存复杂度可能与其时间复杂度一样大,因为result ArrayList 的元素数量可能很大。因此,在最坏情况下,内存和时间复杂度将是第 n 个加泰罗尼亚数。

来源: https://en.wikipedia.org/wiki/Catalan_number

关于java - 如何计算此解决方案的时间和空间复杂度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54086829/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com