一、数组
- 定义
数组是由n个相同类型的数据元素构成的有限序列,每一个数据元素称为一个数组元素。下标的取值范围被称为数组的维界
数组与线性表的关系: 数组是线性表的推广。一维数组可视为一个线性表;二维数组可视为其元素是定长数组的线性表,以此类推。数组一旦被定义,其维数和维界就不再改变。因此,除结构的初始化和销毁外,数组只会有存取元素和修改元素的操作。
二、数组的顺序存储
由于数组本身的特点,一般采用顺序结构来表示数组
由于数组可以是多维的而存储数据元素的内存单元地址是一维的,因此在存储数组结构之前,需要将多维关系映射到一维关系
1.一维数组
A[0…n-1]为例,存储结构关系式为
LOC(ai)=LOC(a0)+i×L (0≤i<n)
i表示数组下标,L表示每个数组元素所占的存储单元(比如多少字节)
2.二维数组
行优先(这里的h1+1是一行有多少个数组元素,即多少列)
列优先(这里的h1+1是一列有多少个数组元素,即多少行)
三、特殊矩阵的压缩存储
1.对称矩阵
其中的元素可以分成三部分,上三角区,主对角线和下三角区
因为有一半元素是一样的,我们可以只存一半来节省空间
比如,只保存下三角部分(含主对角线)的元素
这时,第一行有1个元素,第二行有2个元素…第n行有n个元素
共n(n+1)/2个元素,放在内存数组B中
若使用行优先,则对于a(i,j)它在一维数组B的下标k为
1+2+3+…+(i-1)+j-1=i(i-1)/2+j-1(减1是因为数组下标从0开始)
这样,无论是下三角还是上三角,都能在数组里找到相应的位置,上三角的i,j交换一下,继续代公式没问题
做这种题千万看好内存数组和矩阵数组有没有从0开始,一般来说矩阵元素都是从1开始,数组元素从0开始,但是有的题会恶心的改变,所以不建议死记公式,记住过程在考场上推吧
2、三角矩阵
主要思想和对称矩阵相同,唯一区别在于存完三角区和对角线之后,多用一个内存单元存储常数项
上三角矩阵如果采用行优先存储
这时,第一行有n个元素,第二行有n-1个元素…第i-1行有n-i+2个元素
第i行,有j-i+1个元素
(这个怎么理解?观察一下每一行都是从i=j的对角线主元素开始的,每行往后的元素就是j-i的差值+1)
所以k=n+n-1+n-2+…+(n-i+2)+(j-i+1)-1=(i-1)(2n-i+2)/2+(j-i)
至于下三角形的元素直接放在最后,k=n(n+1)/2
3.三对角矩阵
对角矩阵也称为带状矩阵
三对角矩阵:当ℓ i-j ℓ>1时,a(i,j)=0
特征:除了头尾两行,其余每行都是三个元素
如果按行优先存储时:
前i-1行:3*(i-1)-1个
第i行:j-i+2个
k=(2i+j-2)-1=(2i+j-3)
另外还有一种题型,已知k找i,j
想:3(i-1)-1≦k+1≦3i+1.k+1是因为数组从零开始,加一代表第k+1个元素
解得i≧(k+2)/3,留一半就行,向上取整
4.稀疏矩阵
非零元素的个数相对于整个矩阵元素个数来说非常少
这时会用到三元组
这里i,j存放行和列,v存放非零元素值
注意一下,光有三元组是不够的,还需要知道矩阵一共有多少行,一共有多少列,这样才能通过i,j来计算
稀疏矩阵压缩之后失去了随机存取的特性
有关稀疏矩阵的压缩,还有十字链表法,之后我会继续补充