知识大全 稀疏矩阵

Posted 元素

篇首语:古人已用三冬足,年少今开万卷余。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 稀疏矩阵相关的知识,希望对你有一定的参考价值。

稀疏矩阵

  设矩阵Amn中有s个非零元素 若s远远小于矩阵元素的总数(即s<<m×n) 则称A为稀疏矩阵

稀疏矩阵的压缩存储  为了节省存储单元 可只存储非零元素 由于非零元素的分布一般是没有规律的 因此在存储非零元素的同时 还必须存储非零元素所在的行号 列号 才能迅速确定一个非零元素是矩阵中的哪一个元素 稀疏矩阵的压缩存储会失去随机存取功能   其中每一个非零元素所在的行号 列号和值组成一个三元组(i j aij) 并由此三元组惟一确定   稀疏矩阵进行压缩存储通常有两类方法 顺序存储和链式存储 链式存储方法【参见参考书目】

三元组表     将表示稀疏矩阵的非零元素的三元组按行优先(或列优先)的顺序排列(跳过零元素) 并依次存放在向量中 这种稀疏矩阵的顺序存储结构称为三元组表  注意   以下的讨论中 均假定三元组是按行优先顺序排列的 【例】下图(a)所示的稀疏矩阵A的三元组表表示见图(b)

( )三元组表的类型说明  为了运算方便 将矩阵的总行数 总列数及非零元素的总数均作为三元组表的属性进行描述 其类型描述为   #define MaxSize //由用户定义  typedef int DataType //由用户定义  typedef struct //三元组    int i j //非零元的行 列号    DataType v //非零元的值   TriTupleNode   typedef struct //三元组表    TriTupleNode data[MaxSize] //三元组表空间    int m n t //矩阵的行数 列数及非零元个数  TriTupleTable      ( ) 压缩存储结构上矩阵的转置运算  一个m×n的矩阵A 它的转置矩阵B是一个n×m的矩阵 且          A[i][j]=B[j][i] ≤i<m ≤j<n   即A的行是B的列 A的列是B的行 【例】下图中的B和上图中的A互为转置矩阵

①三元组表表示的矩阵转置的思想方法  第一步 根据A矩阵的行数 列数和非零元总数确定B矩阵的列数 行数和非零元总数   第二步 当三元组表非空(A矩阵的非零元不为 )时 根据A矩阵三元组表的结点空间data(以下简称为三元组表) 将A的三元组表a >data置换为B的三元组表b >data

②三元组表的转置  方法一:简单地交换a >data中i和j中的内容 得到按列优先顺序存储倒b >data;再将b >data重排成按行优先顺序的三元组表   方法二:由于A的列是B的行 因此 按a >data的列序转置 所得到的转置矩阵B的三元组表b >data必定是按行优先存放的   按这种方法设计的算法 其基本思想是 对A中的每一列col( ≤col≤a >n ) 通过从头至尾扫描三元组表a >data 找出所有列号等于col的那些三元组 将它们的行号和列号互换后依次放人b >data中 即可得到B的按行优先的压缩存贮表示 具体实现参见【动画演示】

③具体算法 void TransMatrix(TriTupleTable *b TriTupleTable *a)//*a *b是矩阵A B的三元组表表示 求A转置为B  int p q col   b >m=a >n b >n=a >m //A和B的行列总数互换  b >t=a >t //非零元总数  if(b >t<= )      Error( A= ) //A中无非零元 退出  q=   for(col= col<a >n col++) //对A的每一列    for(p= p<a >t p++) //扫描A的三元组表      if(a >data[p].j==col) //找列号为col的三元组        b >data[q).i=a >data[p] j         b >data[q].j=a >data[p] i         b >data[q].v=a >data[p] v         q++          //TransMatrix

④算法分析  该算法的时间主要耗费在col和p的二重循环上   若A的列数为n 非零元素个数t 则执行时间为O(n×t) 即与A的列数和非零元素个数的乘积成正比   通常用二维数组表示矩阵时 其转置算法的执行时间是O(m×n) 它正比于行数和列数的乘积     由于非零元素个数一般远远大于行数 因此上述稀疏矩阵转置算法的时间大于通常的转置算法的时间

带行表的三元组表  为了方便某些矩阵运算 在按行优先存储的三元组表中 加入一个行表来记录稀疏矩阵中每行的非零元素在三元组表中的起始位置 这就是带行表的三元组表 ( )类型描述    #define MaxRow l //在三元组表定义前加入此最大行定义    typedef struct       TriTupleNode data[MaxSize]       int RowTab[MaxRow] //行表 应保证m≤MaxRow      int m n t;     RTriTupleTable

( )带行表的三元组表的操作① 对于任给行号i( ≤i≤m ) 能迅速地确定该行的第一个非零元在三元组表中的存储位置为RowTab[i]② RowTab[i]( ≤i≤m )表示第i行之前的所有行的非零元数 ③ 第i行上的非零元数目为RowTab[i+ ] RowTab[i]( ≤i≤m )④ 最后一行(即第m l行)的非零元数目为t RowTab[m ](t为矩阵的非零元总数)  注意      若在行表中令RowTab[m]=t(要求MaxRow>m)会更方便 些 且t可省略      带行表的三元组表可改进矩阵的转置算法 具体【参阅其它参考书】

.稀疏矩阵压缩存储方式分析( ) 三元组表和带行表的三元组表的特点  相应的算法描述较为简单 但这类顺序存储方式对于非零元的位置或个数经常发生变化的矩阵运算就显得不太适合   【例】执行将矩阵B相加到矩阵A上的运算时 某位置上的结果可能会由非零元变为零元 但也可能由零元变为非零元 这就会引起在A的三元组表中进行删除和插人操作 从而导致大量结点的移动 对此类运算采用链式存储结构为宜

( )稀疏矩阵的链式结构  稀疏矩阵的链式结构有十字链表等方法 适用于非零元变化大的场合 比较复杂 可【参阅其它参考书】

cha138/Article/program/sjjg/201311/23671

相关参考

知识大全 多维数组-矩阵的压缩存储- 稀疏矩阵(二)

  带行表的三元组表  为了方便某些矩阵运算在按行优先存储的三元组表中加入一个行表来记录稀疏矩阵中每行的非零元素在三元组表中的起始位  置这就是带行表的三元组表  ()类型描述  #defineMax

知识大全 数据结构考研分类复习真题 第五章 答案[23]

  设用munu和tu表示稀疏矩阵行数列数和非零元素个数则转置矩阵的行数列数和非零元素的个数分别是numu和tu转置可按转置矩阵的三元组表中的元素顺序进行即按稀疏矩阵的列序从第列到第nu列每列中按行值

知识大全 数据结构考研分类复习真题 第五章 数组和广义表[24]

  已知A为稀疏矩阵试从空间和时间角度比较采用两种不同的存储结构(二维数组和三元组表)完成求运算的优缺点【西安电子科技大学二(分)】  特殊矩阵和稀疏矩阵哪一种压缩存储后失去随机存取的功能?为什么?【

知识大全 09年自考《数据结构》各章要点一[10]

  矩阵的压缩存储为多个相同的非零元素分配一个存储空间;对零元素不分配空间  特殊矩阵的概念所谓特殊矩阵是指非零元素或零元素分布有一定规律的矩阵  稀疏矩阵的概念一个矩阵中若其非零元素的个数远远小于零

知识大全 数据结构考研分类复习真题 第七章 图[28]

  .请回答下列关于图(Graph)的一些问题(每题分)  ().有n个顶点的有向强连通图最多有多少条边?最少有多少条边?  ().表示有个顶点l条边的有向图的邻接矩阵有多少个矩阵元素?是否稀疏矩阵?

知识大全 数据结构考研分类复习真题 第五章 答案[29]

  [题目分析]设稀疏矩阵的非零元素的三元组以行序为主存储在三元组表中矩阵的相加是对应元素的相加对两非零元素相加若行号不等则行号大者是结果矩阵中的非零元素若行号相同则列号大者是结果中一非零元素若行号列

知识大全 数据结构 5.10 三元组顺序表

  voidFastTransposeSMatrix(TSMatrixMTSMatrix&T)    //采用三元组顺序表存储表示求稀疏矩阵M的转置矩阵T  Trows=Mcols;  Tco

知识大全 数据结构考研分类复习真题 第五章 数组和广义表[12]

  所谓稀疏矩阵指的是_______【厦门大学一(%/分)】  对矩阵压缩是为了_______【北京理工大学二(分)】  上三角矩阵压缩的下标对应关系为_______【福州大学二(分)】【南京大学】 

知识大全 数据结构考研分类复习真题 第五章 数组和广义表[31]

  设对角线矩阵A=(行列下标ij满足≤ij≤)  ()若将矩阵A压缩存储到数组S中  试求出A中已存储之元素的行列下标(ij)与S中元素的下标K之间的关系  ()若将A视为稀疏距阵时请画出其行逻辑链

知识大全 数据结构考研分类复习真题 第五章 答案[41]

  [题目分析]设稀疏矩阵是AmxnHm是总表头指针设rch是行列表头指针则rch>right=rch时该行无非零元素用i记行号用一维数组元素A[i]记第i行非零元个数(为方便输出设元素是整数)