130 likes | 374 Views
第 3 章 稀疏矩阵和广义表. 3.1 稀疏矩阵 3.2 广义表. 本章重点 理解稀疏矩阵和广义表的定义及其操作,掌 握其算法 本章难点 对稀疏矩阵和广义表的应用 学习目标 理解稀疏矩阵和广义表的定义及其操作 掌握对稀疏矩阵和广义表的应用与算法. 3.1 稀疏矩阵. 一、稀疏矩阵的定义 1.稀疏矩阵的概念 稀疏矩阵:非零元素的个数远远小于零元素的矩阵。 2.稀疏矩阵的三元组线性表表示 1)存储矩阵的一般方法:二维数组。(浪费太大) 2)三元组: (row,col,value) 3.稀疏矩阵的运算概述
E N D
第3章 稀疏矩阵和广义表 3.1 稀疏矩阵 3.2 广义表
本章重点理解稀疏矩阵和广义表的定义及其操作,掌 握其算法本章难点对稀疏矩阵和广义表的应用学习目标理解稀疏矩阵和广义表的定义及其操作掌握对稀疏矩阵和广义表的应用与算法
3.1 稀疏矩阵 一、稀疏矩阵的定义 1.稀疏矩阵的概念 稀疏矩阵:非零元素的个数远远小于零元素的矩阵。 2.稀疏矩阵的三元组线性表表示 1)存储矩阵的一般方法:二维数组。(浪费太大) 2)三元组:(row,col,value) 3.稀疏矩阵的运算概述 通常为求一个稀疏矩阵的转置,计算两个矩阵的和, 计算两个矩阵的乘积等。
二、稀疏矩阵的存储结构 1. 顺序存储 1)结点结构:三元组 2)存储方法:顺序存储。 3)用C描述结构: struct Triple //三元组结构 { int row,col; ElemType val; }; struct SMatrix //稀疏矩阵 { int m,n,t; Triple sm[MaxSize+1]; };
列号 行号 next 值 2. 链接存储 1)带行指针向量的链接存储 ①结点结构: ②存储方法:链接。 ③用C描述结构: struct TripleNode { int row,col; ElemType val; TripleNode *next; }; struct LMatrix { int m,n,t; TripleNode *vector[MaxRows+1]; };
struct CLMmatrix //结点结构 { int m,n,t; CrossNode *rv[MaxR+1]; TripleNode *cv[MaxC+1]; }; 行 列 值 down right 2)十字链接存储 ①结点结构: ②存储方法:链接 ③用C描述结构: struct CrossNode { int row,col; ElemType val; TripleNode *right ; TripleNode *down };
三、稀疏矩阵的运算 1. 初始化运算 ①基于顺序存储SMatrix结构。 ②基于带行指针向量LMatrix结构。 ③基于十字链接CLMatrix结构 2. 稀疏矩阵的输入 ①基于顺序存储SMatrix结构。 ②基于十字链接CLMatrix结构。 3. 稀疏矩阵的输出:基于顺序存储SMatrix结构。
4. 稀疏矩阵的转置运算(基于SMatrix结构) ①方法一: 对M.sm进行n次扫描: 第一次,对M.sm.col等于1的元素进行处理; 第二次,对M.sm.col等2的元素进行处理; …依次写入S.sm中。 ②方法二: 对M.sm数组进行两次扫描: 第一次,统计M.sm中每列的非0元素个数,写入num[col]中,计算出该列中第一个待换的位置,写入pot[col]中; 第二次,把M.sm中的每一个三元组,写入S.sm中。 注:计算某列转换的开始位置公式为: pot[1]=1; pot[col]=pot[col-1]+num[col-1];
3.2 广义表(Generalized List) 一、广义表的定义 1. 广义表的概念 广义表:是线性表的推广,一个广义表是n(n≥0)个元素的一个序列,当n=0时则称为空表。在一个非空的广义表中,其元素可以是某一确定类型的对象(单元素),也可以是由单元素构成的表(子表或表元素)。 表示:LS=(a1,a2, …,an) 2. 例子 A=() D=(A,B,C)=((),(e),(a,(b,c,d))) 表的深度:指该表中括号嵌套的最大层数 表头和表尾概念 3. 图示
tag next data/sublist 二、广义表的存储结构 1. 结点结构: tag:为0(单元素)或1(子表) data/sublist(共用体): 引用data(单元素) 或引用sublist(子表头指针) next:同一层次表结点的后继。 2. 存储方法:链接存储
3. 用C描述广义表结构 struct GLNode { Boolean tag; union{ ElemType data; GLNode *sublist; }; GLNode *next; } ; 4. 广义表存储结构示意图 不带表头附加结点 带表头附加结点
三、广义表的运算 1. 求广义表的长度(递归算法) int Lenth(GLNode *GL) { if (GL!=NULL) return 1+Lenth(GL->next); else return 0; } 2. 求广义表的深度(递归算法) 方法:max(所有子表深度)+1。 当表为空或线性表时,深度为1。
3. 建立广义表的存储结构 说明: ①输入格式为广义表的展开格式,即: “(a,(#),b,c,(d,(e)));”, 其中#表示空表,“;”表示表结束。 ②生成的广义表是带表头附加结点的结构。 4.打印输出广义表 说明: 输出的广义表样式为广义表的展开格式 (与建立时的输入一致)。