这个函数是O(N + M)还是O(N * M)?

时间:2013-11-09 17:18:43

标签: python complexity-theory big-o

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次,然后循环结果M次,因此N + M. 然而,在线测试表明它是N * M,让我感到难过。

2 个答案:

答案 0 :(得分:6)

O(M + N);这里没有嵌套循环。这可以减少到更大数量的成本;渐渐地,较小的循环不重要,使其成为O(N)

首先,您遍历A个元素(N次迭代),然后单独循环遍历M个元素。

答案 1 :(得分:5)

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