理解/实现此枚举解决方案以获得最大子阵列

时间:2015-10-17 04:43:17

标签: algorithm python-2.6

[这是作业。我不是要求代码,但我可能需要伪代码来真正掌握它。]

对于我的算法类,我们正在研究最大的子阵列问题。我已经实现了Kadane的线性解决方案,以及下面的简单枚举:

def better_enumeration(Array):
    max_subset_sum = current_sum = 0
    start_subset_index = stop_subset_index =  0

    for i in range(0, len(Array)+1):
        for j in range(i, len(Array)+1):
            current_sum = sum(Array[i:j])

            if current_sum > max_subset_sum:
                max_subset_sum = current_sum
                start_subset_index = i
                stop_subset_index = j
    return (Array[start_subset_index:stop_subset_index], max_subset_sum)

以下是我教授提供的规范:

  

算法1:枚举。在每对索引i,j上循环并计算和Σ= []。保持目前为止找到的最佳金额。

     

算法2:更好的枚举。请注意,在先前的算法中,多次计算相同的总和。特别注意,Σ= []可以在O(1)时间内从Σ-1 = []计算,而不是从头开始。编写第一个利用此观察结果的算法的新版本。

此时,据我所知,一旦得到i:j的总和,我就可以使用current_sum更快地计算i:j + 1。对我而言,我相信的关键点是:

  • 我不确定我应该在哪些点上开始计算current_sum -t,i:j-以及何时我应该依赖current_sum来计算i:j + 1.
  • 我有时只计算i:j,留下i:j + 1来计算大多数值?
  • 如何阻止i:j + 1溢出数字列表?

更新:

def better_enumeration(Array):
max_subset_sum = current_sum = 0
start_subset_index = stop_subset_index =  0

for i in range(0, len(Array)+1):
    current_sum = 0

    for j in range(i, len(Array)+1):
        current_sum += Array[j]

        if current_sum > max_subset_sum:
            max_subset_sum = current_sum
            start_subset_index = i
            stop_subset_index = j

return (Array[start_subset_index:stop_subset_index], max_subset_sum)

现在我只需要弄清楚如何不溢出j的最后一次迭代。

1 个答案:

答案 0 :(得分:0)

好的,我们知道我们可以通过整个列表创建一个总和。摘要有一个基本情况,这个是0。

for i in range(0, len(Array)+1):
  current_sum = 0

所以0进入外循环。

for j in range(i, len(Array)+1):
  current_sum += Array[j]

您需要知道的下一件事是Python range函数循环range(x, y-1)。我们在这里溢出了这份名单。如果我们不会溢出此列表,那么我们仍会获得准确的求和,但是我们会丢失最大子集中的最后一个整数。

  if current_sum > max_subset_sum:
    max_subset_sum = current_sum
    start_subset_index = i
    stop_subset_index = j

一旦我们理解range如何工作,通过j的简单打印循环表明我们在枚举期间确实遇到了完整的子集:

print 'Loop ' + str(j) + ': ' + str(Array[i:j])

因此,我们的最后一个问题是stop_subset_index应该等于j+1