【问题标题】:Is this function O(N+M) or O(N*M)?这个函数是 O(N+M) 还是 O(N*M)?
【发布时间】:2013-11-09 17:18:42
【问题描述】:
def solution(M, A):
    result = [0] * M
    maxCount = 0
    setAll = 0

    for i in range(0,len(A)):
        if (A[i] == M + 1):
            setAll += maxCount
            maxCount = 0
            result = [0] * M
        else:
            result[A[i] - 1] += 1

            if (result[A[i] - 1] > maxCount):
                maxCount = result[A[i] - 1]

    for j in range(0,len(result)):
        result[j] += setAll

    return result


A = [ 1, 1, 1, 1, 2, 3] 
M = 2

print solution(M, A) # result = [ 4, 4 ]


A = [ 1, 2, 2, 4, 1, 1] 
M = 3

print solution(M, A) # result = [ 4, 2, 2 ]

据我计算,solution() 循环 A N 次,然后循环结果 M 次,因此 N+M。 然而,网上测试说是N*M,让我难住了。

【问题讨论】:

    标签: python complexity-theory big-o


    【解决方案1】:

    O(M + N);这里没有嵌套循环。对于较大的数量,这可以降低成本;渐近地,较小的循环无关紧要,使其成为O(N)

    首先循环遍历A 元素(N 迭代),然后分别循环遍历M 元素。

    【讨论】:

    • 我没有看到嵌套循环...我错过了什么吗?
    • 是的,“不”这个词不见了。 :-P 哎呀!
    • 确实看到了一个嵌套循环(有点):for i in range(0,len(A)): ... result = [0] * M。创建赋值的右侧应该是 Theta(M),这样做 N 次是 Theta(O*N)(最坏的情况)。
    【解决方案2】:

    它是O(N),因为给定输入N, MN + M 循环。出于时间复杂性的目的,这减少到两者中的较大者(假设是N),因为我们只取最重要的术语。如果第二个循环嵌套在第一个循环内,则为 O(N*M)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多