数据结构专接本复习纲要2.docx
《数据结构专接本复习纲要2.docx》由会员分享,可在线阅读,更多相关《数据结构专接本复习纲要2.docx(9页珍藏版)》请在冰豆网上搜索。
![数据结构专接本复习纲要2.docx](https://file1.bdocx.com/fileroot1/2023-1/27/231cc93d-24e4-41ad-b97e-e2ec1701a3d4/231cc93d-24e4-41ad-b97e-e2ec1701a3d41.gif)
数据结构专接本复习纲要2
“数据结构”专接本复习纲要2006.1
第二章数组结构
一、数组概念
1、什么是数组
数组是连续的、有限的(数目有限的)、有序的(数目有顺序性)同种元素的集合。
2、数组的两个特性
(1)数组中元素间的地址是连续的。
(请与链表对比)
(2)数组中所有元素的数据类型是相同的。
(请与结构类型对比)
二、数组中元素地址的计算
1、一维数组中元素地址的计算
假设有如下一维数组A,数组的首地址为a,每个元素占据的空间大小是d。
(1)数组元素的下标从0开始d
0123……i-1ii+1……
a则下标是i的元素的地址是
L(A[i])=a+(i-0)*d
在A[i]之前有A[0]–A[i-1]共i个元素。
(2)数组元素的下标从1开始d
1234……i-1ii+1……
a则下标是i的元素的地址是
L(A[i])=a+(i-1)*d
在A[i]之前有A[1]–A[i-1]共i-1个元素。
(3)数组元素的下标从j开始d
j+0j+1j+2j+3……i-1ii+1……
a则下标是i的元素的地址是
L(A[i])=a+(i-j)*d
在A[i]之前有A[j]–A[i-1]共i-j个元素。
可以这样来理解,从A[0]到A[j-1]有j个元素,而从A[0]到A[i-1]有i个元素,两者之差就是从A[j]到A[i-1]的元素个数。
例,用C语言定义一个一维数组intA[10];若每个数组元素占用2个字节,数组A的起始地址是50,则A[5]的地址是_____________。
2、二维数组中元素地址的计算
数组中的元素是存放在一片连续的存储空间中,所以二维数组中的元素也要“依次”放入空间中。
二维数组中的元素放入连续存储空间中的“依次次序”有两种:
“行优先(以行为主)”和“列优先(以列为主)”。
所谓“行优先”的次序是指按行由小到大的次序先后依次把各行元素放入,同一行中按列由小到大的顺序存放。
所谓“列优先”的次序是指按列由小到大的次序先后依次把各列元素放入,同一列中按行由小到大的顺序存放。
假设有如下二维数组A,数组的首地址为a,每个元素占据的空间大小为d,二维数组有m行、n列。
(1)以“行优先”次序存放,数组元素的下标从0,0开始
01j-1jn-1
0**…**…*
1**…**…*
……………
i-1**…**…*
i**…**…*
……………
m-1**…**…*
则计算元素A[i][j]的地址可以考虑如下
在A[i][j]之前已存入的整行有第0行到第i-1行共(i-0)行,每行的元素个数是n,则在A[i][j]之前已存入的整行元素个数有(i-0)*n个。
在A[i][j]所在的i行中,在A[i][j]之前已存入的元素个数有第0列到第j-1列共(j-0)个。
所以,总的说来,按行优先的次序,在A[i][j]之前已存入的元素个数有(i-0)*n+(j-0)个。
而每个元素占d个字节,首地址是a。
所以,元素A[i][j]的地址是L(A[i][j])=a+((i-0)*n+(j-0))*d
(2)以“行优先”次序存放,数组元素的下标从1,1开始
L(A[i][j])=a+((i-1)*n+(j-1))*d请自己推导
(3)以“列优先”次序存放,数组元素的下标从0,0开始
01j-1jn-1
0**…**…*
1**…**…*
………..…
i-1**…**…*
i**…**…*
……………
m-1**…**…*
L(A[i][j])=a+((j-0)*m+(i-0))*d请自己推导
(4)以“列优先”次序存放,数组元素的下标从1,1开始
L(A[i][j])=a+((j-1)*m+(i-1))*d请自己推导
练习,一个二维数组A[1:
3,1:
5],每个数组元素用4个字节,数组的起始地址是1000,若以行优先次序排列,A[3,1]的地址是______;若以列优先存储,A[3,1]的地址是_______;
三、下三角矩阵和上三角矩阵
1、什么是下三角矩阵和上三角矩阵
下三角矩阵是指对角线上方(行下标小于列下标的元素)的元素都是0的正方矩阵。
而上三角矩阵是指对角线下方(行下标大于列下标的元素)的元素都是0的正方矩阵。
2、下三角矩阵和上三角矩阵的存储
矩阵在计算机中可以用二维数组来表示。
因为三角矩阵的对角线上方(下方)的元素为0,所以,在存储时,为了节省空间,0元素就不存了。
这也是一种矩阵压缩存储的方式。
和前面讨论的一般二维数组一样,存储三角矩阵时,也有“行优先”和“列优先”两种次序之分。
3、下三角矩阵的元素地址计算
设正方矩阵A的阶数为n。
每个元素占d个字节空间。
(1)“行优先”存储,元素下标从0,0开始
0123j56789
0*
1**i=7j=4
2***
3****
4*****
5******
6*******
i********
8*********
9**********
在元素A[i][j]之前已存入的“整行”有从0行到i-1行共(i-0)行。
元素个数是1+2+3+…+i=i*(i+1)/2个
在元素A[i][j]所在之i行,在A[i][j]之前已存入从0列到j-1列共(j-0)个元素。
所以,总的说,在元素A[i][j]之前按“行优先”已存入元素
i*(i+1)/2+(j-0)个
若矩阵存储的首地址为a,则元素A[i][j]的存储地址为L(A[i][j])=a+(i*(i+1)/2+(j-0))*d
假设矩阵压缩存储在一维数组D中,则元素A[i][j]在D中的“大排行”为第i*(i+1)/2+(j-0)+1个(设大排行编号从1开始)。
若一维数组D的下标从0开始,则,元素A[i][j]在D中的下标是i*(i+1)/2+(j-0)+1-1即存储在一维数组元素D[i*(i+1)/2+(j-0)]中。
若一维数组D的下标从1开始,则,元素A[i][j]在D中的下标是i*(i+1)/2+(j-0)+1即存储在一维数组元素D[i*(i+1)/2+(j-0)+1]中。
(2)“行优先”存储,元素下标从1,1开始
123j5678910
1*
2**i=7j=4
3***
4****
5*****
6******
i*******
8********
9*********
10**********
在元素A[i][j]之前已存入的“整行”有从1行到i-1行共(i-1)行。
元素个数是1+2+3+…+(i-1)=i*(i-1)/2个
在元素A[i][j]所在之i行,在A[i][j]之前已存入从1列到j-1列共(j-1)个元素。
所以,总的说,在元素A[i][j]之前按“行优先”已存入元素
i*(i-1)/2+(j-1)个
若矩阵存储的首地址为a,则元素A[i][j]的存储地址为L(A[i][j])=a+(i*(i-1)/2+(j-1))*d
假设矩阵压缩存储在一维数组D中,则元素A[i][j]在D中的“大排行”为第i*(i-1)/2+(j-1)+1个(设大排行编号从1开始)。
若一维数组D的下标从0开始,则,元素A[i][j]在D中的下标是i*(i-1)/2+(j-1)+1-1即存储在一维数组元素D[i*(i-1)/2+(j-1)]中。
若一维数组D的下标从1开始,则,元素A[i][j]在D中的下标是i*(i-1)/2+(j-1)+1即存储在一维数组元素D[i*(i-1)/2+(j-0)]中。
练习,设有一个矩阵为5X5的下三角矩阵A,将其压缩存储在一维数组D,该数组的大小为_____,a[4][2]所对应的D[K]的K值为__________。
(3)“列优先”存储,元素下标从0,0开始
0123j56789
0*
1**i=7j=4
2***
3****
4*****
5******
6*******
i********
8*********
9**********
在元素A[i][j]之前已存入的“整列”有从0列到j-1列共(j-0)列。
元素个数是
n+(n-1)+(n-2)+…+(n-(j-1))=j*(2*n-j+1)/2个
在元素A[i][j]所在之j列,在A[i][j]之前已存入从j行到i-1行共(i-j)个元素。
所以,总的说,在元素A[i][j]之前按“列优先”已存入元素
j*(2*n-j+1)/2+(i-j)个
若矩阵存储的首地址为a,则元素A[i][j]的存储地址为L(A[i][j])=a+(j*(2*n-j+1)/2+(i-j))*d
假设矩阵压缩存储在一维数组D中,则元素A[i][j]在D中的“大排行”为第j*(2*n-j+1)/2+(i-j)+1个(设大排行编号从1开始)。
若一维数组D的下标从0开始,则,元素A[i][j]在D中的下标是j*(2*n-j+1)/2+(i-j)+1-1即存储在一维数组元素D[j*(2*n-j+1)/2+(i-j)]中。
若一维数组D的下标从1开始,则,元素A[i][j]在D中的下标是j*(2*n-j+1)/2+(i-j)+1即存储在一维数组元素D[j*(2*n-j+1)/2+(i-j)+1]中。
(4)“列优先”存储,元素下标从1,1开始
123j56789
1*
2**i=7j=4
3***
4****
5*****
6******
i*******
8********
9*********
10**********
在元素A[i][j]之前已存入的“整列”有从1列到j-1列共(j-1)列。
元素个数是
n+(n-1)+(n-2)+…+(n-(j-1)+1)=(j-1)*(2*n-j+2)/2个
在元素A[i][j]所在之j列,在A[i][j]之前已存入从j行到i-1行共(i-j)个元素。
所以,总的说,在元素A[i][j]之前按“列优先”已存入元素
(j-1)*(2*n-j+2)/2+(i-j)个
若矩阵存储的首地址为a,则元素A[i][j]的存储地址为L(A[i][j])=a+((j-1)*(2*n-j+2)/2+(i-j))*d
假设矩阵压缩存储在一维数组D中,则元素A[i][j]在D中的“大排行”为第(j-1)*(2*n-j+2)/2+(i-j)+1个(设大排行编号从1开始)。
若一维数组D的下标从0开始,则,元素A[i][j]在D中的下标是(j-1)*(2*n-j+2)/2+1-1即存储在一维数组元素D[(j-1)*(2*n-j+2)/2]中。
若一维数组D的下标从1开始,则,元素A[i][j]在D中的下标是(j-1)*(2*n-j+2)/2+1即存储在一维数组元素D[(j-1)*(2*n-j+2)/2+1]中。
4、上三角矩阵的元素地址计算
请自己推导。
四、稀疏矩阵
1、什么是稀疏矩阵
稀疏矩阵是指矩阵中绝大多数元素值为0的那种矩阵。
2、稀疏矩阵的存储
由于稀疏矩阵中绝大多数元素值为0,所以在存储时,为了节省空间,只存储非0值的元素。
这就是稀疏矩阵的压缩存储。
用“三元组表”来表示稀疏矩阵是常用的稀疏矩阵压缩存储的方式。
矩阵中的非0元素用元素的行号、列号和元素值这三项数据来表示,把这三项数据组成一个结构,而矩阵中诸非0元素用这种结构组成的线性表来表示,三元组表的名称由此而来。
例,对于如下稀疏矩阵
1000000
0–2000400
0030000
000000
0005000
00–500070
在C语言中用三元组表可表示如下
rowcolvalue
a[0]667
a[1]1110
a[2]22-20
a[3]2540
a[4]3330
a[5]5450
a[6]63-60
a[7]6670
其中A[0].row是稀疏矩阵的行数
A[0].col是稀疏矩阵的列数
A[0].value是稀疏矩阵中非0元素的个数
五、矩阵乘积算法
设有矩阵A[M][K]B[K][N],矩阵A乘以矩阵B的积为矩阵C[M][N]。
则C[i][j]的值为A的i行和B的j列对应位置元素积的和。
for(C[i][j]=0,t=0;tC[i][j]+=A[i][t]*B[t][j];
六、多项式的表示
多项式表示的要点是多项式中的一个项可以用该项的系数和该项的幂指数来表示。
若多项式中的每一项(包括系数为0的项)都表示,则可以不必使用幂指数。
例如,按升幂的次序把各项的系数(包括系数0)线性排列,则某系数的后继系数所表示的项的幂指数增1。
例,P(x)=8x5+6x4+3x2+12
P=(12,0,3,0,6,8)MAX=5
对于多项式中很多项系数为0的情况,为节省空间,一般只存非0项,此时,该项的幂指数不可少。
例,P(x)=8x100-6x4+12
P=(3,100,8,4,-6,0,12)其中4表示非0系数项的个数。
至于用顺序表还是用链表(静态链表或动态链表),那是具体的存储结构问题,不同的存储结构在做多项式加法时的算法不同,但要点是一样的,即将幂指数相同的项的系数合并。