对于最大和子列表,是否有任何算法的时间复杂度为O(n ^ 3)?

时间:2019-05-30 08:31:30

标签: python algorithm time-complexity

当我阅读the answer for the former question时!在堆栈溢出时,它表示有可能解决O(n)的Maximum Sum Sublist。

我还编写了计算复杂度为O(n ^ 2)的代码。

但是,我听说有一种算法可以解决O(n ^ 3)的最大和子列表。

如果您知道的话,请与我分享。

O(n)的代码

def mssl(l):
    best = cur = 0
    for i in l:
        cur = max(cur + i, 0)
        best = max(best, cur)
    return best

O(n ^ 2)的代码

def solution(A):
    start = None
    end = None
    max_total = 0

    for i in range(len(A)):
        for j in range(i, len(A)):
            tmp = sum(A[i:j+1])
            if max_total < tmp:
                max_total = tmp
                start = i
                end = j

    return max_total, start, end


if __name__ == '__main__':
    A = [18, -10, 30, 23, -26]
    ans = solution(A)
    print(ans)

我想知道任何一种算法可以解决O(n ^ 3)的最大和子列表。

1 个答案:

答案 0 :(得分:0)

A[i:j+1]

这部分复制了j + 1 - i个元素。

for j in range(i, len(A)):

j从i到n − 1(包括n = {len(A))的j +1-i之和为:

  • j在相同范围内的和,即
    • j从1到n − 1的j的总和(n − 1)n / 2 =n²/ 2 − n / 2
    • 减去j从1到i − 1的j之和:(i − 1)i / 2 =i²/ 2 − i / 2
  • 在相同范围内加上1的总和,即1(n-i)= n-i
  • 加上相同范围内的−i之和,即−i(n − i)= −in +i²

将它们放在一起,您将得到n²/ 2 − n / 2 +i²/ 2 − i / 2 + n − i − in +i²= n²/ 2 + n / 2 + 3/2i²− (n + 3/2)i 复制到j循环。

for i in range(len(A)):

i从0到l − 1的n²/ 2 + n / 2 + 3/2i²−(n + 3/2)i的总和是:

  • n²/ 2 + n / 2的总和:(n²/ 2 + n / 2)n =n³/ 2 +n²/ 2
  • 加3/2 the sum of i²:3/2(n-1)(n-1 + 1)(2(n-1)+1)/ 6 =(n-1)(n)( 2n + 1)/ 4 = n / 4(2n²-2i + n-1)=n³/ 2-n²/ 4-n / 4
  • 减去(n + 3/2)乘以i的和:(n + 3/2)(n-1)n / 2 =(n²+ 3/2 n-n-3/2)n / 2 =n³/ 2 +n²/ 4-3n / 4

即为n³/ 2 +n²/ 2 +n³/ 2-n²/ 4-n / 4-n³/ 2-n²/ 4 + 3n / 4 = n³/ 2 + n / 2份< / strong>,对于典型的O(n ^ 3)时间复杂度测量,而不是O(n ^ 2)。

(健全性检查:n³+ n / 2始终是整数。)