有一定c++基础的对数组一定很熟悉,但通常接触到的仅仅是一维数组,所以~这篇文章的开始先介绍二维数组!
对于这样的二维数组,可以看作是两种不同的线性表:
or
即按行优先存储和按列优先存储两种方式(存储顺序就不用多说了吧)
所以上述A种任意元素的存储位置的公式即为:
下面给出二维数组的定义以及删除方式:
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;
那么问题来了,多维数组的存储地址的公式是啥咧?
其中
原理和二维数组一样,我就不多解释啦(懒)
接下来,到了特殊矩阵的压缩存储环节
(好突然),就是矩阵如何用数组的方式进行存储。
(前两个看完矩阵名字却不清楚意思的可以补线代去了)
1.对称矩阵:只考虑对角线以上或以下的部分
下给出考虑对角线以下部分的存储地址公式:
2.下三角矩阵/上三角矩阵:一个道理
3.带状矩阵:对于n*n阶方阵,非零元素集中在以主对角线为中心的带状区域的矩阵
数学解释:(主对角线以上和下各b条对角线)
进行压缩存储时,只存储带状(部分)内部的元素。
即首行和末行是1+b,其余每行1+2b个元素(如果不够补足),共(n-1)*(1+2b)+1个元素
地址公式:
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;
}