高维矩阵的压维存储和高维差分

高维矩阵的压维存储和高维差分

高维存储函数

在很多问题中,如果我们直接用d[i][j][k]进行存储可能会超出存储空间。

这种时候我们可以采用压维的方法:

cpp 复制代码
int get_id(int x,int y,int z){
    if (x<1||y<1||z<1||x>a||y>b||z>c)
        return 0;
    return x-1+(y-1)*a+(z-1)*a*b+1;
}

这样我们就可以用一个一维数组来表示对应的状态

高维差分公式:

cpp 复制代码
//二维差分
//将[x1,y1]*[x2,y2]中的数全部加上v
d[x1][y1]+=v;
d[x1][y2+1]-=v;
d[x2+1][y1]-=v;
d[x2+1][y2+1]+=v;
//求和操作
for (int i=1;i<=a;i++){
    for (int j=1;j<=b;j++){
        d[i][j]+=d[i-1][j]+d[i][j-1]-d[i-1][j-1];
    }
}
//三维差分
//将[x1,y1]*[x2,y2]*[x3,y3]中的数全部加上v
d[x1][y1][z1]+=v;
d[x1][y1][z2+1]-=v;
d[x1][y2+1][z1]-=v;
d[x2+1][y1][z1]-=v;
d[x2+1][y2+1][z1]+=v;
d[x2+1][y1][z2+1]+=v;
d[x1][y2+1][z2+1]+=v;
d[x2+1][y2+1][z2+1]-=v;
//求和
for (int i=1;i<=a;i++){
    for (int j=1;j<=b;j++){
        for (int k=1;k<=c;k++){
            d[i][j][k]+=d[i-1][j-1][k-1]-d[i-1][j-1][k]-d[i][j-1][k-1]-d[i-1][j][k-1]+d[i][j][k-1]+d[i-1][j][k]+d[i][j-1][k];
        }
    }
}
相关推荐
迈巴赫车主2 小时前
蓝桥杯192.等差数列java
java·数据结构·算法·职场和发展·蓝桥杯
chase。2 小时前
【学习笔记】从经典算法到通用神经运动规划器
笔记·学习·算法
王璐WL2 小时前
【C++】经典且易错的题
c++
feasibility.2 小时前
OpenCV图像滤波算法应用:常见滤波器的原理与效果对比(含c++/python代码与中文显示)
c++·opencv·算法
Rabitebla2 小时前
快速排序(QuickSort)完全指南 —— 从原理到工业级优化
c语言·数据结构·c++·算法·github
赫瑞2 小时前
Java中的图论2——Kruskal算法
java·算法·图论
XiYang-DING2 小时前
【LeetCode】206. 反转链表
算法·leetcode·链表
迷途之人不知返3 小时前
string
c++
liulilittle3 小时前
OPENPPP2 CTCP 协议栈 + 内置 TC Hairpin NAT 内核态程序
c语言·开发语言·网络·c++·信息与通信·通信