此算法的(大O)复杂度是多少?

时间:2018-11-12 19:46:53

标签: algorithm recursion big-o complexity-theory

该代码搜索达到目标的可能动作途径的数量。我不想对其进行优化,只是知道它具有Big-O复杂性。代码如下:

private int countPaths(Node parent, List<Action> usableActions, Node goal)
{
    int counter = 0;
    foreach(Action act in usableActions)
    {
        Node node = generateNewNode(parent, act); // Only generate the new node O(1)
        if (node.isEquals(goal)) //Check goal
        {
            counter++;
        }
        else
        {
            List<Action> subset = actionSubset(usableActions, act); // return usableAction with act removed
            counter += countPaths(node, subset, goal); // usableActions - 1
        }
    }
    return counter;
}

第一个循环会使算法的复杂度为O(n),但是进行递归调用并不知道它是O(n ^ 2),O(n ^ n)还是其他选项。

1 个答案:

答案 0 :(得分:1)

如某些评论中所述,时间复杂度O(n!)

关于内存使用情况actionSubset()每次被调用时都会创建一个新列表(与让算法对原始列表进行操作相反)。但是,由于除原始列表外的所有列表均在每次迭代结束时超出范围,因此内存使用量将仅根据usableActions的大小而增加n,因此n!。 / p>