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

Posted

技术标签:

【中文标题】如何计算该解决方案的时间和空间复杂度?【英文标题】:How to compute time and space complexity of this solution? 【发布时间】:2019-06-02 20:27:16 【问题描述】:

我正在解决 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;
    

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

【问题讨论】:

我不认为你可以在这里应用主定理。如果您将问题分成两个或多个完全不相交的子问题并在最后合并它们的结果,则使用主定理 【参考方案1】:

算法的时间复杂度等于包含正确匹配的 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)

这个算法的内存复杂度可以和它的时间复杂度一样大,因为resultArrayList的元素个数可以很大。因此,在最坏的情况下,内存和时间复杂度将是第 n 个加泰罗尼亚数。

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

【讨论】:

【参考方案2】:
T(n) = SumT(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 是拆分数的计数

【讨论】:

以上是关于如何计算该解决方案的时间和空间复杂度?的主要内容,如果未能解决你的问题,请参考以下文章

php算法基础----时间复杂度和空间复杂度

php 算法复杂度 时间复杂度 空间复杂度

时间复杂度和空间复杂度的简单记录

时间复杂度和空间复杂度

Python语言算法的时间复杂度和空间复杂度

算法时间复杂度和空间复杂度的计算