了解 Kadane 算法中发生的事情 (Python)
Understanding what's happening in the Kadane Algorithm (Python)
我很难理解我发现的关于 Kadane 算法的这两个示例中发生了什么。我是 Python 的新手,我希望理解这个复杂的算法能帮助我 see/read 更好地编写程序。
为什么一个例子会比另一个更好,难道只是 List vs Range?还有什么能让其中一个例子更有效率吗?此外,还有一些关于计算中发生的事情的问题。 (示例中的问题)
我已经使用 PythonTutor 帮助我逐步了解到底发生了什么。
示例 1:
在PythonTuter中,当您select在提供的屏幕截图中进行下一步时,so_far的值变为1。这是怎么回事?给出总和,我认为它加上-2 + 1即-1,所以当so_far变成1时,这是怎么回事?
def max_sub(nums):
max_sum = 0
so_far = nums[0]
for x in nums[1:]:
so_far = max(x, x + so_far)
max_sum = max(so_far, max_sum)
return max_sum
nums = [-2, 1, -3, 4, -1, 2, 1, -5, 4]
max_sub(nums)
6
示例 2:
类似的问题,当我 select 下一步时,max_sum 从 -2 变为 4...但是如果它在 2 中添加元素(这是4).对我来说,那将是 -2 + 4 = 2 ?
def maxSubArraySum(a,size):
max_so_far =a[0]
curr_max = a[0]
for i in range(1,size):
curr_max = max(a[i], curr_max + a[i])
max_so_far = max(max_so_far,curr_max)
return max_so_far
a = [-2, -3, 4, -1, -2, 1, 5, -3]
print("Maximum contiguous sum is" , maxSubArraySum(a,len(a)))
Maximum contiguous sum is 7
所以,这将是一个由两部分组成的问题:
[1]Based on understandings, why would one be more pythonic and more efficient than the other?
[2]How can I better understand the calculations happening in the examples?
只要看一下每一步,你就能搞清楚这个问题:
[注意] 这个程序似乎是基于混合整数的假设工作的?只有正面和负面。
# starting
so_far = -2 # init. to nums[0]
max_sum = 0
# in the for-loop:
x = 1 # starting with nums[1:]
so_far = max(1, -1) -> 1 (x is 1, -2 + 1)
max_sum = max(0, 1) -> 1
..... continue .... each step is to find the max accumulated numbers sum, as it's evident in the max( ) statement. *There is no `sum` involved, except it tried to determine the current x is good (not negative) then so add it to the so_far.
用于比较这两种不同方法的更多性能测量数据点表明,第一个示例肯定比输入大小为 2k 的第二个示例快 ~22-24%。
if __name__ == '__main__':
L = list(range(-1_000, 1_000, 1))
random.shuffle(L)
baseTestCase = partial(max_sub, nums=L)
print(timeit.timeit(baseTestCase, number=100_000)) # 86.0588067
rangeTestCase = partial(max_SubArraySum, a=L, size=len(L))
print(timeit.timeit(rangeTestCase, number=100_000)) # 105.415955
我很难理解我发现的关于 Kadane 算法的这两个示例中发生了什么。我是 Python 的新手,我希望理解这个复杂的算法能帮助我 see/read 更好地编写程序。
为什么一个例子会比另一个更好,难道只是 List vs Range?还有什么能让其中一个例子更有效率吗?此外,还有一些关于计算中发生的事情的问题。 (示例中的问题)
我已经使用 PythonTutor 帮助我逐步了解到底发生了什么。
示例 1:
在PythonTuter中,当您select在提供的屏幕截图中进行下一步时,so_far的值变为1。这是怎么回事?给出总和,我认为它加上-2 + 1即-1,所以当so_far变成1时,这是怎么回事?
def max_sub(nums):
max_sum = 0
so_far = nums[0]
for x in nums[1:]:
so_far = max(x, x + so_far)
max_sum = max(so_far, max_sum)
return max_sum
nums = [-2, 1, -3, 4, -1, 2, 1, -5, 4]
max_sub(nums)
6
示例 2:
类似的问题,当我 select 下一步时,max_sum 从 -2 变为 4...但是如果它在 2 中添加元素(这是4).对我来说,那将是 -2 + 4 = 2 ?
def maxSubArraySum(a,size):
max_so_far =a[0]
curr_max = a[0]
for i in range(1,size):
curr_max = max(a[i], curr_max + a[i])
max_so_far = max(max_so_far,curr_max)
return max_so_far
a = [-2, -3, 4, -1, -2, 1, 5, -3]
print("Maximum contiguous sum is" , maxSubArraySum(a,len(a)))
Maximum contiguous sum is 7
所以,这将是一个由两部分组成的问题:
[1]Based on understandings, why would one be more pythonic and more efficient than the other?
[2]How can I better understand the calculations happening in the examples?
只要看一下每一步,你就能搞清楚这个问题: [注意] 这个程序似乎是基于混合整数的假设工作的?只有正面和负面。
# starting
so_far = -2 # init. to nums[0]
max_sum = 0
# in the for-loop:
x = 1 # starting with nums[1:]
so_far = max(1, -1) -> 1 (x is 1, -2 + 1)
max_sum = max(0, 1) -> 1
..... continue .... each step is to find the max accumulated numbers sum, as it's evident in the max( ) statement. *There is no `sum` involved, except it tried to determine the current x is good (not negative) then so add it to the so_far.
用于比较这两种不同方法的更多性能测量数据点表明,第一个示例肯定比输入大小为 2k 的第二个示例快 ~22-24%。
if __name__ == '__main__':
L = list(range(-1_000, 1_000, 1))
random.shuffle(L)
baseTestCase = partial(max_sub, nums=L)
print(timeit.timeit(baseTestCase, number=100_000)) # 86.0588067
rangeTestCase = partial(max_SubArraySum, a=L, size=len(L))
print(timeit.timeit(rangeTestCase, number=100_000)) # 105.415955