【问题标题】:Time complexity of constant array slicing in a loop循环中常量数组切片的时间复杂度
【发布时间】:2020-08-03 10:55:36
【问题描述】:

下面的代码的复杂度是多少?

在我看来,应该是O(N).

即使我们在 python 中采用 O(K) 的 for 循环中进行了数组切片,但它始终会运行恒定时间,即等于 pairLength。例如,如果字符串的长度,即st 是 6,pairLength 是 3,那么它将运行的总数是 6*3=12times。同样,如果我们有大小为 12 的 st,它将运行 36 次。这是混淆之处,我们也可以将其称为O(N*M),但 M 始终是恒定的(一旦设置,即 pairLength),因此我们可以将其视为O(N)。对吗?

编辑:让我们假设pairLength 是常数并且一直是3。那么复杂度会是O(N)吗?

def writeAllCombinations(st, pairLength):
    for i in range((len(st)-pairLength)+1):
        print(st[i:i+pairLength]) # could also be done using inner loops and concat

# calling function
writeAllCombinations("HelloWorld", 3)

【问题讨论】:

  • 你的例子中的 N 是什么?
  • pairLength 是一个参数,而不是一个常数。
  • 字符串 (st) 的长度或将大致运行 len(st) 次的循环。
  • @user2357112supportsMonica:我们假设 pairLength 不是一个参数,它一直是 3。那么复杂度会是 O(N) 吗?

标签: python algorithm performance time-complexity slice


【解决方案1】:

假设pairLength是一个常数,len(st)是N。 显然,for 循环运行 N - pairLength + 1 次 = O(N) 时间。

在for循环的每一步, 假设 st 是一个列表,那么 st[i:i+pairLength] 需要 O(1) 时间。在这种情况下,print 也可以假定为 O(1) 时间。

因此,我们可以得出结论,该函数需要 O(N) 时间。

【讨论】:

  • 我在这里很困惑st[i:i+pairLength]。在 python 中,切片实际上是 O(K 或 pairLength)。但是如果pairLength 总是相同的值,那么切片将被视为常数时间,即 O(1) ?
猜你喜欢
  • 1970-01-01
  • 2013-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-08
相关资源
最近更新 更多