[这是作业。我不是要求代码,但我可能需要伪代码才能真正掌握这一点。]了解/实施此枚举解决方案的最大子阵列
对于我的算法类,我们正在研究最大的子数组问题。我已经实现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,也就是说,我:J-当我应该依靠current_sum计算我:J- +1。
- 我该如何计算i:j有时候离开i:j + 1来计算大多数值?
- 如何防止i:j + 1溢出数字列表?
UPDATE:
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的最后一次迭代。
我建议你参考这个[资源](http://www.geeksforgeeks.org/largest-sum-contiguous-subarray/)。此外,我敢肯定,如果你尝试,你将能够操纵代码来检索具有最大连续总和的子阵列。 –
感谢您的链接,拉胡尔。它看起来像我的Kadane算法的实现,这对我来说很容易理解。我只是不会在枚举上获得这种改进。 – Lithedreamer