前缀和——数据结构与算法基础必备
2023-09-20 19:39:08
关于前缀和的一切
前缀和作为一项巧妙的算法,深受技术面试考官的青睐。所谓的“前缀和”,是算法题的常用テクニック之一。作为一种快速求和的技术,前缀和可以帮助我们迅速求出某个区间内的和。
假设您有如下代码:
nums=[1, 2, 3, 4, 5]
for i in range(len(nums)):
for j in range(i, len(nums)):
prefix_sum += nums[j]
若是您能以时间线为轴,依次观察prefix_sum的动态变化,就会发现,在每一次计算prefix_sum的时候,它都会在当前的位置累加相邻的值。如此,prefix_sum就记录了nums中所有值的前缀和信息。
前缀和提供了一套优越的解题思路和执行方法,能够优化我们的算法。
当然,利用前缀和的前提是,值需要可以叠加。举例来说,对于位运算而言,计算前缀和的思路就没那么容易实践了。
前缀和的广泛用途
前缀和不仅仅能够用于求和,它还可以被用于优化很多数据结构和算法。这里为您列出一些常用 scenario:
- Prefix sum: 前缀和的直接使用,以求和为目的,在计算机科学和算法中广泛应用。
- Prefix min/max: 前缀和的另一种常见用处是作为辅助数据结构。我们利用 prefix min/max 能够快速查询区间范围内的最值。
- Prefix product: 前缀和的变体,用于产品计算,常见于数学运算中的乘法。
- Prefix GCD: 在某些特殊情况下,前缀和也可以被用于快速计算公约数。
- Prefix sum array: 前缀和技术创建的专用数据结构,用于快速求和,常用于数据结构和算法设计中。
毫无疑问,前缀和在上述这些 scenario 发挥了重要作用。不仅如此,它还被广泛用于解决诸如连续子序列和、子矩阵和之类算法问题。
理解和掌握前缀和
前缀和的概念虽然简单,但是由于其涉及数学和逻辑的结合,很多初学者往往容易混淆。所以,有必要剖析其中的一些关键注意点,逐一击破。
- 理解区间和前缀和之间的差别
所谓区间和,指的是一个区间内的多个连续值的叠加和,即两个位置(左,右)之间各值的和。而所谓的“前缀和”,则是从最开始到某个位置的值的叠加和,或者是第一个值到某个特定位置的叠加和。在面试时,对于区间和与前缀和之间的区别混淆,是考官们常常观察到并评判的重点。
- 避开负数的前缀和
由于绝大多数算法问题的前缀和,都是针对正值的,所以,作为面试的考官,我通常都会出一些诸如此类 negative prefix sums 的题目。毕竟,我的初衷是让候选人能够清晰的理解和掌握如何计算前缀和,从而帮助他们巩固对前缀和的认知。当然,在解决这些题目的时候,总是有一些候选人会犯错,尤其是刚开始学习 prefix sum 的新人。
- 牢记前缀和的有效使用范围
prefix sum 并不是万能药,它的使用局限性也是显著的。尽管它被广泛的用于算法和面试中,仍然有一些 scenario 并不适用于前缀和。为了不误用前缀和,作为考官的我都建议他们从前缀和的本质上理解它的局限性。
总之,作为面试必备的基础算法,前缀和的重要性是显而易见的。能够熟练掌握前缀和,对每一个求职者来说都是一项极大的提升。