我的算法是线性时间吗?

时间:2012-10-02 16:48:03

标签: python algorithm complexity-theory big-o time-complexity

# given an array, it solves sum of elements in it, 
# args: array, initial and final indices
# Returns: sum of elements
def ArrayTot (arr, low, high):
    return sum( arr[low : high+1] )

# Is this linear time?
# args: array, initial and final indices
# returns: Max possible value in sub-array.
def MaxSubArray (arr, low, high):
    # max value of sub-array
    TotalArray = 0
    # starts iterating arr from left - right i.e., arr[low, j]
    for j in xrange(low, high+1):
        # finds sum of sub array arr[low,j]
        tot = ArrayTot (arr, low, j)
        # Iterates the sub-array arr[low,j] so as to find any other possible arr[i,j] which results max value
        for i in xrange(low, j+1):
            SubArrTot = ArrayTot(arr, i, j)
            if SubArrTot >= tot:
                tot = SubArrTot
        if tot >= TotalArray:
            TotalArray = tot
    return TotalArray

arr = [13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7]
low = 0
high = 15

print MaxSubArray(arr, low, high)

我正在学习算法(书:算法简介)..所以,我应该在给定的数组中找到一个构成最大总和的子数组。是的,非递归的线性时间算法.. < / p>

这就是我所做的(如上所示)..但在我的解决方案中,for循环内部有一个for循环,并且两个迭代'n'项...

如果我没错,那应该是O(n^2),这不是线性的!在那种情况下,我该如何解决呢?

2 个答案:

答案 0 :(得分:5)

这当然不是线性解决方案。解决此问题的线性时间算法之一称为Kadane's algorithm

即使只是这段代码

for j in xrange(low, high+1):
    tot = ArrayTot (arr, low, j)

已经有Theta(n^2)时间复杂度。

答案 1 :(得分:2)

恐怕它甚至不是0(n ^ 2)..它是O(n ^ 3)。 ArrayTot(arr, i, j)是O(n),它位于j循环内部的i循环中。

但你可以使用sum数组,即range_sum [1..n],ArrayTot(arr, i, j)range_sum[1] = arr[1]来优化range_sum[i+1] = range_sum[i] + arr[i+1], i>0为O(1),然后我们就可以计算出来了在O(1)时间ArrayTot(arr, i, j),只需使用range_sum[j]-range_sum[i-1]

但你仍然无法用你的方法获得O(n),这是一个非常经典的DP问题,只是google it。