我正在解决leetcode上的this问题。无法解决我的解决方案的时间和空间复杂性。
特别是在有FOR循环的情况下,我不明白如何应用Master Theorem。这里的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;
}
}
我正在寻找解释如何计算时间复杂度的方法,而不仅仅是答案。最好是如果您可以解释带有或不带有备注的复杂性。谢谢!
答案 0 :(得分:0)
T(n) = Sum{T(i) + T(N-i)} for some index i <= 2(T(1) + T(2) + ... + T(n - 1))
=> T(n + 1) - T(n) = 2T(n) => T(n) <= O(3^n) worst case
其中n是分割数的计数
答案 1 :(得分:0)
算法的时间复杂度等于包含正确匹配的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个加泰罗尼亚数字。