返回语句中带有“或”的时间复杂度

时间:2018-12-18 12:32:02

标签: python recursion time time-complexity complexity-theory

我有以下代码,想计算时间复杂度:

def solve(n):
    if n == 0 or n == 2:
        return True
    elif n == 1:
        return False
    else:
        return not solve(n-1) or not solve(n-2) or not solve(n-3)

如果我有这样的事情:

return solve(n-1) + solve(n-2)

至少从我的理解来看,它将是T(n)= 2T(n-1)。

但是,如果return语句中包含“或”,怎么办?

return not solve(n-1) or not solve(n-2) or not solve(n-3)

4 个答案:

答案 0 :(得分:3)

在这种情况下,

短路是关键概念:

return not solve(n-1) or not solve(n-2) or not solve(n-3)

如果第一个函数的结果为false,则逻辑OR的第一个操作数为true,则无需评估其他函数(我们已经知道了总体结果)。

如果第一个函数的结果为true,则需要评估第二个函数。按照与上述相同的思路,如果第二个操作数的计算结果为true,那么我们就完成了,我们不需要调用第三个函数。

如果前两个函数的结果都为真,那么我们也需要评估第三个函数,以整体评估表达式。


由于我们谈论的是时间复杂性,因此您需要考虑最坏情况和最佳情况。

  • 最佳情况:一个函数调用。时间复杂度:T(n - 1)
  • 最坏的情况:三个函数调用。时间复杂度:T(n - 1) + T(n - 2) + T(n - 3)

答案 1 :(得分:1)

您应该考虑最坏的情况。假设not solve(n-1)not solve(n-2)返回False。在这种情况下,将始终评估solve(n-3)

就复杂度而言,它与计算相同:

solve(n-1) + solve(n-2) + solve(n-3)

答案 2 :(得分:0)

通常,在谈论时间复杂性时,我们以最坏的情况来看。这里,在绝对最坏的情况下,您将针对情况solven-1n-2计算n-3

因此,T(n)= T(n-1)+ T(n-2)+ T(n-3)

答案 3 :(得分:0)

return not solve(n-1) or not solve(n-2) or not solve(n-3)的最差时间复杂度是T(n-1) + T(n-2) + T(n-3)

最好的是T(n-1)

因为如果a or b为True,b不会评估a