数据结构与算法-第四章 数组和广义表.pptVIP

  • 21
  • 0
  • 约1.42万字
  • 约 56页
  • 2019-08-04 发布于山东
  • 举报

数据结构与算法-第四章 数组和广义表.ppt

例. 三对角矩阵的压缩存储 用十字链表表示稀疏矩阵 在链表中,稀疏矩阵的每个非零元素对应一个含有五个域的 结点,它们分别是 row: 行域表示非零元素所在行 col: 列域表示非零元素所在列 val: 值域表示非零元素值 down:向下域,用以链接同一列中下一个非0元素 right:向右域,用以链接同一行中下一个非0元素 结点结构如下图所示。 row col val down right 在十字链表中将稀疏矩阵每一行的非零元素通过right域链接成一个带有表头结点的行循环链表,将每一列的非零元素通过down域链接成一个带有表头结点的列循环链表。 因此,每个非零元素即是第i行循环链表中的一个结点又是第j列循环链表中的一个结点。由于整个稀疏矩阵是由十字交叉的链结构来表示的,故称其为十字链表。如对下面的稀疏矩阵A可由如下图所示的十字链表来表示。 3 0 0 7 0 0 -1 0 2 0 0 0 0 0 0 0 0 0 0 -8 A= 5 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 3 1 4 7 3 1 2 2 3 -1 5 4 -8 H1 H2 H3 H4 H5 H1 H2 H3 H4 H5 HA 5 4 0 0 0 0 0 0 0 0 0 0 1 1 3 1 4 7 3 1 2 2 3 -1 5 4 -8 H1 H2 H3 H4 H5 HB 在表示有t个非零元素的m×n的矩阵的十字链表中,共有t+max(m,n)+1个结点,每个结点大约需要占用2~3个存储单元。因此,只在矩阵非零元素个数t比矩阵的阶m×n小的多的条件下,十字链表的存储开销才小于矩形结构的二维数组的开销m×n。 以上给出了稀疏矩阵的一种新的存储思想,但如何将一个已知的稀疏矩阵以十字链表表示出来,还是一个需要解决的问题。下面我们就来讨论在内存中建立十字链表的具体算法。 首先输入三元组(m,n,t)它们是要存储矩阵的行数,列数及非零元素个数,紧接着输入t个形如(i,j,aij)的三元组,它们分别代表了t个非零元素行、列值及元素值,其输入次序是按矩阵中以行为主顺序输入的。如此,对于前面图中所示的含有5个非零元素的稀疏矩阵A。其输入的数据依次为: 5,4,5;1,1,3;1,4,7;2,3,-1;3,1,2;5,4,8 算法中还需引入一辅助工作数组: hdn:p[1:p](p=max(m,n)) 及指针变量last。 其中hdn[i]是指向十字链表中第i行(也是第i列)行(列)链表的表头结点的指针,last是指向当前所建的行链表的最右(后)面的那个结点。这样,建立十字链表的算法Mread(A)执行的大致过程是: i)按前述规定建立p个表头结点(不包括HA)。 ii)建立每个行循环链表,在此过程中第i个链表示的表头结点的val域先用来跟踪第i列的列链表当前最下(后)面的那个结点,其作用相当于建立行链表时的指针last。 iii)建立表头结点HA,并将全体p+1个表头结点链成循环链表。算法具体描述如下: PROCEDURE Mread(A); BEGIN read(m,n,t);p:=max(m,n); FOR i=1 TO p DO [ newl(x); hdn[i]:=x; x↑.row:=x↑.col:=0; x↑.right:=x↑.val:=x]; crow:=1; last:=hdn[1]; FOR i:=1 TO t DO [ read(rrow,cool,val); IF rrowcrow THEN [ last↑.right:=hdn[crow]; crow:=rrow; last:=hdn[crow]] newl(x); x↑.row:=rrow; x↑.col:=ccol; x↑.val:=val; last↑.right:=x; last:=x; (hdn[cool]↑.Val)↑.down:=x; hdn[ccol]↑.val:=x]

文档评论(0)

1亿VIP精品文档

相关文档