考研数据结构与算法数组

Posted MangataTS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了考研数据结构与算法数组相关的知识,希望对你有一定的参考价值。

考研数据结构与算法(五)数组

文章目录

一、数组的定义

数组是由 n ( n > = 1 ) n(n >= 1) n(n>=1) 个相同类型的数据元素构成的有限序列,每个数据元素称为一个数组元素,每个元素在 n n n 个线性关系中的序号称为该元素的下标,下标的取值范围称为数组的维界

数组和线性表的关系:数组是 线性表的推广 。一维数组可视为一个线性表;二维数组可视为其元素也是定长线性表的线性表,以此类推。数组一旦被定义,其维数和维界就不再改变。因此,除结构的初始化和销毁外,数组只会有存取元素和修改元素的操作。

二、二维数组的存储方式

对于数组而言占用的内存是一个连续的空间,那么在二维数组或者是多维数组的情况,对于地址映射的方式大题分为两种:

2.1 按行优先

顾名思义,我们元素地址是一行一行的填充,那么假设当前的二维数组是一个 N × N N\\times N N×N 的结构(下标从0开始),每一个元素占用 L L L 的空间,那么假设我们要求 a [ i ] [ j ] a[i][j] a[i][j] 的地址的话:

L o c a [ i ] [ j ] = L o c a [ 0 ] [ 0 ] + [ i × n + j ] × L Loc_a[i][j] = Loc_a[0][0] + [i\\times n + j] \\times L Loca[i][j]=Loca[0][0]+[i×n+j]×L

2.2 按列优先

这样的话我们是一列一列的填充,那么和上面的假设一样的话,要想求 a [ i ] [ j ] a[i][j] a[i][j] 的地址,则需要小小的变化:

L o c a [ i ] [ j ] = L o c a [ 0 ] [ 0 ] + [ j × n + i ] × L Loc_a[i][j] = Loc_a[0][0] + [j\\times n + i] \\times L Loca[i][j]=Loca[0][0]+[j×n+i]×L

三、特殊矩阵和压缩矩阵

3.1 特殊矩阵

一个二维矩阵可以根据主对角线分为上三角区和下三角区:

3.1.1 对称矩阵

如果对于一个二维矩阵而言,其中所有单位元素满足: a [ i ] [ j ] = a [ j ] [ i ] ( 1 < = i , j < = n ) a[i][j] = a[j][i] (1<=i,j<=n) a[i][j]=a[j][i](1<=i,j<=n) 那么就称其为对称矩阵,顾名思义就是沿着对角线对称,如下图所示

由于存在这样的结构,那么我们可以发现空间是重复了,为了提高空间利用率,我们将这个二维数组压缩到一个一维数组里面,那么我们其实可以发现我们只需要保存上三角区或者下三角区的数据就能完整的恢复整个矩阵的数据,这样的话我们就节约了近一半的空间,于是我们将元素 a [ i ] [ j ] a[i][j] a[i][j] 存放到一位数组 b [ k ] b[k] b[k] 的位置,那么 k k k i 、 j i、j ij 的关系为(这里的 i 、 j i、j ij 1 1 1 开始,而 k k k 从 0开始):
k = i ( i − 1 ) 2 + j − 1 , i>=j,下三角区 j ( j − 1 ) 2 + i − 1 , i<j,上三角区 k = \\begincases \\fraci(i-1)2+j-1, & \\text i>=j,下三角区 \\\\ \\fracj(j-1)2+i-1, &\\texti<j,上三角区 \\endcases k=2i(i1)+j1,2j(j1)+i1,i>=j,下三角区i<j,上三角区

3.1.2 上(下)三角矩阵

下三角矩阵其实就是上三角区全部为相同常量的一个矩阵,这个存储方式和压缩方式和上面的对称矩阵类似,只需要使用一半的空间即可,压缩后的元素下标之间的对应关系如下:
k = i ( i − 1 ) 2 + j − 1 , i>=j,下三角区 n ( n + 1 ) 2 , i<j,上三角区 k = \\begincases \\fraci(i-1)2+j-1, & \\text i>=j,下三角区 \\\\ \\fracn(n+1)2, &\\texti<j,上三角区 \\endcases k=2i(i1)+j1,2n(n+1),i>=j,下三角区i<j,上三角区
那么我们会发现这里的空间比上面的对称矩阵多一个,即 ( n + 1 ) n / 2 + 1 (n+1)n/2 + 1 (n+1)n/2+1 ,这里多出来的也就是存储整个上三角区的数据,下三角矩阵在一维数组的压缩存储如下:

那么上三角矩阵也就是同理了
k = i ( 2 n − i + 1 ) 2 − n + j − 1 , i<=j,上三角区 n ( n + 1 ) 2 , i<j,下三角区 k = \\begincases \\fraci(2n-i+1)2-n+j - 1, & \\text i<=j,上三角区 \\\\ \\fracn(n+1)2, &\\texti<j,下三角区 \\endcases k=2i(2ni+1)n+j1,2n(n+1),i<=j,上三角区i<j,下三角区

3.1.3 稀疏矩阵

稀疏矩阵其实只是一个概念性的东西,也就是在一个矩阵中有效的数据元素很少的矩阵,就称为稀疏矩阵,假设在一个 m × n m\\times n m×n 的矩阵中,有 t t t 个元素不为 0 0 0 ,令 k = t m × n k = \\fractm\\times n k=m×nt ,则 k k k 为矩阵的 稀疏因子 ,通常认为当 k < = 0.05 k<=0.05 k<=0.05 的时候称为稀疏矩阵。

那么对于一个稀疏矩阵我们应当如何压缩呢,其实我们可以只需要存储稀疏矩阵中不为 0 0 0 的元素的特征,如行、列、值三个信息,这样就构成了一个三元组,我们只需要存储这些有意义的三元组即存储了整个矩阵,例如:

这就是一个简单的例子

3.1.4 三对角矩阵

对角矩阵也称带状矩阵。对于一个 n n n 阶矩阵 A A A 中任意元素 a i , j a_i,j ai,j ,当 ∣ i − j ∣ > 1 |i-j| > 1 ij>1 时,有 a i , j = 0 ( 1 < = i , j < = n ) a_i,j = 0 (1<=i,j<=n) ai,j=0(1<=i,j<=n) 则称为三对角矩阵,在三对角矩阵中所有非零元素都集中在以主对角线为中心的三条线的区域。

结构如图:

如果想将这样一个矩阵压缩到一维数组中,实际上我们不难发现这样一个规律,元素 i , j i,j i,j k k k 的关系为:

k = 2 i + j − 3 k = 2i + j - 3 k=2i+j3

结构如图:

反之,若知道元素 a [ i ] [ j ] a[i][j] a[i][j] 存放在一维数组中的第 k k k 个位置的话,可以得到:
i = ⌊ ( k + 1 ) / 3 + 1 ⌋ , j = k − 2 i + 3 i = \\left \\lfloor (k+1)/3 + 1 \\right \\rfloor,j = k - 2i + 3 i=(k+1)/3+1,j=k2以上是关于考研数据结构与算法数组的主要内容,如果未能解决你的问题,请参考以下文章

数据结构与算法系列研究四——数组和广义表

C语言数据结构与算法--------数组和广义表全面总结

考研数据结构与算法字符串

数据结构与算法王道考研数据结构与算法2021配套大题(java语言描述)

第四章_串数组和广义表_学习小结

广义表总结