该代码搜索达到目标的可能动作途径的数量。我不想对其进行优化,只是知道它具有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)还是其他选项。
答案 0 :(得分:1)
如某些评论中所述,时间复杂度为。
关于内存使用情况,actionSubset()
每次被调用时都会创建一个新列表(与让算法对原始列表进行操作相反)。但是,由于除原始列表外的所有列表均在每次迭代结束时超出范围,因此内存使用量将仅根据usableActions
的大小而增加,因此。 / p>