如何为递归函数计算大O表示法?

时间:2017-10-27 04:54:43

标签: java recursion big-o

我想分析一些递归方法,但我不确定如何做到这一点。该方法的一个例子是:

public static String tree2prefix(LinkedBinaryTree<String> tree) throws IllegalArgumentException {

        if (tree == null) {
            throw new IllegalArgumentException("Tree was null");
        }

        if (!isArithmeticExpression(tree)) {
            throw new IllegalArgumentException("Tree is not a valid arithmetic expression");
        }

        return tree2prefix(tree.root(), tree);

    }

    private static String tree2prefix(Position<String> p, LinkedBinaryTree<String> tree) {
        if (tree == null) {
            throw new IllegalArgumentException("Tree was null");
        }

        String prefix = "";
        String element = p.getElement();
        prefix += element;

        if (element.equals("+") || element.equals("-") || element.equals("*")) {
            prefix += " " + tree2prefix(tree.left(p), tree) + " ";
            prefix += tree2prefix(tree.right(p), tree);
        }

        return prefix;

    }

任何人都可以帮助我了解如何分析和查找此类和其他类似方法的最坏情况运行时间。谢谢!

编辑:

如果例如:

,时间复杂度是否会有所不同

而不是

    if (element.equals("+") || element.equals("-") || element.equals("*")) {
        prefix += " " + tree2prefix(tree.left(p), tree) + " ";
        prefix += tree2prefix(tree.right(p), tree);
    }

是:

        prefix += tree2prefix(tree.left(p), tree) + tree2prefix(tree.right(p), tree)

1 个答案:

答案 0 :(得分:1)

此处您可以看到时间复杂度为O(n)。如果树倾斜,最坏情况下的空间复杂度为O(n)

为什么O(n)

因为您需要遍历树的每个节点。

为什么在最坏的情况下时间复杂度为O(n)

递归调用最多可以具有n深度的顺序。

这里考虑了树到前缀算法的复杂性。