【问题标题】:Time complexity of the python3 code below:下面python3代码的时间复杂度:
【发布时间】:2021-07-15 19:08:09
【问题描述】:
if val in my_list:
    return my_list.index(val)

'in' 运算符的平均复杂度为 O(n)。 index() 在最坏情况下的复杂度为 O(n)。那么这两行代码的复杂度是指数级的,即 O(n^2) 吗?还是 O(n) ?

【问题讨论】:

  • List 是一种类型,而不是实例化对象,因此List 不会包含val 可能包含的值。
  • List 很可能是列表的一个实例。那将是糟糕的做法,但完全合法。
  • 是的,它可以,因为它会编译(可能)。但是。

标签: python-3.x indexing time-complexity


【解决方案1】:

假设List 被替换为一个有效的变量名,它应该是 O(n)(正如 Nathaniel 提到的)。 in 操作平均运行 n/2 次,在某些情况下,index 操作平均再次运行 n/2 次。 -> O(n) + O(n) = O(n)

为什么不对索引本身使用 for 循环?

【讨论】:

  • 我不认为这是正确的?即使List 是一个保存列表的变量(而不是Python 类型List),if val in 应该是O(n),最坏的index()O(n),这意味着这将是O(2n) -> O(n)
  • @NathanielFord 是的,你是对的,谢谢你的更正。
【解决方案2】:

一般来说,如果你有两个O(n) 操作,只有在后一个操作发生每次前一个操作运行时,它才会变成O(n^2)。在这种情况下,if 是一个分支 - 您可以沿着 True 评估分支或 False 评估分支。

因此,您有:

if val in my_list -> evaluates to false, takes O(n) to check each element
End, because there is nothing else to do here. Total of O(n).

或者

if val in my_list -> e evaluates to true, takes O(n) to check each element
my_list.index(val) -> find the index, takes O(n) to check each element
End. Total is O(n) plus O(n)

比较一下:

for i in my_list:
    if i % 2 == 0:
        print("Index of even number is {}", my_list.index(i))

这里我们正在遍历列表,并且在每个元素上我们可能会重新遍历整个列表。这将是O(n^2)。 (很容易;实际上这是O(n log n),因为我们知道index() 永远不会超过当前索引。很难设计一个使用index 实际达到指数的示例。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    • 2018-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多