码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 前缀和【一维前缀和与二维前缀和】


    全文目录

    • 😀 一维前缀和
      • 🤔 构建一维前缀和数组
      • 😵‍💫 子序列的和
    • 😀 二维前缀和
      • 🤔 构建二维前缀和数组
      • 😵‍💫 子矩阵的和

    😀 一维前缀和

    一维前缀和很简单,就是高中数学中的前n项和。

    设有一个数组a[]:

    a = {a[1], a[2], a[3], a[4], a[5], a[6], ... , a[n]};
    
    • 1

    还有一个数组 S[]:

    S = {S[1], S[2], S[3], S[4], S[5], S[6], ... , S[n]};
    S[1] = a[1];
    S[2] = a[1] + a[2];
    S[3] = a[1] + a[2] + a[3];
    S[4] = a[1] + a[2] + a[3] + a[4];
    ...
    S[n] = a[1] + a[2] + a[3] + a[4] + ... + a[n];
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    那么就称 S[] 为 a[] 的前缀和数组。我们可以利用前缀和数组快速求出原数组中一段区域内的总和


    🤔 构建一维前缀和数组

    小技巧:

    数组的下标是从 0 开始的,我们可以多开一个空间,让a[]的下标从 1 开始。
    在构建前缀和数组时,可以将多开一个空间,将S[0] 初始化为0,并从S[1] 开始构建,这样就可以让前缀和数组中的全部元素都使用同一公式来构建。

    // n表示数据个数
    // 下标从1开始,S[0] = 0; 
    for (int i = 1; i <= n; i++)
    {
    	S[i] = S[i - 1] + a[i];
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    😵‍💫 子序列的和

    我们可以用前缀和数组来求原数组中 [l, r] 的和

    a[l] + ... + a[r] = S[r] - S[l - 1]
    
    根据公式推导一下:
    S[r] = a[1] + a[2] + a[3] + ... + a[r]
    S[l - 1] = a[1] + a[2] + a[3] + ... + a[l - 1]
    S[r] - S[l - 1] = a[l] + a[l + 1] + ... + a[r]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    😀 二维前缀和

    如果说一维前缀和是线性的,那么二维前缀和就是平面的。


    🤔 构建二维前缀和数组

    为了方便构造前缀和数组,数组的下标都从1开始。

    二维前缀和数组S[i][j] 是原数组中左上角的和:

    拿 S[4][3] 为例:

    在这里插入图片描述
    S[4][3] 就是原数组中红色区域的和。

    公式:
    将a[i][j] 左边的数据和上边的数据加上,再将都加的数据减去一份,在加上 a[i][j]

    S[i, j] = S[i, j - 1] + S[i - 1, j] - S[i - 1, j - 1] + a[i, j]
    
    • 1

    根据画图来感受一下构建过程:

    先将左边的数据加上,S[i, j - 1] :

    在这里插入图片描述

    然后将上边的数据加上,S[i, j - 1] + S[i - 1, j]:

    在这里插入图片描述

    因为S[i - 1][j - 1] 被加了两次,所以需要 减去一份S[i - 1][j - 1].

    将多加的数据减去,S[i, j - 1] + S[i - 1, j] - S[i - 1][j - 1]:

    在这里插入图片描述

    最后将 a[i][j] 加上,就是S[i][j]:

    S[i, j] = S[i, j - 1] + S[i - 1, j] - S[i - 1, j - 1] + a[i, j]
    在这里插入图片描述


    😵‍💫 子矩阵的和

    二维前缀和一般用来求子矩阵的和,子矩阵以 (x1, y1) 为左上角,(x2, y2) 为右下角:
    在这里插入图片描述

    公式:
    子矩阵的和跟构建二维前缀和数组时的公式很像,将多余的减去,再将多减的加上

    子矩阵的和 
    = 
    S[x2, y2] - S[x1 - 1, y2] - S[x2, y1 - 1] + S[x1 - 1, y1 - 1]
    
    • 1
    • 2
    • 3

    同样的画图来感受一下:

    S[x2,y2]:
    在这里插入图片描述

    减去子矩阵上边的数据,S[x2, y2] - S[x1 - 1, y2]:
    在这里插入图片描述

    减去子矩阵左边的数据,S[x2, y2] - S[x1 - 1, y2] - S[x2, y1 - 1]:
    在这里插入图片描述

    S[x1 - 1][y1 - 1] 被减去了两次,所以需要将这块区域补上,
    S[x2, y2] - S[x1 - 1, y2] - S[x2, y1 - 1] + S[x1 - 1, y1 - 1]:

    在这里插入图片描述


    完结散花🌈🌈🌈

    在这里插入图片描述

  • 相关阅读:
    c++面向对象
    图像识别与处理学习笔记(三)形态学和图像分割
    零基础入门智能射频---python的无人机测向天线自动化设计
    Linux驱动实践:带你一步一步编译内核驱动程序
    word中设置页眉,首页不设置
    实战真知 | 金融企业如何深度融合云原生技术?
    【JavaSE】类和对象 【封装、static、代码块、对象的打印】(三)
    [源码解析] TensorFlow 分布式之 MirroredStrategy 分发计算
    转载-Blazor Debugging Improvements in Rider 2021.2
    新手选MT4老手选MT5,有道理吗?anzo capital昂首资本这样分析
  • 原文地址:https://blog.csdn.net/weixin_54202947/article/details/127873808
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号