[这是作业。我不是要求代码,但我可能需要伪代码来真正掌握它。]
对于我的算法类,我们正在研究最大的子阵列问题。我已经实现了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。对我而言,我相信的关键点是:
更新:
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的最后一次迭代。
答案 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
。