数组与特殊压缩矩阵

一、数组的基本特性

  • 定义

    cpp 复制代码
    int arr[3][3]; // 3x3二维数组
  • 存储方式

    • 行优先存储(C语言默认):元素按行连续存储。

    • 列优先存储:需手动实现(如科学计算中的Fortran风格)。

  • 访问元素

cpp 复制代码
arr[i][j] = value; // 直接访问

二、 特殊矩阵的压缩存储

针对特定规律的矩阵(如对称、稀疏),可通过压缩存储减少空间占用。

(1) 对称矩阵

  • 特点a[i][j] = a[j][i],只需存储上三角下三角

  • 压缩存储

    • 将下三角元素存入一维数组,元素总数:n(n+1)/2

    • 下标转换公式(行优先):

      • i ≥ j 时,一维数组索引 k = i*(i+1)/2 + j

      • i < j 时,交换 ij

示例代码

cpp 复制代码
// 压缩对称矩阵
int compressSymmetric(int matrix[][N], int n, int compressed[]) {
    int k = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j <= i; j++) { // 存储下三角
            compressed[k++] = matrix[i][j];
        }
    }
    return k; // 返回压缩后长度
}

// 访问压缩后的元素
int getElement(int compressed[], int i, int j) {
    if (i < j) { // 上三角转下三角
        int temp = i;
        i = j;
        j = temp;
    }
    return compressed[i*(i+1)/2 + j];
}

(2) 三角矩阵

  • 上三角矩阵:只存储主对角线及以上元素。

  • 下三角矩阵:只存储主对角线及以下元素。

  • 压缩存储:类似对称矩阵,但需额外存储剩余部分的常量(如0)。

示例代码(下三角矩阵):

cpp 复制代码
// 压缩下三角矩阵(包含对角线)
void compressLowerTriangular(int matrix[][N], int n, int compressed[]) {
    int k = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j <= i; j++) {
            compressed[k++] = matrix[i][j];
        }
    }
}

(3) 稀疏矩阵

  • 特点:绝大多数元素为0,通过压缩存储非零元素。

  • 存储方式

    1. 三元组表示法:存储非零元素的行、列、值。

    2. 十字链表:适合频繁插入/删除操作(如图像处理)。

三元组表示法示例

cpp 复制代码
typedef struct {
    int row, col, value;
} Triple;

// 压缩稀疏矩阵
void compressSparse(int matrix[][M], int rows, int cols, Triple compressed[]) {
    int k = 0;
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            if (matrix[i][j] != 0) {
                compressed[k].row = i;
                compressed[k].col = j;
                compressed[k].value = matrix[i][j];
                k++;
            }
        }
    }
}

// 访问稀疏矩阵元素
int getSparseElement(Triple compressed[], int size, int i, int j) {
    for (int k = 0; k < size; k++) {
        if (compressed[k].row == i && compressed[k].col == j) {
            return compressed[k].value;
        }
    }
    return 0; // 未找到则返回0
}

三、对比与选择

四、操作复杂度

  • 普通数组

    • 访问:O(1)

    • 插入/删除:不适用(需重构数组)

  • 压缩存储矩阵

    • 访问:O(1)(对称/三角)或 O(non_zero)(稀疏矩阵遍历)

    • 插入/删除:仅稀疏矩阵支持高效操作(如十字链表)

五、实际应用

  • 图像处理:稀疏矩阵存储图像的非零像素。

  • 科学计算:对称矩阵用于物理模拟中的刚度矩阵。

  • 机器学习:三角矩阵用于LU分解加速计算。

六、总结

在C语言中,数组是基础数据结构,而特殊矩阵通过压缩存储可显著优化空间和操作效率。根据矩阵特性和应用场景选择合适的存储方式:

  • 对称/三角矩阵:用一维数组压缩存储。

  • 稀疏矩阵:用三元组或十字链表实现动态操作。

相关推荐
小星星闪亮登场13 分钟前
2026萌新联赛第三场-- (郑州轻工业大学)
数据结构·c++·经验分享·算法·贪心算法·排序算法·深度优先
冻柠檬飞冰走茶35 分钟前
PTA基础编程题目集 7-8超速判断(C++语言实现)
开发语言·数据结构·c++·算法
玖玥拾1 小时前
LeetCode 88 合并两个有序数组
算法·leetcode
数据皮皮侠AI1 小时前
上市公司数字供应链金融指数(2010-2024)
大数据·人工智能·算法
2501_942389551 小时前
Epoch AI旗下FrontierMath的负责人Elliot Glazer
数据结构·决策树·动态规划·散列表
小程故事多_802 小时前
用GRPO算法重塑多智能体系统,从原理落地到复杂任务规划实战
人工智能·算法
Hi李耶2 小时前
【LeetCode】541.反转字符串 II
算法·leetcode·职场和发展
shylyly_2 小时前
104.二叉树的最大深度
数据结构·算法·104.二叉树的最大深度
AI科技星3 小时前
曲率‑挠率与 $\boldsymbol{\omega/c}$ 的关系、精算验证及其物理意义
c语言·开发语言·线性代数·算法·决策树·机器学习·ai科技星
沐籽李3 小时前
HuDiff在抗体人源化项目中的工程化落地
人工智能·算法·aidd·抗体设计