栈:矩阵的压缩存储

来源:互联网 发布:星韵抽奖软件注册码 编辑:程序博客网 时间:2024/06/05 05:28

概念:

科学与工程计算有一个特殊的数学对象,那就是矩阵。如何将矩阵中的各个元素存储在计算机中,数组就是一个很好的选择。我们通常会遇到三种类型的矩阵:

  • 普通矩阵
  • 特殊矩阵:对称矩阵、上三角矩阵、下三角矩阵、对角矩阵等
  • 稀疏矩阵

特殊

特殊矩阵和稀疏矩阵压缩存储的目的是节省存储空间。矩阵的下标是从1开始,而将改矩阵压缩成内存中的一维空间时,与该一维空间所对应的数组下标是从0开始。

1. 对称矩阵:

a11a21a31ai1a12a22a32ai2a13a23a33ai3a1ja2ja3jaij

性质:

  1. 在n阶矩阵A中的元素满足 :aij = aji( 1≤ i , j≤n );
  2. 压缩策略:只存储上三角或下三角的元素。所需空间n(n+1)2
  3. 一维数组sa[n(n+1)2] 存储以行序为主序的下三角(包括对角线),其地址的运算,即aij和sa[k] 之间存在如下对应关系:
    k=i(i1)2+j1,j(j1)2+i1,i ≥ j线i < j

2. 上三角与下三角矩阵:

上三角矩阵:a11mmma12a22mma13a23a33ma1ja2ja3jaij

下三角矩阵:a11a21a31ai1ma22a32ai2mma33ai3mmmaij

3. 对称矩阵:

a11a210000a12a22a320000a23a33a430000a34a44a540000a45a55a650000a56a66

4. 稀疏矩阵:

00300151200018090024000000070000000014000000000

性质:

  1. 稀疏矩阵:零元素个数远远大于非零元素的个数。
  2. 稀疏因子:在m × n的矩阵中,t个元素不为0,δ = tm×n,称δ为矩阵的稀疏因子。
  3. 通常认为δ≤0.05时称为稀疏矩阵。

压缩存储方法:

  1. 三元组顺序表(顺序存储结构)

    这里写图片描述

#define MAXSIZE 12500//非零元素最大个数 typedef struct{     int i,j;//非零元素的行下标、列下标     elemtype e;}Triple;typedef struct{     Triple data[MAXSIZE+1];//data[0]未用 int mu,nu,tu;//行数、列数、非零元素个数 }TSMatrix;
  1. 行逻辑连接的顺序表(链式存储结构)
    有时为了提高效率,可以随机存储任意一行的非0元素,这样,就需要知道每一行的第一个非0元素在三元组表中的位置。为此可以添加一个辅助数组来实现:
typedef struct{      Triple data[MAXSIZE+1];// data[0]未用      int rpos[MAXCO+1]// 各行第一个非零元的位置表,rpos [0]未用     int mu,nu,tu;//行数、列数、非零元素个数 }RLSMatrix; 
  1. 十字链表(链式存储结构)
    将每行的非0元素组成一个链表,每列的非0元素组成一个链表。链表中的每个结点有5个域,有3个域与三元组中信息一样,保存行标、列标、元素值。剩下的2个域分别保存所在行下一个元素和所在列下一个元素。
    最后将行链表的头指针组成一个数组,将列链表的头指针组成另一个数组,这样就形成了一个十字交叉的链表。
    这里写图片描述
原创粉丝点击