有一定c++基础的对数组一定很熟悉,但通常接触到的仅仅是一维数组,所以~这篇文章的开始先介绍二维数组!

android 保存二维数组_学习

对于这样的二维数组,可以看作是两种不同的线性表:

android 保存二维数组_二维数组_02

or

android 保存二维数组_数据结构_03

即按行优先存储和按列优先存储两种方式(存储顺序就不用多说了吧)

所以上述A种任意元素的存储位置的公式即为:

android 保存二维数组_学习_04

下面给出二维数组的定义以及删除方式:

int row,col;
row = 10;                                   //行数
col = 5;                                    //列数

//初始化二维数组
int **array = new int*[row];                //先申请int* 型数组的的空间
for(int i = 0;i < row;i++)
{
    array[i] = new int[col];                //再给int* 类型的指针分别分配空间
}

//释放二维数组
for(int i = 0;i < row;i++)
{
    delete[] array[i];                      //先释放数组的数组
}
delete[] array;                             //再释放单个数组
return 0;

那么问题来了,多维数组的存储地址的公式是啥咧?

android 保存二维数组_数据结构_05

其中

android 保存二维数组_android 保存二维数组_06

原理和二维数组一样,我就不多解释啦(懒)

接下来,到了特殊矩阵的压缩存储环节(好突然),就是矩阵如何用数组的方式进行存储。

(前两个看完矩阵名字却不清楚意思的可以补线代去了)

1.对称矩阵:只考虑对角线以上或以下的部分

下给出考虑对角线以下部分的存储地址公式:

android 保存二维数组_android 保存二维数组_07

android 保存二维数组_数据结构_08

2.下三角矩阵/上三角矩阵:一个道理

3.带状矩阵:对于n*n阶方阵,非零元素集中在以主对角线为中心的带状区域的矩阵

数学解释:

android 保存二维数组_二维数组_09 b,a_{i,j}=0" title="\left | i-j \right |> b,a_{i,j}=0" style="width: 154px; visibility: visible;" data-type="block">

(主对角线以上和下各b条对角线)

进行压缩存储时,只存储带状(部分)内部的元素。

即首行和末行是1+b,其余每行1+2b个元素(如果不够补足),共(n-1)*(1+2b)+1个元素

地址公式:

android 保存二维数组_二维数组_10

L前面的系数:(i-1)(2b+1)+(b+1)+(j-i+b)

前两项是0到i-1行的元素数,最后一项是离对角线距离(j-i)加上对角线条数

4.稀疏矩阵

仅用三元组表示(行数,列数,元素值)

附赠代码:

typedef struct
{
    int i,j;        //非零元素的行下标和列下标
    ElemType e;
}Triple;

typedef union
{
    Triple data[MaxSize+1];    //data[0]未用
    struct
    {
        int mu,nu,tu;          //矩阵的行数、列数和非零个数
    };
} TSMatrix;

//联合体中的数据项相对于基地址偏移量都为0,因此相当于data[0]被mu,nu,tu使用了
void CompresSMatrix(matrix A, TSMatrix &M)
{
    int i,j,k = 1;
    for(i = 0;i < A.m;i++)
    {
        for(j = 0;j < A.n;j++)
        {
            if(A.data[i][j] != 0)
            {
                M.data[k].i = i;
                M.data[k].j = j;
                M.data[k].e = A.data[i][j];
                k++;
            }
        }
    }
    M.mu = A.m;
    M.nu = A.n;
    M.tu = k-1;
}