• C++ 的 STL 库的 <numeric> 头文件的 partial_sum 函数已实现了对某一序列的 partial sum。

    • partial_sum(first, last, dest);

1. 部分和的引入

并非什么高级深奥的技巧,但却十分有用。

假设按照降序排列 NN 个学生的考试成绩并保存到数组 scores[],现在想要编写求出从第 a 名到第 b 名成绩的函数 average(a, b),最简单的方法是,将 scores[a] 到 scores[b] 的乘积全部相加,然后除以 b-a+1。

这种方法的循环次数最大会达到 O(N)O(N)。如果只计算 1 次平均值,这种时复杂度就足够了。但多次调用 average() 的话,就需要对函数进行优化。

此时需要用到部分和(partial sum)(或者累加和)的概念。部分和就是,对从数组起始位置到当前任一位置求和并保存的数组(类似于概率理论中的分布函数的概念)。

pSum[j]=∑i=0jscores[i]

pSum[j]=\sum_{i=0}^jscores[i]

预先计算 psum 就能在 O(1)O(1) 时间内求出 scores[] 在特定区间的和(君子)。假设 psum[-1] = 0,那么,scores[a] 和 scores[b] 之间的和可按照如下方式计算:

psum[b]−psum[b−a+1]

psum[b]-psum[b-a+1]

部分和的简单计算:

int A[101], pSum[101], pSqSum[101];
sort(A, A+n);
pSum[0] = A[0];
pSqSum[0] = A[0]*A[0];
for (int i = 1; i < n; ++i){pSum = pSum[i-1] + A[i];pSqSum = pSqSum[i-1] + A[i]*A[i];
}

一定千万要注意,在求解某一区域的部分和的时候,比如 [a, b]pSum[a] 本身是包含数组在 a 处的值的,

// ∑_a^b A[i] ⇒
pSum[b] - (a == 0 ? 0 : pSum[a - 1]);

2. 均值、方差

v==1b−a+1∑i=ab(A[i]−μ)2∑i=abA[i]2b−a+1−μ2

\begin{split} v=&\frac1{b-a+1}\sum_{i=a}^b\left(A[i]-\mu\right)^2\\ =&\frac{\sum\limits_{i=a}^bA[i]^2}{b-a+1}-\mu^2 \end{split}

3. 从一维到二维数组

记,psum[y,x]=∑i=0y∑j=0xA[i,j]\text{psum}[y, x]=\sum\limits_{i=0}^y\sum\limits_{j=0}^xA[i,j],则从 (y1,x1)(y_1,x_1) 到 (y2,x2)(y_2,x_2) 之间矩形所包含元素的和,

sum([y1,x1],[y2,x2])=psum(y2,x2)−psum(y2−1,x1)−psum(y1,x2−1)+psum(y1−1,x1−1)

\text{sum}([y_1,x_1], [y_2,x_2])=\text{psum}(y_2,x_2)-\text{psum}(y_2-1,x_1)-\text{psum}(y_1,x_2-1)+\text{psum}(y_1-1,x_1-1)

int gridSum(const vector<vector<int>>& psum, int y1, int x1, int y2, int x2) {int ret = psum[y2][x2];if (y1 > 0) ret -= psum[y1-1][x2];if (x1 > 0) ret -= psum[y2][x1-1];if (x1 > 0 && y1 > 0) ret += psum[y1-1][x1-1];return ret;
}

部分和(partial sum)在算法求解中的作用相关推荐

  1. 矩阵(二维数组)的性质在算法求解中的应用

    本文所说的矩阵(matrix),其实在编程实现时,往往以二维数组的形式出现. 1. 对称矩阵(二维数组) 在求解旅行商问题时,题干中要求,城市之间彼此互通(两城市之间的道路只有一条). double ...

  2. 算法求解中的变量、数组与数据结构(STL 中的容器)

    本质上算法都是对数据的操作,没有数据,没有存储数据的容器和组织方式,算法就是无源之水无本之木,就是巧妇也难为无米之炊.算法是演员,变量.数组.容器等就是舞台, 然后整个算法的处理流程,都是针对这些数据 ...

  3. 组合搜索(combinatorial search)在算法求解中的应用

    1. 分治.动态规划的局限性 没有合适的分割方式时,就不能使用分治法: 没有合适的子问题或占用内存空间太大时,就不能用动态规划: 此时还需要回到最基本的穷举搜索算法. 穷举搜索(exhaustive ...

  4. 异或算法在算法求解中的妙用

    最高级的算法依赖于数学理论. 1. 异或基本性质 a ⊕ a = 0: a ⊕ 0 = a a ⊕ 全1 = !a a ⊕ b = b ⊕ a a ⊕ b ⊕ c = a ⊕ (b ⊕ c) = (a ...

  5. 同余定理在算法求解中的应用

    1. 同余定理 (a−b)modK=0⇓(amodK)=(bmodK) (a-b)\mod K=0\\ \Downarrow\\ \left(a\mod K\right) = \left(b\mod ...

  6. 【机器学习】总结:线性回归求解中梯度下降法与最小二乘法的比较

    在线性回归算法求解中,常用的是最小二乘法与梯度下降法,其中梯度下降法是最小二乘法求解方法的优化,但这并不说明梯度下降法好于最小二乘法,实际应用过程中,二者各有特点,需结合实际案例具体分析. 最后有两份 ...

  7. 技术图文:排序技术在求解算法题中的应用

    背景 前段时间,在知识星球立了一个Flag,这是总结Leetcode刷题的第五篇图文. 理论部分 C# 中的排序 对集合类的排序,我们通常使用位于 System.Core 程序集,System.Lin ...

  8. Java实现算法导论中求解模线性方程解(基于最大公约数欧几里得扩展算法)

    基于最大公约数欧几里得扩展算法求解算法导论中模线性方程解.具体要结合算法导论中的有关数论算法章节理解,具体代码如下: package cn.ansj;/*假设方程ax=b(mod n)有解,且x0是方 ...

  9. 【C++】公元前五世纪,我国古代数学家张丘建在《算经》一书中提出了“百鸡问题”:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?请设计一个“高效”的算法求解。

    题目分析 公元前五世纪,我国古代数学家张丘建在<算经>一书中提出了"百鸡问题":鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一.百钱买百鸡,问鸡翁.鸡母.鸡雏各几何?请设计一 ...

最新文章

  1. Scala:Functions and Closures
  2. “ INSERT IGNORE”与“ INSERT…ON DUPLICATE KEY UPDATE”
  3. Jsp----注册登陆
  4. 开源wkhtmltopdf使用心得 (一)
  5. 攻克视频AI界难题,直通芒果TV offer,这场算法大赛你一定不能错过
  6. 安卓学习笔记23:常用控件 - 网格视图与图像切换器
  7. 02-02 Python 读写文件 open|os|sys
  8. log4j2 配置详解及使用范例
  9. NoSQL--Redis 2.4--Set
  10. EndNote自定义引用格式和参考文献格式
  11. STM8 内部flash
  12. 什么是zigbee?
  13. win10计算机无法识别u盘,win10电脑无法识别U盘应该如何解决
  14. 介绍一个python工程师必须掌握的 CentOS 命令,nohup
  15. ROS基础系列(七):机器人的建模与仿真(中)
  16. border属性 php,使用CSS的border属性构建变形边框的方法总结
  17. 跌落ETC风口/业绩受挫,激光雷达是万集科技自救“灵药”?
  18. 一款通过人工智能AI计算无损放大图像软件
  19. PPT使用VBA批量删除图形
  20. DIY定制设计小程序开发制作功能介绍

热门文章

  1. MyBatis Plus 导入IdType失败
  2. 详解: Spark 相对于MapReduce的优势(为什么MapReduce性能不理想)
  3. 【Linux 命令学习第三天】
  4. 在access窗体中加图片_如何在Access窗体中显示指定路径的图片
  5. 华为ipd项目管理流程_开发一个产品,就是开发一门新的生意IPD落地直播问答精选...
  6. LeetCode 209. 长度最小的子数组(双指针+滑动窗口)
  7. c++ class 类名 和 include 的区别
  8. 使用CImage类将RGB图像转化为灰度图像
  9. Python数据结构与算法笔记(八):数据结构——树,二叉树和AVL树
  10. HiveQL学习笔记(二):Hive基础语法与常用函数