【问题标题】:Time complexity with an "or" in return statementreturn 语句中带有“或”的时间复杂度
【发布时间】:2018-12-18 12:32:01
【问题描述】:

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

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)

【问题讨论】:

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


【解决方案1】:

短路是这种情况下的关键概念:

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

如果第一个函数的结果为假,因此逻辑或的第一个操作数为真,则其他函数不需要计算(我们已经知道整体结果)。

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

如果前两个函数的结果都为真,那么我们还需要对第三个函数进行求值,以对表达式进行整体求值。


由于我们谈论时间复杂度,您需要考虑最坏和最好的情况。

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

【讨论】:

【解决方案2】:

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

就复杂度而言,和计算是一样的:

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

【讨论】:

    【解决方案3】:

    通常,在谈论时间复杂度时,我们会考虑最坏的情况。在这里,在绝对最坏的情况下,您将为 n-1n-2n-3 的情况计算 solve

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

    【讨论】:

    • @gsamaras 已修复:p
    【解决方案4】:

    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 为 True,a or b 不会评估 b

    【讨论】:

    • 不是这个原因。原因是andor 是短路的。如果aTruea or b 不会评估b,如果aFalsea and b 不会评估b
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    • 2018-11-18
    • 2020-09-16
    • 2013-09-12
    • 2020-06-24
    • 1970-01-01
    相关资源
    最近更新 更多