# 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)
,这不是线性的!在那种情况下,我该如何解决呢?
答案 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。