数据结构与STL_第4章_多维数组与广义表
《数据结构》教案 第四章 数组和广义表
ch4 数组和广义表本实习单元是作为从线性结构到非线性结构的过渡来安排的。
数组和广义表可以看成其元素本身也是自身结构( 递归结构 ) 的线性表。
广义表本质上是一种层次结构 , 自顶向下识别并建立一个广义表的操作,可视为某种树的遍历操作:遍历逻辑的〈或符号形式的)结构,访问动作是建立一个结点。
稀疏矩阵的十字链表存储结构也是图的一种存储结构。
由此可见,这个实习单元的训练具有承上启下的作用。
希望读者能深入研究数组的存储表示和实现技术,熟悉广义表的存储结构的特性。
编程技术训练要点:稀疏矩阵的表示方法及其运算的实现(4.1〉;共享数据的存储表示方法(4.2);形式系统的自底向上和自顶向下识别技术(4.3 〉; 递归算法的设计方法(4.3);表达式求值技术 (4.4) 。
1. 稀疏矩阵运算器【问题描述】稀疏矩阵是指那些多数元素为零的矩阵。
利用 " 稀疏 " 特点进行存储和计算可以大大节省存储空间 , 提高计算效率。
实现一个能进行稀疏矩阵基本运算的运算器。
【基本要求】以"带行逻辑链接信息"的三元组顺序表表示稀疏矩阵,实现两个矩阵相加、相减和相乘的运算。
稀疏矩阵的输入形式采用三元组表示 , 而运算结果的矩阵则以通常的阵列形式列出。
【测试数据】【实现提示】1. 首先应输入矩阵的行数和列数 , 并判别给出的两个矩阵的行、列数对于所要求作的运算是否相匹配。
可设矩阵的行数和列数均不超过 20 。
2. 程序可以对三元组的输入顺序加以限制 , 例如 , 按行优先。
注意研究教科书 5.3.2节中的算法 , 以便提高计算效率。
3. 在用三元组表示稀疏矩阵时 , 相加或相减所得结果矩阵应该另生成 , 乘积矩阵也可用二维数组存放。
【选作内容】1. 按教科书 5.3.2 节中的描述方法 , 以十字链表表示稀疏矩阵。
2. 增添矩阵求逆的运算 , 包括不可求逆的情况。
在求逆之前 , 先将稀疏矩阵的内部表示改为十字链表。
数据结构第4章 数组和广义表
第4章数组和广义表【例4-1】二维数组A的每一个元素是由6个字符组成的串,其行下标i=0,1,…,8,列下标j=1,2,…,10。
若A以行为主序存储元素,A[8][5]的物理地址与当A按列为主序存储时的元素()的物理地址相同。
设每个字符占一个字节。
A.A[8][5] B.A[3][10] C.A[5][8] D.A[0][9]解:二维数A是一个9行10列的矩阵,即A[9][10]。
按行存储时,A[8][5]是第85个元素存储的元素。
而按列存储时,第85个存储的元素是A[3][10]。
即正确答案为B。
【例4-2】若对n阶对称矩阵A以行序为主序方式将其下三角形的元素(包括主对角线上所有元素)依次存放于一维数组B[n(n+1)/2]中,则在B中确定的位置k的关系为()。
A.jii+-2)1(*B.ijj+-2)1(*C.jii++2)1(*D.ijj++2)1(*解:如果a ij按行存储,那么它的前面有i-1行,其有元素个数为:1+2+3+…+(i-1)=i(i-1)/2。
同时它又是所在行的第j列,因此它排列的顺序还得加上j,一维数组B[n(n+1)/2]中的位置k与其下标的关系是:jii+-2)1(*。
因此答案为A。
【例4-3】已知n阶下三角矩阵A,按照压缩存储的思想,可以将其主对角线以下所有元素(包括主对角线上元素)依次存放于一维数组B中。
请写出从第一列开始以列序为主序分配方式时在B中确定元素a ij的存放位置的公式。
解:如果a ij按列存储,那么它的前面有j-1列,共有元素:n+(n-1)+(n-2)+ …+[n-(j-2)]=(j-1)*n-2)1)(2(--jj而它又是所在列的第i行,因此在它前的元素个数还得加上i。
因此它在一维数组B中的存储顺序为:(j-1)*n-2)1)(2(--jj+i【例4-4】已知广义表L=((x,y,z),a,(u,t,w)),从L表中取出的原子项ASCII码最大的运算是()。
数据结构讲稿课件-第4章串、数组和广义表
大学复习资料
专 业: 班 级: 科目老师: 日 期:
• 第2章 线性表
• 第3章 栈和队列
• 第4章 串、数组和广 义表
线性结构
可表示为:(a1 , a2 , ……, an)
2021/3/182021年3月21日
补充:C语言中常用的串运算 调用标准库函数 #include<string.h>
串比较,strcmp(char s1,char s2) 串复制,strcpy(char to,char from) 串连接,strcat(char to,char from) 求串长,strlen(char s)
……
2021/3/182021年3月21日
第4章 串、数组和广义表
教学内容
4.1 串 4.2 数组 4.3 广义表
i
BF算法设计思想
S :ababcabcacbab
•
T :abc j
i指针回溯
S :ababcabcacbab
T : abc
S :ababcabcacba b
T : abc
BF算法设计思想
Index(S,T,pos)
• 将主串的第pos个字符和模式的第一个字符比较, 若相等,继续逐个比较后续字符; 若不等,从主串的下一字符起,重新与模式的第 一个字符比较。
• 直到主串的一个连续子串字符序列与模式相等 。 返回值为S中与T匹配的子序列第一个字符的序号, 即匹配成功。
• 否则,匹配失败,返回值 0
BF算法描述(算法4.1)
int Index(Sstring S,Sstring T,int pos){ i=pos; j=1; while (i<=S[ 0 ] && j <=T[ 0 ]){ if ( S[ i ]=T[ j ]) {++i; ++j; } else{ i=i-j+2; j=1; } if ( j>T[ 0 ]) return i-T[0]; else return 0;
数据结构与算法分析第4讲 数组和广义表
• 矩阵的压缩存储
– 对称矩阵 a11 a12 …. … ….. a1n a21 a22 …….. ……. a2n
…………………. an1 an2 …….. ann
三角矩阵共计元素个 数为:
n(n+1)/2
按行序为主序:
a11 a21 a22 a31 a32 …... an1 …... ann
随机稀疏矩阵的顺序压缩存储
三元组表示法
随机稀疏矩阵的链式压缩存储
十字链表
十字链表
M .chead
^
M .rhead
113
2 2 -1
^^
3 11 2
^1 ^
145
^^
3005 0 -1 0 0 2000
Typedef struct OLNode{
int
i, j;
ElemType
e;
struct OLNode *right, *right;
稀疏矩阵 (Sparse Matrix)
0 0 0 22 0 0 15
0 11 0 0 0 17 0
A67
0 0
0 0
0 0
6 0 0
0
0 0 39 0
901
0 0
0 28
0 0
00 00
0 0
非零元素个数远远少于矩阵元素个数
假设 m 行 n 列的矩阵含 t 个非零元素,
那么称
Chapter 4 Array & General List
Section 1 Array
数组的抽象数据类型定义
ADT Array {
D={ aj1,j2, ...,,ji, jn|ji=0,...,bi-1, i=1,2,..,n } (n称数组的维数,bi是数组第i维的长度,ji是数组元素的第i维
02331数据结构 04数组和广义表
02331数据结构 04数组和广义表02331数据结构-04数组和广义表第四章多维数组和广义表1.多维数组和广义表是一种复杂的非线性结构,它们的逻辑特征是:一个数据元素可能有多个直接前驱和多个直接后继。
2.一维数组(矢量)是存储在计算机连续存储空间中的若干具有统一类型的数据元素。
同一数组的不同元素通过不同的下标标识。
(a1,a2,…,an)3.二维数组amn可视为由m个行向量组成的向量,或由n个列向量组成的向量。
二维数组中的每个元素aij既属于第i行的行向量,又属于第j列的列向量。
4.多维数组:3D数组AMNP可以看作是一个以2D数组为数据元素的向量。
将三维阵列的四维向量作为视觉数据三维数组中的每个元素aijk都属于三个向量。
四维数组中的每个元素都属于四个向量……5.数组的顺序存储:由于计算机内存是一维的,因此多维数组的元素应按线性顺序排列并存储在内存中。
数组通常不执行插入和删除操作,也就是说,结构中的元素数量和元素之间的关系不会改变。
通常,顺序存储方法用于表示阵列。
(1)行优先级:按行向量排列数组元素,I+1行向量紧跟在第I行向量之后。
【示例】二维数组amn的行首存储的线性序列为:a11,A12,。
,A1N,A21,A22,。
,A2N,。
,AM1,AM2,。
,amn(2)列优先级将数组元素按列向量排列,第i+1个列向量紧接在第i个列向量后面。
【例】二维数组amn的按列优先存储的线性序列为:a11,a21,…,am1,a12,a22,…,am2,……,a1n,a2n,…,amn6.数组元素的地址计算公式:(1)按行优先级顺序存储的二维数组amn地址计算公式loc(aij)=loc(a11)+[(i-1)×n+j-1]×d(注:此公式下界为1,如下界为0,则公式变为[i×n+j])①loc(a11)是开始结点的存放地址(即基地址)②d为每个元素所占的存储单元数③ 根据地址计算公式,可以通过地址公式同时在内存中访问数组中的任何元素。
数据结构答案第4章
数据结构答案第4章本页仅作为文档封面,使用时可以删除This document is for reference only-rar21year.March第 4 章广义线性表——多维数组和广义表2005-07-14第 4 章广义线性表——多维数组和广义表课后习题讲解1. 填空⑴数组通常只有两种运算:()和(),这决定了数组通常采用()结构来实现存储。
【解答】存取,修改,顺序存储【分析】数组是一个具有固定格式和数量的数据集合,在数组上一般不能做插入、删除元素的操作。
除了初始化和销毁之外,在数组中通常只有存取和修改两种操作。
⑵二维数组A中行下标从10到20,列下标从5到10,按行优先存储,每个元素占4个存储单元,A[10][5]的存储地址是1000,则元素A[15][10]的存储地址是()。
【解答】1140【分析】数组A中每行共有6个元素,元素A[15][10]的前面共存储了(15-10)×6+5个元素,每个元素占4个存储单元,所以,其存储地址是1000+140=1140。
⑶设有一个10阶的对称矩阵A采用压缩存储,A[0][0]为第一个元素,其存储地址为d,每个元素占1个存储单元,则元素A[8][5]的存储地址为()。
【解答】d+41【分析】元素A[8][5]的前面共存储了(1+2+…+8)+5=41个元素。
⑷稀疏矩阵一般压缩存储方法有两种,分别是()和()。
【解答】三元组顺序表,十字链表⑸广义表((a), (((b),c)),(d))的长度是(),深度是(),表头是(),表尾是()。
【解答】3,4,(a),((((b),c)),(d))⑹已知广义表LS=(a,(b,c,d),e),用Head和Tail函数取出LS中原子b的运算是()。
【解答】Head(Head(Tail(LS)))2. 选择题⑴二维数组A的每个元素是由6个字符组成的串,行下标的范围从0~8,列下标的范围是从0~9,则存放A至少需要()个字节,A的第8列和第5行共占()个字节,若A按行优先方式存储,元素A[8][5]的起始地址与当A按列优先方式存储时的()元素的起始地址一致。
数据结构 第4章 多维数组及广义表 答案
4 多维数组及广义表4.1回答下列概念:三元组表、广义表、十字链表三元组表:稀疏矩阵中的非零元素三元组组成的线性表。
广义表:也称为列表(Lists)是n(n≥0)个元素a1,a2,…,a i,…,a n的有限序列,元素a i可以是原子或者是子表(子表亦是广义表)。
十字链表:稀疏矩阵(即三元组表)的一种链接存储结构。
稀疏矩阵中每个非零元素都用一个包含五个域的结点来表示,存储非零元素所在行的行号域i,存储非零元素所在列的列号域j,存储非零元素值的值域v,以及行指针域right和列指针域down,分别指向同一行中的下一个非零元素结点和同一列中的下一个非零元素结点。
4.2二维数组在采用顺序存储时,元素的排列方式有哪两种?行优先和列优先。
4.3 矩阵压缩存储的目的是什么?请写出对称阵压缩存储四种方式的地址公式。
压缩存储的目的:节省矩阵的存储空间。
将对称矩阵的下(上)三角存储在数组长度为n(n+1)/2的数组sa中,设矩阵中的某一个元素a ij在数组中的下标为k,则对称阵压缩存储四种方式下k的计算公式如下:(1)行优先顺序存储下三角i(i+1)/2+j i≥j (下三角)k=j(j+1)/2+i i<j(上三角)(2)列优先顺序存储下三角j(2n-j+1)/2+i-j i≥j (下三角)k=i(2n-i+1)/2+j-i i<j (上三角)(3)行优先顺序存储上三角i(2n-i+1)/2+j-i i≤j (上三角)k=j(2n-j+1)/2+i-j i>j (下三角)(4)列优先顺序存储上三角j(j+1)/2+i i≤j (上三角)k=i(i+1)/2+j i>j (下三角)4.4 在特殊矩阵和稀疏矩阵中,哪一种经过压缩存储后会失去随机存取的特性?稀疏矩阵。
4.5 设有一个10阶的对称矩阵A,以行优先顺序存储下三角元素,其中a00为第一元素,其存储地址为1,每个元素占一个字节,则a 85的地址为多少?若a 11为第一元素,那么a 85的地址又会是多少?若a 00为第一元素,则a 85的地址为:41 若a 11为第一元素,则a 85的地址为:324.6 请给出图4.10中稀疏矩阵A 6×7的三元组顺序表和十字链表存储结构图示。
数据结构 多维数组及广义表
第1列
Байду номын сангаас
aij的地址为:LOC(aij)= LOC(a00)+(j×m+i)× d
二维数组的逻辑特征和存储方法可以很容易地推广到多维数 组。 例如三维数组可以看成是由二维数组组成的线性表,三维数 组中的每个元素最多有三个直接前趋和三个直接后继。 同样,行优先原则和列优先原则也可以推广到多维数组,按 行优先原则时先排最右的下标,按列优先原则时先排最左的下 标。 得到行优先或列优先序列后,可以把它们依次存放在连续的 存储空间中,这就是多维数组的顺序存储,同样可实现随机存 取。
a00 C C a01 a11 C a12 a22 a0,n-1 a1,n-1
……
C
……
C
an-1,n-1
若上三角阵以行优先顺序存储,则地址公式与对称矩阵的行 优先顺序存储上三角的地址公式相似,元素的下标k为:
k= i(2n-i+1)/2+j-i i≤j (上三角) n(n+1)/2 i>j (下三角)
(1)行优先顺序存储下三角 以图(a)所示的n阶方阵为例,行优先顺序存储下三角时 元素的排列顺序如图(b)所示,存储在一维数组中如图(c )所示。
a00 a10 a20 a01 a11 a21 a22 a0,n-1 a1,n-1 a00 a01 a10 a11 a20 a21 a22 a0,n-1 a1,n-1
1.三元组顺序表
将三元组表中的三元组按照行优先的顺序排列成一个序列, 然后采用顺序存储方法存储该线性表,称为三元组顺序表。矩 阵A的三元组顺序表为:
0 11 0 -3 A6×7= 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 6 0 0 0 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 0 0 B6×7= 4 0
第4章 串、多维数组与广义表
4.1.1 串的定义
串(string)(或字符串)是由零个或多个字符组成 的有限序列,一般记为: S="a1 a2 …… an" (n≥0) 串名:串的名字S。 串值:用双引号括起来的字符串序列,ai(1≤i≤n) 可以是字母、数字或其他字符。 串的长度:串中字符的个数n称为串的长度。 串相等:只有当两个串的长度相等,并且各个对 应位置上的字符都相等时,才能称为串相等。
4.1.1 串的定义
判断空串StrEmpty(S):若S为空串,则返回TRUE,否则返回FALSE; 串复制StrCopy(&T,S):将串S复制到串T; 串清空ClearString(S):将S置空串; 串定位StrIndex(S,T,pos):串S和T存在,T是非空串, 1≤pos≤StrLength(S),若T是S的子串,返回T在S中第一次出现的位 置,否则返回0; 串置换Replace(&S,T,V):串S,T和V存在,T是非空串,用V替换主串 S中出现的所有与T相等的不重叠的子串。例如:设S= "bbabbabba",T="ab",V="a",则Replace(&S,T,V)的结果是S ="bbababa"; 串插入StrInsert(&S,pos,T):1≤pos≤StrLength(S)+1,在串S的第pos 个字符之前插入串T; 串删除StrDelete(&S,pos,len): 1≤pos≤StrLength(S)-len+1,从串S中 删去第pos字符起长度为len的子串; 串销毁DestroyString(&S) :串S被销毁,并回收串空间; }ADT String
4.1.3 串的模式匹配算法
04 数组和广义表
稀疏矩阵的压缩存储
• 如稀疏矩阵
M=
0 12 0 0 -3 0 0 0 0 18 15 0 9 0 0 0 0 0 24 0 0 0 0 -7 0 0 0 0 0 0 0 0 14 0 0 0 0 0 0 0 0 0
– 采用三元组法压缩存储稀疏矩阵
• 按行号排序 • 不支持随机存取,对某行某非零元素访 问时,可能需要扫描整个顺序表
特殊矩阵的压缩存储
• 如3*3对称矩阵
a11 a12 a13 a21 a22 a23 a31 a32 a33
aij = aji
sa
a11 a21 a22 a31 a32 a33
0
– 未压缩时,用二维数组存 放,占用 9 个单元 – 压缩存放时,用一维数组 存放,只需 6 个单元 • 如a32存放在sa[4]中
M.mu = 6 M.nu = 7 M.tu = 8 M.data: i j e
1 1 3 3 4 5 6 6 2 3 1 6 3 2 1 4 12 9 -3 14 24 18 15 -7
• 采用三元组顺序表存储的矩阵的转置算法
Status TransposeSMatrix(TSMatrix M, TSMatrix &T) { T.mu = M.nu; T.nu = M.mu; T.tu = M.tu; if (T.tu) { //有非零元素,转置 q = 1; //非零元素计数器 for (col = 1; col <= M.mu; ++col) //按列 for (p = 1; p <= M.tu; ++p) //在三元组中找 if (M.data[p].j = col) { T.data[q].i = M.data[p].j; T.data[q].j = M.data[p].i; T.data[q].e = M.data[p].e; ++q; } } return OK; }
数据结构2331第4章数组和广义表
a10 a11 … c …………….. an-1 0 an-1 1 … an-1 n-1
(a)上三角矩阵
(b)下三角矩
14
三角矩阵中的重复元素c可共享一个存储空间,其余的 元素正好有n(n+1)/2个,因此,三角矩阵可压缩存储到 向量s[0..n(n+1)/2]中,其中c存放在向量的最后一个分 量中。
4
§4.1.2 数组的存储结构
1.存储结构——顺序存储结构
由于计算机的内存结构是一维的,因此用一维内 存来表示多维数组,就必须按某种次序将数组元素 排成一列序列,然后将这个线性序列存放在存储器 中。 又由于对数组一般不做插入和删除操作,也就是 说,数组一旦建立,结构中的元素个数和元素间的 关系就不再发生变化。因此,一般都是采用顺序存 储的方法来表示数组。
⑵列优先顺序(以列为主存放)——将数组元素按列向 量排列,第j+1个列向量紧接在第j个列向量之后,A的m*n 个元素按列优先顺序存储的线性序列为: a0 0,a1 0,…,am-1 0,a0 1,a1 1,…am-1 1,…,a0 n-1,a1 n-1, …, am-1 n-1 在FORTRAN语言中,数组就是按列优先顺序顺序存储的。 6
0
0
an-2 n-3 an-2 n-2 an-2 n-1 an-1 n-2 an-1 n-1
16
在三对角矩阵中非0元素的分布有明显的规律,可将它 们压缩存储到一维数组中,并找到每个非0元素在一维数 组中的对应关系。 可按行优序为主序来存储三对角矩阵。除第0行和第n-1 行是2个元素外,每行的非零元素都要是3个,因此,需存 储的元素个数为3n-2。
8
§4.1.3 矩阵的压缩存储
在科学与工程计算问题中,矩阵是一种常用的数学 对象,在高级语言编制程序时,简单而又自然的方法, 就是将一个矩阵描述为一个二维数组。矩阵在这种存储 表示之下,可以对其元素进行随机存取,各种矩阵运算 也非常简单,并且存储的密度为1。但是在矩阵中非零 元素呈某种规律分布或者矩阵中出现大量的零元素的情 况下,看起来存储密度仍为1,但实际上占用了许多单 元去存储重复的非零元素或零元素,这对高阶矩阵会造 成极大的浪费,为了节省存储空间, 我们可以对这类 矩阵进行压缩存储:即为多个相同的非零元素只分配一 个存储空间;对零元素不分配空间。
数据结构课件 第4章数组和广义表
4
4.1 多维数组
数组(array)的定义 4.1.1 数组 的定义
是由一组类型相同的数据元素构成的有序集合, 是由一组类型相同的数据元素构成的有序集合, 类型相同的数据元素构成的有序集合 每个数据元素称为一个数组元素( 每个数据元素称为一个数组元素(简称为元 ),每个元素受 每个元素受n(n≥ 个线性关系的约束 的约束, 素),每个元素受 ≥1)个线性关系的约束, 每个元素在n个线性关系中的序号 个线性关系中的序号i 每个元素在 个线性关系中的序号 1、i2、…、in 、 称为该元素的下标,并称该数组为n维数组 维数组。 称为该元素的下标,并称该数组为 维数组。
12
4.2 矩阵的压缩存储▲
在矩阵中很多值相同的元素并且它们的分布有一定的规律, 在矩阵中很多值相同的元素并且它们的分布有一定的规律, 特殊矩阵, 我们将这样的矩阵称为特殊矩阵 我们将这样的矩阵称为特殊矩阵,如对角阵等 。 若矩阵中有很多零元素称为稀疏矩阵 若矩阵中有很多零元素称为稀疏矩阵 对于这些特殊的矩阵,怎样存储能节省存储空间, 对于这些特殊的矩阵,怎样存储能节省存储空间,同时也能 有效地进行运算
本章学习要求与重点难点
2
本章学习要求: 本章学习要求:
1)了解数组的两种顺序存储表示方法, 1)了解数组的两种顺序存储表示方法,掌握数组在以行 了解数组的两种顺序存储表示方法 为主序的存储结构中的地址计算方法 2)了解矩阵压缩存储的必要性, 2)了解矩阵压缩存储的必要性,掌握特殊矩阵压缩存储 了解矩阵压缩存储的必要性 时的下标变换公式 3) 理解稀疏矩阵的两种压缩存储方法的特点和适用范 围,理解三元组表示的稀疏矩阵在进行转置等运算处理 时使用的处理方法 4)掌握广义表的结构特点、 4)掌握广义表的结构特点、存储表示和基本逻辑运算 掌握广义表的结构特点 求表头、求表尾) (求表头、求表尾) 5)了解有关广义表的递归算法 5)了解有关广义表的递归算法
第4章数组和广义表
第4章数组和广义表第4章数组和广义表本章主要介绍下列内容:1.数组的定义、基本运算和存储结构2.特殊矩阵的压缩存储3.广义表的定义、术语、存储结构、运算4.递归算法设计课时分配:1两个学时,2两个学时,3两个学时, 4两个学时重点、难点:特殊矩阵的压缩存储、广义表的存储结构、递归算法设计第一节数组1.数组的定义和基本运算数组的特点是每个数据元素可以又是一个线性表结构。
因此,数组结构可以简单地定义为:若线性表中的数据元素为非结构的简单元素,则称为一维数组,即为向量;若一维数组中的数据元素又是一维数组结构,则称为二维数组;依次类推,若二维数组中的元素又是一个一维数组结构,则称作三维数组。
结论:线性表结构是数组结构的一个特例,而数组结构又是线性表结构的扩展。
举例:其中,A是数组结构的名称,整个数组元素可以看成是由m个行向量和n个列向量组成,其元素总数为m×n。
在C语言中,二维数组中的数据元素可以表示成a[表达式1][表达式2],表达式1和表达式2被称为下标表达式,比如,a[i][j]。
数组结构在创建时就确定了组成该结构的行向量数目和列向量数目,因此,在数组结构中不存在插入、删除元素的操作。
二维数组结构的基本操作:(1)给定一组下标,修改该位置元素的内容Assign(A,elem,index1,index2)(2)给定一组下标,返回该位置的元素内容Value(A,elem,index1,index2)2.数组的存储结构从理论上讲,数组结构也可以使用两种存储结构,即顺序存储结构和链式存储结构。
然而,由于数组结构没有插入、删除元素的操作,所以使用顺序存储结构更为适宜。
换句话说,一般的数组结构不使用链式存储结构。
组成数组结构的元素可以是多维的,但存储数据元素的内存单元地址是一维的,因此,在存储数组结构之前,需要解决将多维关系映射到一维关系的问题。
举例:LOC(i,j)=LOC(0,0)+(n*i+j)*L数组结构的定义:#define MAX_ROW_INDEX 10#define MAX_COL_INDEX 10typedef struct{Elemtype elem[MAX_ROW_INDEX][MAX_COL_INDEX] } ARRAY;基本操作算法举例:(1)给数组元素赋值void Assign(ARRAY *A,Elemtype elem,int index1,int index2) { if (index1<0||index1>=MAX_ROW_INDEX||index2<0||index2>=MA X_COL_INDEX) exit(ERROR);else A->elem[index1][index2]=elem; }(2)返回给定位置的元素内容int Value(ARRAY A,Elemtype *elem,int index1,int index2){ if (index1<0||index1>=MAX_ROW_INDEX|| index2<0||index2>=MAX_COL_INDEX) return FALSE;else { *elem= A.elem[index1][index2]; return OK;3.矩阵的压缩存储矩阵是在很多科学与工程计算中遇到的数学模型。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
转置
data[0] data[1] data[2] data[3] data[4] data[5] … row col value 0 1 2 1 3 9 m=5 2 0 3 n=4 3 2 6 t=6 4 0 1 4 3 4 … … …
0 0 3 0 1
2 0 0 0 0
0 0 0 6 0
0 9 0 0 4
17
#define MAX_ELEMENT_NUMBER 1000 template <class T> struct MatrixNode //定义三元组结构 { int row; //非零元素的行号 int col; //非零元素的列号 T value; //非零元素的值 }; template <class T> struct SpareMatrix //定义三元组表结构 { int m; //稀疏矩阵的行数 int n; //稀疏矩阵的列数 int t; //稀疏矩阵非零元素的个数 MatrixNode <T> data[MAX_ELEMENT_NUMBER]; //存储非零元素对应的三元组 };
0 2 0 0 0 0 0 9 3 0 0 0 0 0 6 0 1 0 0 4 data[0] 0 2 3 data[1] 0 4 1 data[2] 1 0 2 data[3] 2 3 6 data[4] 3 1 9 data[5] 3 4 4 … … … … m=4 n=5 t=6
《数据结构与STL》
假设 m 行 n 列的矩阵含 t 个非零元素, 则称
t m n
为稀疏因子。
通常认为 0.05 的矩阵为稀疏矩阵。
《数据结构与STL》 16
4.2.2 稀疏矩阵压缩存储
存储稀疏矩阵时,只需要存储非零元素。常见的 稀疏矩阵压缩方法:三元组表和十字链表
稀疏矩阵中每个非零元素的行号、列号及值构成 row col value 一个三元组(3-tuples)
三对角矩阵
在存储对角矩阵时,可将对角线附近的带状区域元素 立起来,形成一个列数较少的新矩阵,然后可按行优 先方式存储这个新矩阵。
x 3 8 4 1 1 4 6 2 3 2 7 5 9 x x 1
第1行
2
3
4
第2 行
7
8
6
第3 行
5
4
2
第4 行
9
1
3
第5 行
14
《数据结构与STL》
n维m对角矩阵A(m为奇数),设其对角线附近的元素aij存储到 一维数组元素sa[k]中。由于aij在对角线附近,因此
对于n阶三角矩阵,需要存储n(n+1)/2+1个元素
《数据结构与STL》 11
上三角矩阵存储
按行优先存储n阶上三角矩阵,设aij存储到sa[k]中, 若aij位于矩阵上三角,有0≤i≤j<n,则在存储aij之前, sa数组中首先要存储前i行上三角的元素,然后再存储aij 所在行从aii到ai,j-1的元素
12
《数据结构与STL》
作业
按行优先存储n阶下三角矩阵时,首先存储下三 角的元素,最后存储上三角的常数项c。给出 aij与sa[k]的对应关系。
对于按列优先方式存储的n阶三角矩阵,请推导 元素存储位置k与下标i、j的对应关系
《数据结构与STL》
13
对角矩阵
所有非零元素都集中在对角线附近的方阵
1 3 0 0 0 2 4 8 0 0 0 7 6 4 0 0 0 5 2 1 0 0 0 9 3
《数据结构与STL》 3
行优先存储——基本思想是按行存储,即存完 第i行再接着存储第i+1行。按行优先顺序存储 二维数组Amn,线性序列为: a11,a12,…,a1n,a21,a22,…,a2n,…,am1,am2,…,amn
1 1 a11 j n
Loc(aij) =Loc(a11)+((i-1)×n+j-1)×c
max(i-(m-1)/2,0)≤j≤min(i+(m-1)/2,n-1)
aij之前共有i行,每行m个元素,首先要存储这mi个元素。 在aij所在行上,aij之前共有j-i+(m-1)/2个元素。 因此在存储aij之前,总共要存储mi+j-i+(m-1)/2个元素,即有: k=mi+j-i+(m-1)/2=(m-1)i+j+(m-1)/2
k ( (n l )) j i ni (i i ) / 2 j
2 l 0
i 1
若aij位于矩阵下三角,有0≤j<i<n,此时所有的aij具 有相同的值,只需保存1个值
k = n(n+1)/2 (0≤j<i<n)
a00 a01 a0n c a11 a 1n A c c ann
data[0] data[1] data[2] data[3] data[4] data[5] …
row col value 0 1 2 1 3 9 m=5 2 0 3 n=4 3 2 6 t=6 4 0 1 4 3 4 … … …
由于每趟遍历都需要比较所有的t个三元组的列号,因 此算法的时间复杂度为O(nt)。
x 3 8 4 1 1 4 6 2 3 2 7 5 9 x x 1
第1 行
1 3 0 0 0
2 4 8 0 0
0 7 6 4 0
0 0 5 2 1
0 0 0 9 3
2
3
4
第2 行
7
8
6
第3 行
5
4
2
第4 行
9
1
3
第5 行
15
《数据结构与STL》
4.2.2 稀疏矩阵压缩存储
矩阵Amn中的非零元素个数s远远小于矩阵元素 的总数m×n
《数据结构与STL》 18
稀疏矩阵的转置操作
0 2 0 0 0 0 0 9 3 0 0 0 0 0 6 0 1 0 0 4 data[0] data[1] data[2] data[3] data[4] data[5] … row col value 0 2 3 0 4 1 1 0 2 m=4 n=5 2 3 6 t=6 3 1 9 3 4 4 … … …
《数据结构与STL》
第四章 多维数组与广义表
北京邮电大学 信息与通信工程学院
第四章 多维数组和广义表
学习内容: 4.1 多维数组 4.2 矩阵的压缩存储 4.3 广义表 4.4 实例分析 4.5 使用STL操作多维数组 (计划学时2h)
《数据结构与STL》
2
4.1 多维数组
由类型相同的数据元素构成的有序集合。对于k 维数组,每个元素都要受k个线性关系的约束。
《数据结构与STL》 20
简单转置算法
//将稀疏矩阵OrigMat转置为TransMat template <class T> void TransMat(SpareMatrix <T> * OrigMat, SpareMatrix <T> * TransMat) { TransMat->m = OrigMat->n;//设置转置矩阵的行数 TransMat->n = OrigMat->m;//设置转置矩阵的列数 TransMat->t = 0;//初始时转置矩阵的非零元素个数为 for (int col=0;col<OrigMat->n;col++) for (int j=0;j<OrigMat->t;j++) if (OrigMat->data[j].col == col)//找出列号为col的三元组 { TransMat->data[TransMat->t].col = OrigMat->data[j].row ; TransMat->data[TransMat->t].row = OrigMat->data[j].col ; TransMat->data[TransMat->t].value = OrigMat->data[j].value ; TransMat->t++;//非零元素个数增 } }
特殊矩阵压缩存储 对称矩阵 三角矩阵 对角矩阵
稀疏矩阵压缩存储
《数据结构与STL》 8
对称矩阵
1 2 0 4 3
0 0 a00 a10 a11
共i行
2 0 7 8 1
0 7 6 5 4
j-1
4 8 5 2 9
j
3 1 4 9 3
n(n 1) 共需要存储的元素数目 k 2 k 1
n
设所有元素存储到一维数组sa中,aij 存储在sa[k]元素中,k与ij的关系?
共i-1行
a1 n
i
共j-1列
aij a11
aij之前共有(i-1)n+j-1个元素
… a1n a21 … a2n …
第1行 第2 行
ai1
… aij-1 aij
第i 行
…
ain
… amn
m
am 1
如果从a0开始: Loc( ) =Loc( a00)+(i×n+j)×c 在 C++a 、 等语言中,数组都是按行优先存储的 ijPASCAL
《数据结构与STL》
19
稀疏矩阵简单转置算法
遍历n趟三元组表:
•
• •
第一趟遍历找出列号为0的三元组,并将其行号和列号对调, 添加到转置矩阵对应的三元组表中。 第二趟遍历找出列号为1的三元组并进行相同的操作, 依次类推,最后一趟遍历找出列号为n-1的三元组。
data[0] data[1] data[2] data[3] data[4] data[5] … row col value 0 2 3 0 4 1 1 0 2 m=4 n=5 2 3 6 t=6 3 1 9 3 4 4 … … …