【问题标题】:Understanding time complexity for python code了解python代码的时间复杂度
【发布时间】:2017-07-22 10:05:43
【问题描述】:

我对时间复杂度问题完全陌生。我正在为 Codility 练习编写 Python 代码,我编写的代码返回超时错误,时间复杂度为 O(N*N)。预期时间复杂度为 O(N)。

给定一个整数列表A, 对于A 中的所有索引i,我正在尝试计算A[0:i] 的总和与A[i:] 的总和之间的最小差异。

这是我的解决方案:

def solution(A):
    # write your code in Python 2.7
    a=[]
    for i in range(1,len(A)):
        a.append(abs(sum(A[0:i])-sum(A[i:len(A)+1])))
    return min(a)

我尝试通过实现以下来改进代码

import sys
def solution(A):
    # write your code in Python 2.7
    a=sys.maxint
    for i in range(1,len(A)):
        temp=abs(sum(A[0:i])-sum(A[i:len(A)+1]))
        if temp<a:
            a=temp
    return a

我仍然得到同样的复杂性。我了解abs 步骤需要大量时间来计算。如何降低此代码的时间复杂度?是否有一种直观的方式来看待时间复杂度问题?

【问题讨论】:

    标签: python time-complexity


    【解决方案1】:

    在循环的每次迭代中, 您重新计算直到索引i 的元素的总和, 以及索引i 之后的元素总和。 这效率低下, 因为您可以随时累积总和。

    suffix = sum(A)
    prefix = 0
    mindiff = suffix
    
    for a in A:
        prefix += a
        suffix -= a
        mindiff = min(mindiff, abs(prefix - suffix))
    
    return mindiff
    

    您的代码也存在其他问题:

    • 无需列出差异。您可以跟踪最小值(就像我一样)
    • A[i:len(A)+1] 中的结束索引超出了A 的范围,读起来很混乱,这表明您可能对 Python 中的列表索引感到困惑。这应该是A[i:len(A)],或者更好,只是A[i:]

    是否有一种直观的方式来看待时间复杂度问题?

    当然。 这里的直觉是计算一系列值的总和, 你需要遍历它们。 这就是O(N)。 如果这是在另一个 O(N) 循环中, 那么整体复杂度变为O(N*N)。 您的错误是忽略了求和的成本。

    【讨论】:

    • 感谢您的反馈。有什么书可以推荐来理解时间复杂度?
    • @Misha 我这个很棒,请参阅页面顶部附近的 PDF 链接。 codility.com/programmers/lessons/3-time_complexity 我也推荐完成这个页面上的练习。事实上,这里的所有课程都很精彩,所有有抱负的程序员都应该学习。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    相关资源
    最近更新 更多