前缀和与差分
前缀和与差分是算法中常用的两种技巧,它们能够高效地处理数组区间操作问题。本文将从基础概念入手,逐步讲解它们的原理、实现方法以及实际应用。
1. 什么是前缀和?
前缀和(Prefix Sum)是指将数组中每个位置的值替换为从数组开头到当前位置的所有元素的和。通过前缀和,我们可以快速计算任意区间的和。
1.1 前缀和的构建
假设有一个数组 arr
,其前缀和数组 prefix
的定义如下:
prefix[i] = arr[0] + arr[1] + ... + arr[i]
例如,给定数组 arr = [1, 2, 3, 4, 5]
,其前缀和数组为 prefix = [1, 3, 6, 10, 15]
。
1.2 前缀和的应用
前缀和的主要应用是快速计算任意区间的和。例如,如果我们想计算 arr
中从索引 l
到 r
的和,可以使用以下公式:
sum(l, r) = prefix[r] - prefix[l - 1]
备注
注意:当 l = 0
时,sum(0, r) = prefix[r]
。
1.3 代码示例
以下是一个计算前缀和的 Python 示例:
def prefix_sum(arr):
prefix = [0] * len(arr)
prefix[0] = arr[0]
for i in range(1, len(arr)):
prefix[i] = prefix[i - 1] + arr[i]
return prefix
arr = [1, 2, 3, 4, 5]
prefix = prefix_sum(arr)
print(prefix) # 输出: [1, 3, 6, 10, 15]
2. 什么是差分?
差分(Difference)是前缀和的逆操作。差分数组 diff
的每个元素表示原数组 arr
中相邻元素的差值。通过差分数组,我们可以高效地对数组的某个区间进行增减操作。