java - 查找给定 Java 代码的时间和空间复杂度

标签 java algorithm language-agnostic

嗨,我需要找到程序的时间和空间复杂度,请帮助,如果可能请建议可以执行的优化, ..................................................... ..................................................... ..................................................... ...................................................

public class Sol {
    public int findMaxRectangleArea(int [][] as) {
        if(as.length == 0)
       return 0;
    int[][] auxillary = new int[as.length][as[0].length];
        for(int i = 0; i < as.length; ++i) {
            for(int j = 0; j < as[i].length; ++j) {
            auxillary[i][j] = Character.getNumericValue(as[i][j]);
        }
        }
        for(int i = 1; i < auxillary.length; ++i) {
        for(int j = 0; j < auxillary[i].length; ++j) {
            if(auxillary[i][j] == 1)
                    auxillary[i][j] = auxillary[i-1][j] + 1;
            }
        }

    int max = 0;
        for(int i = 0; i < auxillary.length; ++i) {
            max = Math.max(max, largestRectangleArea(auxillary[i]));
        }
        return max;
    }

    private int largestRectangleArea(int[] height) {
        Stack<Integer> stack =
        new Stack<Integer>();
        int max = 0;
        int i = 0;
        while(i < height.length) {
            if(stack.isEmpty() ||
                height[i] >= stack.peek()) {
                stack.push(height[i]);
            i++;
            }
            else {
            int count = 0;
            while(!stack.isEmpty() &&
                stack.peek() > height[i]) {
                    count++;
                    int top = stack.pop();
                max = Math.max(max, top * count);
                }
            for(int j = 0; j < count + 1; ++j) {
                    stack.push(height[i]);
                }
                i++;
            }
        }

        int count = 0;
        while(!stack.isEmpty()) {
            count++;
            max = Math.max(max, stack.pop() * count);
        }
        return max;
    }

提前谢谢你

最佳答案

要找到空间复杂度,请查看您声明的变量,这些变量大于单个原始变量。事实上,我相信您的空间复杂度将由数组 auxilaryStack stack 决定。第一个的大小很清楚,我不完全理解第二个,但我看到它的大小永远不会大于数组中的一个。所以我会说空间复杂度是 O(size of(auxilary))O(N * M) 其中 N=as.length()M = as[0].length

现在时间复杂度有点棘手。整个 auxilary 数组有两个循环,因此时间复杂度至少为 O( N * M)。您还有另一个循环,它为 auxilary 的每一行调用 largestRectangleArea。如果我正确地得到了这个函数中的代码,那么这个函数似乎又是线性的,但我在这里不确定。由于您更了解逻辑,因此您可能能够更好地计算其复杂性。

希望这对您有所帮助。

关于java - 查找给定 Java 代码的时间和空间复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14771917/

相关文章:

java - 如何使用 Polygon 类在 libGdx 中绘制六边形 map ?

java - 是否可以在类本身中使实例为空?

functional-programming - "flatMap"这个词是从哪里来的?

java - Objective-C 和 Java 原始数据类型

java - 如何反序列化 OpenNLP 训练的模型?

algorithm - 下面的 K-Complementary 算法的大 O 复杂度是多少?

java - 为什么这不对列表进行排序?

algorithm - 改进的 Levenshtein 算法

language-agnostic - 我需要引用我网站上的 Mit 许可证吗?

c++ - 什么是悲观?