python前缀_python前缀和算法

博客探讨了前缀和的概念,通过一个蘑菇拣选器问题举例,指出在Python中使用前缀和数组计算数组间元素总和的逻辑。作者对循环构造的逻辑感到困惑,并展示了调试代码以帮助理解。
摘要由CSDN通过智能技术生成

我试图理解前缀和概念背后的思想,看看codity here(蘑菇拣选器问题)在前缀和课程中给出的例子

我的理解是,整个概念是基于一个简单的属性,即为了求数组a的两个位置a(pos_left,pos_right)之间的所有元素的和,使用第二个数组p,其中所有元素都是连续求和的,其中搜索到的和计算为

值(P(pos_right+1))—值(P(pos_left))。在A 1 2 3 4 5 6

P 0 1 3 6 10 15 21

sum of all elements between A[2] and A[5] = 3+ 4 + 5 = 12

or using the prefix sums" P[5+1] - P[2] = 15 -3 = 12The problem

There is a street with mushroom at every place represented

by a non-empty vector. Given the initial position of a picker and its

movement range, possible maximum number of mushrooms to collect is

looked for.

看看这个例子,我不明白循环构造背后的逻辑。有人能解释一下这个算法的原理吗?

其次,我发现这个例子中的positionin索引非常混乱和麻烦。通常的做法是将带有前缀和的向量的开头的零“移位”吗?(在python中,从0开始计算向量中的元素这一事实已经引起了一些混乱)。在

解决方案

^{pr2}$

我已经为一个小数组A= [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]运行了一些例子,选择了位置k=5和范围m=3。我不明白创建两个循环检查的范围的逻辑。在

我得到了循环的以下参数(p=, left_pos=, right_pos=)

loop 1 (0,5,8), (1,4,6),(2,3,5),(3,2,5)

loop 2 (0,2,5), (1,4,6), (2,5,7), (3,5,8)

兰吉各不相同。为什么?在

用于调试的版本def mushrooms2(A, k, m):

n = len(A)

result = 0

pref = prefix_sums(A)

l1 =min(m, k) + 1

print 'loop p in xrange(min(m, k) + 1): %d' % l1

for p in xrange(min(m, k) + 1):

print 'p %d' % p

print 'A= %r' % A

print 'pref= %r' % pref

left_pos = k - p

right_pos = min(n - 1, max(k, k + m - 2 * p))

result = max(result, count_total(pref, left_pos, right_pos))

print 'left_pos = k - p= %d' % left_pos

print 'right_pos= min(n-1,max(k,k+m-2*p))= %d' % right_pos

print 'max'

print '(result %d' % result

print 'count_total(pref, left_pos, right_pos)) %r, %r, %r, %r' % (pref,left_pos, right_pos,count_total(pref, left_pos, right_pos))

print 'result= %d' % result

print 'next p'

l2=min(m + 1, n - k)

print 'loop xrange(min(m + 1, n - k)): %d' % l2

for p in xrange(min(m + 1, n - k)):

print 'p %d' % p

print 'A= %r' % A

print 'pref= %r' % pref

right_pos = k + p

left_pos = max(0, min(k, k - (m - 2 * p)))

result = max(result, count_total(pref, left_pos, right_pos))

print 'right_pos = k + p= %d' % right_pos

print 'left_pos = max(0, min(k, k - (m - 2 * p)))= %d' % left_pos

print 'max'

print '(result %d' % result

print 'count_total(pref, left_pos, right_pos)) %r, %r, %r, %r' % (pref,left_pos, right_pos,count_total(pref, left_pos, right_pos))

print 'result= %d' % result

print 'next p'

print 'result %d' % result

return result

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值