当前位置: 首页 > news >正文

高维前缀和拓展

说明

本文基于 ZR 黄老板的课堂讲授整理而成,系课堂笔记。如有疏漏,责任在笔者。

众所周知,二维前缀和有两种写法。

第一种是利用容斥原理。

for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++)sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + a[i][j];

第二种是逐维计算。

for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++)sum[i][j] = a[i][j];
for (int i = 1; i <= n; i++)for(int j = 1; j <= m; j++)if (i > 1) sum[i][j] += sum[i - 1][j];
for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++)if (j > 1) sum[i][j] += sum[i][j - 1];

随着维数的增加,容斥的做法会很复杂。于是我们更加普遍地使用第二种。

考虑进行状态压缩。我们能否用一维来表示二维呢(\(n \times m \le 10^6\))?

我们考虑将二维平面断成行,使之首尾相接,于是我们发现,\(a_{i, j}\) 等价于 \(a_{mi + j}\)

那三维呢(\(n \times m \times t \le 10^6\))?

考虑将一个三维几何体“切”成二维平面,转化为二维问题。于是有 \(a_{i, j, k}\) 等价于 \(a_{mti + mj + k}\)

我们假设每个维度的长度为2,即每一维的下标范围为 \(\{ 0, 1 \}\)

我们发现对于 \(n\) 维,上述压缩后的一维下标为 \(j = 2^n \times i_n + 2^{n - 1} \times i_{n - 1} + \cdots + 2 \times i_1 + 2\times i_0\),等式右边等价于 \(( \overline{i_n i_{n - 1} \cdots i_1 i_0} )_2\),而这就是 \(j\) 的二进制下表示。

也就是说,我们可以用一个整数来表示 \(k\) 维数组的下标(前提是每个维度的长度为 2)。

于是就可以对三维前缀和进行改写。

// 修改前
for (int i = 0; i <= 1; i++)for (int j = 0; j <= 1; j++)for (int k = 0; k <= 1; k++)if (i > 0) a[i * 4 + j * 2 + k] += a[(i - 1) * 4 + j * 2 + k];
for (int i = 0; i <= 1; i++)for (int j = 0; j <= 1; j++)for (int k = 0; k <= 1; k++)if (j > 0) a[i * 4 + j * 2 + k] += a[i * 4 + (j - 1) * 2 + k];
for (int i = 0; i <= 1; i++)for (int j = 0; j <= 1; j++)for (int k = 0; k <= 1; k++)if (k > 0) a[i * 4 + j * 2 + k] += a[i * 4 + j * 2 + (k - 1)];// 修改后
for (int x = 0; x < 8; x++)if ((x & 4) > 0) a[x] += a[x - 4];
for (int x = 0; x < 8; x++)if ((x & 2) > 0) a[x] += a[x - 2];
for (int x = 0; x < 8; x++)if ((x & 1) > 0) a[x] += a[x - 1];

将这三个 for 合并,并扩展至 \(n\) 维,得到如下代码。

int n = 1 << k;
for (int y = 1; y < n; y *= 2)for (int x = 0; x < n; x++)if (x & y) a[x] += a[x - y];

这也就是 快速莫比乌斯变换 (Fast Mobius Transform, FMT) 求子集和的实现,时间复杂度 \(O(n \log n)\)

http://www.jsqmd.com/news/1214820/

相关文章:

  • 放大电路负反馈技术:原理、设计与实践
  • 2026 年新发布:盘锦诚信的乌桕树源头厂家深度解析与优选指南,揭秘这棵树的惊人秘密:它如何改变你的生活? - 行业鉴选官
  • Python-基础-推导式
  • 2026淮南职业技术学校地址在哪?去学校参观要预约吗?乘车路线怎么走? - 我叫小周
  • 工业边缘计算如何实现“一机多能、算力随需”?
  • JESD204B协议在高速ADC同步中的关键技术与实践
  • 在线光谱分析仪采购全攻略:十大头部品牌功能对比与行业适配指南 - 增长观测局
  • STM32 ADC原理与优化实践指南
  • 如何快速掌握开源Modbus调试工具:5个高效使用秘诀
  • 15ms超低延迟啸叫抑制在免提全双工通话模组中的应用
  • PCB多层板为何优选偶数层设计?生产工艺与信号完整性解析
  • 2026玉溪市民高频选择的5家实体水质检测饮用水检测井水检测自来水检测生活污水废水检测第三方实地测评整理 - 一休咨询
  • 绝区零自动化智能决策引擎:基于实时图像识别的精准操作优化方案
  • 15 账号以内轻矩阵运营专项测评!批量分发工具横向对比
  • 武昌闲置香奈儿包包回收哪家好?连锁逸程 30 分钟上门 - 融媒生活
  • 压阻式压力传感器原理与应用全解析
  • 企业数字化升级8问:ERP、AI办公、小程序开店、老系统改造究竟怎么选?
  • 海光 DCU 算子优化:为什么 1.32x 仍可能不值得接入
  • 单片机原理与应用:从基础到实战开发指南
  • 电容并联原理与应用全解析
  • 新手友好的wordpress主题模板推荐
  • 那些年,我们在中小企业数字化转型中踩过的“坑”
  • 北方蔬菜种子选型怎么规划?2026 产量抗病溢价三维适配完整实操指南
  • 2026镇江市民高频选择的5家实体水质检测饮用水检测井水检测自来水检测生活污水废水检测第三方实地测评整理 - 一休咨询
  • 一、CAPL程序结构与注释
  • SAR ADC抗混叠滤波设计要点与实战经验
  • 百考通智能化:一站式计算机开发平台,提供高效、便捷、全面的解决方案
  • 二极管反向恢复时间原理与优化设计
  • 2026年教培机构收费方案设计 灵活计费满足不同需求
  • 霍尔电流传感器信号调理电路:从差分放大到PCB布局的完整设计指南