第四章数组和稀疏矩阵
数组和稀疏矩阵
3
可以使用数组的修改方法来更新元素的值,例如 :Arrays.setAll(array, i -> i * 2);
02
CATALOGUE
稀疏矩阵基础
稀疏矩阵的定义和特点
稀疏矩阵的定义
在矩阵中,如果大部分元素为零,则 称该矩阵为稀疏矩阵。
稀疏矩阵的特点
矩阵中非零元素数量较少,可以大大 节省存储空间和计算资源。
数组和稀疏矩阵
目录
• 数组基础 • 稀疏矩阵基础 • 数组和稀疏矩阵的关系 • 稀疏矩阵的常用算法 • 稀疏矩阵的应用
01
CATALOGUE
数组基础
数组的定义
数组是一种线性数据结构,用于存储具有相同类 型的数据元素。
数组中的每个元素通过索引进行访问,索引从0开 始计数。
数组的大小在创建时确定,并且不能更改。
01
稀疏矩阵的分解算法是将稀疏矩阵分解为若干个更易于处理的矩阵形式,以便 于计算和分析。
02
常见的分解算法包括LU分解、QR分解、SVD分解等。这些分解算法可以将稀 疏矩阵转换为上三角矩阵、正交矩阵或奇异值分解等形式,从而简化计算过程 。
03
LU分解是最常用的分解算法之一,它将矩阵分解为一个下三角矩阵和一个上三 角矩阵的乘积。QR分解则将矩阵转换为正交矩阵和上三角矩阵的乘积。SVD分 解则将矩阵分解为若干个奇异值的乘积。
05
CATALOGUE
稀疏矩阵的应用
在数值计算中的应用
线性方程组求解
稀疏矩阵在求解大规模线性方程 组时具有高效性,因为它们只存 储非零元素,减少了存储空间和 计算复杂度。
数值积分和微分
稀疏矩阵在数值积分和微分计算 中能够提高计算效率,特别是在 处理复杂函数时。
第四章数组、矩阵、广义表
数组、矩阵、广义表数组的概念和逻辑结构模糊定义:它就是数据类型相同的元素按一定顺序排列的集合,可以看作是广义表的推广数组具有的三个特征:1.数据元素类型必须一致2.数组在内存中占用一段连续的存储空间,数组元素的逻辑顺序和物理顺序一致3.数组中的元素本身可以是具有某种结构的数据,如整型,字符型,自定义结构体类型多维数组可以被看做是一维数组,n维数组(n>=2)可以看做是一维数组,它的每个数组元素都是一个n-1维的数组二维数组中每一个数组元素最多可以有两个直接前驱和两个直接后继(边界元素除外)——>在n维数组中,每个数组元素最多可以有n个直接前驱和n个直接后继,所以多维数组是一种非线性结构清晰定义:数组是一个具有固定格式和数量的数据有序集,每个数据元素由唯一的数组下标标识,因此,在数组上不适合做插入、删除数据元素的操作数组中两个主要操作:取值操作:给定数组下标,读取其对应的数据元素;赋值操作:给定数组下标,存储或修改与其对应的数据元素;数组的基本操作(书上P75面)数组的物理结构(是数组在计算机中的存储表示):实质是讨论数组在内存中的映像。
通常,数组在内存中被映像为向量,即用向量作为数组的一种存储结构。
因为内存的地址空间是一维的,用一维的连续存储空间存放多维数组,就必须通过某种次序将数组中的元素排成一个线性序列,然后将这个线性序列顺序存放在计算机中。
当数组的行列固定后,通过一个映像函数,则可根据数组元素下表得到它的存储地址:1.对于一维数组按下标顺序分配地址即可ai=a0+(n-1)d2.对于二维数组分配地址时,需要把它的元素映像存储在一维存储器中,如(BASIC,Pascal,C等)采用以行为主(先行后列)的方式顺序存放,即一行分配结束之后,再分配下一行,物理地址:aij=a00+(i*n+j)d3.“以行为主序”的分配规律:最右边的下标先从小到大变化,循环一遍后,右边第二个下标再变,……,按照此规律从右往左,最后变化的是数组元素最左边的下标特殊矩阵需要原因:二维数组很适合来表示矩阵结构,可是某些特殊矩阵中含有许多重复或无效的数据,如三角矩阵,对称矩阵,对角矩阵,稀疏矩阵。
数据结构之稀疏矩阵稀疏矩阵的存储方式和操作分析
数据结构之稀疏矩阵稀疏矩阵的存储方式和操作分析稀疏矩阵是指矩阵中大部分元素为零的特殊矩阵。
在实际应用中,稀疏矩阵经常出现,如图像处理、网络分析和科学计算等领域。
对于稀疏矩阵的存储和操作是数据结构中的重要内容。
本文将介绍稀疏矩阵的存储方式和相关操作的分析。
一、稀疏矩阵存储方式稀疏矩阵的存储方式有多种,其中三元组顺序表和二维数组是比较常用的方法。
1. 三元组顺序表三元组顺序表是一种基于行优先存储的方式,可以将稀疏矩阵以非零元素的形式存储起来。
主要包括行号、列号和元素值三个信息。
以一个4x5的稀疏矩阵为例,其中有三个非零元素分别为A[1][2]=3, A[2][3]=4, A[3][4]=5。
可以使用三元组顺序表来存储:```行号列号元素值1 2 32 3 43 4 5```三元组顺序表的优点是可以节省存储空间,同时也方便进行矩阵的操作。
但是在进行元素的查找和修改时,效率较低。
2. 二维数组二维数组是一种常见的矩阵表示方法,可以直接使用二维数组来表示稀疏矩阵。
其中非零元素的位置用实际的值表示,其余位置用零值表示。
以同样的4x5的稀疏矩阵为例,使用二维数组存储如下:```0 0 0 0 00 0 3 0 00 0 0 4 00 0 0 0 5```二维数组的优点是简单直观,并且可以快速进行元素的查找和修改。
但当稀疏矩阵的规模较大时,会造成较高的存储资源浪费。
二、稀疏矩阵的操作分析对于稀疏矩阵的操作,主要包括矩阵的转置、相加、相乘等。
1. 转置操作稀疏矩阵的转置是指将原始矩阵的行与列对调。
对于三元组顺序表来说,转置操作主要涉及到行号和列号的交换。
而对于二维数组来说,可以直接在取值的时候将行号和列号对调即可。
2. 相加操作稀疏矩阵的相加操作是指将两个矩阵对应位置的元素相加。
对于三元组顺序表来说,可以通过遍历两个矩阵的非零元素,并将其对应位置的元素相加。
而对于二维数组来说,可以直接将对应位置的元素相加即可。
3. 相乘操作稀疏矩阵的相乘操作是指将两个矩阵相乘得到一个新的矩阵。
计算机数据结构习题1附答案
文档来源为:从网络收集整理.word 版本可编辑.欢迎下载支持.第1章 绪论1.1 简述下列术语:数据,数据元素、数据对象、数据结构、存储结构、数据类型和抽象数据类型。
解:数据是对客观事物的符号表示。
在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。
数据元素是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。
数据对象是性质相同的数据元素的集合,是数据的一个子集。
数据结构是相互之间存在一种或多种特定关系的数据元素的集合。
存储结构是数据结构在计算机中的表示。
数据类型是一个值的集合和定义在这个值集上的一组操作的总称。
抽象数据类型是指一个数学模型以及定义在该模型上的一组操作。
是对一般数据类型的扩展。
1.2 填空题:1.常见的数据结构有__结构,_____结构,____结构等三种。
2.常见的存储结构有_________结构,______结构等两种。
3.数据的基本单位是____,它在计算机中是作为一个整体来处理的。
4.数据结构中的结构是指数据间的逻辑关系,常见的结构可分为两大类,______和_____。
5.《数据结构》课程讨论的主要内容是数据的逻辑结构、存储结构和________。
1.2设有数据结构(D,R),其中{}4,3,2,1d d d d D =,{}r R =,()()(){}4,3,3,2,2,1d d d d d d r =试按图论中图的画法惯例画出其逻辑结构图。
解:1.3设有以下三个函数:()10002124++=n n n f ,()3450015n n n g+=,()n n n n h log 5005.3+=请判断以下断言正确与否:(1) f(n)是O(g(n)) (2) h(n)是O(f(n)) (3) g(n)是O(h(n)) (4) h(n)是O(n 3.5) (5) h(n)是O(nlogn)解:(1)对 (2)错 (3)错 (4)对 (5)错第二章序列2.1 描述以下三个概念的区别:头指针,头结点,首元结点(第一个元素结点)。
稀疏矩阵——三元组顺序表
稀疏矩阵——三元组顺序表⽬录稀疏矩阵假设m*n的矩阵中,有t的⾮零元,令s=t/m * n,当,s<=0.05时,称此矩阵为稀疏矩阵,简单理解就是⾮零元特别少的矩阵//⼀般矩阵a1 2 3a= 4 5 67 8 9//稀疏矩阵s0 0 0 0 00 2 0 0 5s= 0 0 3 0 00 0 0 0 4矩阵的转置⼀个m * n的矩阵转置后变为 n * m的矩阵//3*2的矩阵-转置前1 24 57 8//转置后变为2*31 4 72 5 8转置后的矩阵每个元素的下表与原来的下表刚好相反,例如上⾯4转置前的下标为(2,1),转置后变为(1,2);矩阵压缩存储-三元组顺序表之所以引⼊三元组顺序表,是因为,对于稀疏矩阵⽽⾔,⽤传统的存储⽅法会造成存储空间的浪费0 12 9 0 0 0 00 0 0 0 0 0 0-3 0 0 0 0 14 0M= 0 0 24 0 0 0 00 18 0 0 0 0 015 0 0 -7 0 0 0//上⾯矩阵⽤三元组表⽰i j v1 2 121 3 93 1 -33 6 144 3 245 2 186 1 156 4 -7typedef struct{int i,j; //⾏坐标、列坐标ElemType e; //元素}Triple;typedef struct{Triple date[MAXSIZE+1]; //0不存储元素int mu,nu,tu; //⾏数、列数、⾮零元个数}TSMatrix;稀疏矩阵的转置传统⽅法的转置算法时遍历矩阵的每⼀项,交换其下标值即可for(col=1;col<=nu;col++){for(row=1;row<=mu;row++){T[col][row]=M[row][col]}}//时间复杂度 : O(nu*mu)利⽤三元组顺序表进⾏存储的稀疏矩阵要想实现转置显然不能⽤上⾯的算法,下⾯介绍两种⽅法:第⼀种:以列序为主序的转置//置换前存储位置i j v1 2 12 -> M.date[1]1 3 9 -> M.date[2]3 1 -3 -> M.date[3]3 6 14 -> M.date[4]4 3 24 -> M.date[5]5 2 18 -> M.date[6]6 1 15 -> M.date[7]6 4 -7 -> M.date[8]//置换后存储位置i j v1 3 -3 -> T.date[1]1 6 15 -> T.date[2]2 1 12 -> T.date[3]2 5 18 -> T.date[4]3 1 9 -> T.date[5]3 4 24 -> T.date[6]4 6 -7 -> T.date[7]6 3 14 -> T.date[8]void TransposeSMatrix(TSMatrix *T1,TSMatrix *T2){T2->mu=T1->nu;T2->nu=T1->mu;T2->tu=T1->tu;if(T1->tu){int q=1,col,p;for(col=1;col<=T1->nu;col++) //矩阵列循环{for(p=1;p<=T1->tu;p++) //遍历所有元素{if(T1->date[p].j==col) //当元素在col列时{T2->date[q].i=T1->date[p].j;T2->date[q].j=T1->date[p].i;T2->date[q].e=T1->date[p].e;q++;}}}}}//上述代码,当矩阵运算为满时,即tu=mu*nu,其时间复杂度为O(nu*nu*mu)//这种情况与经典算法相⽐,虽节省了存储空间,但是效率较低第⼆种:快速转置第⼀种算法是通过遍历所有元素的下标,从⽽确定其在转置后数组中的位置,快速转置的思想就是,预先确定每⼀列第⼀个⾮零元在对应转置后的数组date中的位置;因此需要两个辅助数组num[]:⽤来存放每⼀列的⾮零元个数cpot[]:存放第⼀个⾮零元在转置后数组date中的位置num[]数组的值很好求,只需要遍历⼀次所有元素即可for(t=1;t<=T1->tu;t++)++num[T1->date[t].j];对于cpot[],有⼀个规律col 1 2 3 4 5 6 7num[col] 2 2 2 1 0 1 0cpot[col] 1 3 5 7 8 8 9//规律copt[1]=1copt[col]=copt[col-1]+num[col-1]代码:void FastTransposeSMatrix(TSMatrix *T1,TSMatrix *T2){int num[T1->nu],cpot[T1->nu];int col,p,q,t;T2->mu=T1->nu;T2->nu=T1->mu;T2->tu=T1->tu;if(T1->tu){//初始化每列⾮零元个数为0for(col=1;col<=T1->nu;col++){num[col]=0;}//求每列⾮零元个数for(t=1;t<=T1->tu;t++){++num[T1->date[t].j];}//求每列第⼀个⾮零元转置后的位置cpot[1]=1;for(col=2;col<=T1->nu;col++){cpot[col]=num[col-1]+cpot[col-1];}//遍历所有元素for(p=1;p<=T1->tu;p++){col=T1->date[p].j; //获取列坐标q=cpot[col]; //获取新位置T2->date[q].i=T1->date[p].j;T2->date[q].j=T1->date[p].i;T2->date[q].e=T1->date[p].e;++cpot[col]; //之所以这个地⽅要++,因为每列⾮零元可能不⽌⼀个 }}}完整代码:#include <stdio.h>#include <stdlib.h>#define MAXSIZE 12500 //⾮零元个数的最⼤值typedef int ElemType;typedef struct{int i,j;ElemType e;}Triple;typedef struct{Triple date[MAXSIZE+1];int mu,nu,tu;}TSMatrix;//输⼊元素void Insert(TSMatrix *T){printf("请依次输⼊⾏数i、列数j、⾮零元个数sum:\n");int sum ;scanf("%d%d%d",&T->mu,&T->nu,&sum);T->tu=sum;int x,y,num;printf("请依次输⼊矩阵⾮零元的⾏坐标i、列坐标j、元素值x:\n");printf("i j v\n");for(int i=1 ;i<=sum;i++){scanf("%d%d%d",&x,&y,&num);T->date[i].i=x;T->date[i].j=y;T->date[i].e=num;}}//第⼀种转置⽅法void TransposeSMatrix(TSMatrix *T1,TSMatrix *T2)T2->mu=T1->nu;T2->nu=T1->mu;T2->tu=T1->tu;if(T1->tu){int q=1,col,p;for(col=1;col<=T1->nu;col++){for(p=1;p<=T1->tu;p++){if(T1->date[p].j==col){T2->date[q].i=T1->date[p].j;T2->date[q].j=T1->date[p].i;T2->date[q].e=T1->date[p].e;q++;}}}}}//输出矩阵⾮零元void Show(TSMatrix *T){printf("转置后的矩阵:\n");printf("i j v\n");for(int i=1;i<=T->tu;i++){printf("%d %d %d\n",T->date[i].i,T->date[i].j,T->date[i].e); }}//快速转置void FastTransposeSMatrix(TSMatrix *T1,TSMatrix *T2){int num[T1->nu],cpot[T1->nu];int col,p,q,t;T2->mu=T1->nu;T2->nu=T1->mu;T2->tu=T1->tu;if(T1->tu){//初始化每列⾮零元个数为0for(col=1;col<=T1->nu;col++){num[col]=0;}//求每列⾮零元个数for(t=1;t<=T1->tu;t++){++num[T1->date[t].j];}cpot[1]=1;for(col=2;col<=T1->nu;col++){cpot[col]=num[col-1]+cpot[col-1];}for(p=1;p<=T1->tu;p++){col=T1->date[p].j;q=cpot[col];T2->date[q].i=T1->date[p].j;T2->date[q].j=T1->date[p].i;T2->date[q].e=T1->date[p].e;++cpot[col];}}}int main(){TSMatrix T,T1,*q,*p;p=&T;q=&T1;Insert(p);//测试第⼀种转置⽅法TransposeSMatrix(p, q);Show(q);//测试快速转置FastTransposeSMatrix(p, q);Show(q);}/* 测试请依次输⼊⾏数i、列数j、⾮零元个数sum:6 7 8请依次输⼊矩阵⾮零元的⾏坐标i、列坐标j、元素值x:1 2 121 3 93 1 -33 6 144 3 245 2 186 1 156 4 -7转置后的矩阵:i j v1 3 -31 6 152 1 122 5 183 1 93 4 244 6 -76 3 14转置后的矩阵:i j v1 3 -31 6 152 1 122 5 183 1 93 4 244 6 -76 3 14Program ended with exit code: 0*/我不⽣产代码,我只是代码的搬运⼯。
稀疏矩阵的运算
稀疏矩阵的运算稀疏矩阵的运算稀疏矩阵,顾名思义,就是矩阵中空值(0)的比例很大,而实际值(非0)的比例很小的矩阵。
它最大的特点就是,当矩阵的规模增大时,仍然可以保持较低的计算量。
在运算时,因为稀疏矩阵中的0值没有意义,所以对其做运算也没有意义。
所以,在运算中需要把稀疏矩阵转换成一维数组,即只保留其有意义的值。
下面介绍几种常用的稀疏矩阵运算技术。
1.索引表(Indextable)这是一种最简单的稀疏矩阵运算技术,在使用索引表时,需要用一个额外的一维数组来保存有意义的值的位置,而把矩阵本身变成一维数组,进行运算。
例如矩阵A:1 0 0 0 00 0 0 4 00 0 0 0 00 3 0 0 00 0 7 0 0这样的矩阵,可以使用一个一维数组来保存其有意义的值及其位置,例如:[1,(0,0); 4,(1,3); 3,(3,1); 7,(2,2)]这样,我们就可以用简单的一维数组代替复杂的二维矩阵,从而加快稀疏矩阵的运算。
2.矩阵向量乘法(Matrix-Vector Multiplication)这是一种最常用的稀疏矩阵运算技术,把一个大的稀疏矩阵A和一个向量(一维数组)V作乘法,得到一个新的向量C,即:C = A * V对于上面的实例,可以用以下方式求出C:C[0] = 1 * V[0] + 0 * V[1] + 0 * V[2] + 0 * V[3] + 0 * V[4] C[1] = 0 * V[0] + 0 * V[1] + 0 * V[2] + 4 * V[3] + 0 * V[4] C[2] = 0 * V[0] + 0 * V[1] + 0 * V[2] + 0 * V[3] + 7 * V[4] C[3] = 0 * V[0] + 3 * V[1] + 0 * V[2] + 0 * V[3] + 0 * V[4] 3.矩阵乘法(Matrix Multiplication)矩阵乘法也是一种常用的稀疏矩阵运算技术,把两个大的稀疏矩阵A和B相乘,得到一个新的稀疏矩阵C,即:C = A * B以上就是稀疏矩阵运算的一些常用技术,稀疏矩阵也可以用于解决很多复杂的运算问题,例如机器学习和深度学习等。
稀疏矩阵存储和操作稀疏矩阵的数据结构与算法
稀疏矩阵存储和操作稀疏矩阵的数据结构与算法稀疏矩阵是指具有大量零元素和少量非零元素的矩阵。
在实际场景中,由于矩阵中大部分元素为零,传统的矩阵存储方式会造成大量的存储空间的浪费以及数据操作的低效性。
因此,为了节省存储空间和提高数据操作的效率,稀疏矩阵的存储和操作需要借助于特定的数据结构和算法。
一、稀疏矩阵存储的数据结构1.1. 压缩存储方法压缩存储方法是一种常用的稀疏矩阵存储方法。
常见的压缩存储方法有三种:行压缩法(CSR)、列压缩法(CSC)和十字链表法。
1.1.1. 行压缩法(CSR)行压缩法是通过两个数组来存储稀疏矩阵的非零元素。
第一个数组存储非零元素的值,第二个数组存储非零元素在矩阵中的位置信息。
1.1.2. 列压缩法(CSC)列压缩法与行压缩法相似,只是存储方式不同。
列压缩法是通过两个数组来存储稀疏矩阵的非零元素。
第一个数组存储非零元素的值,第二个数组存储非零元素在矩阵中的位置信息。
1.1.3. 十字链表法十字链表法是一种更加灵活的稀疏矩阵存储方法。
通过使用链表的方式,将非零元素存储在链表中,并且每个非零元素还具有行和列的指针,方便进行数据操作。
1.2. 坐标存储法坐标存储法是一种简单直观的稀疏矩阵存储方法。
每个非零元素包括行列坐标和元素值,通过三元组的方式进行存储。
二、稀疏矩阵的操作算法2.1. 矩阵转置矩阵转置是指将原矩阵的行变为列,列变为行的操作。
对于稀疏矩阵,常用的转置算法为快速转置算法。
该算法通过统计每列非零元素的个数,并根据列的非零元素个数确定每个非零元素转置后的位置。
2.2. 矩阵相加矩阵相加是指将两个矩阵对应位置上的元素相加得到一个新的矩阵。
对于稀疏矩阵的相加,可以遍历两个矩阵的非零元素,对相同位置上的元素进行相加。
2.3. 矩阵相乘矩阵相乘是指将两个矩阵相乘得到一个新的矩阵。
对于稀疏矩阵的相乘,常用的算法为稀疏矩阵乘法算法。
该算法通过遍历两个矩阵的非零元素,按照矩阵乘法的规则计算得到新矩阵的非零元素。
稀疏矩阵
37
12
1
17
4-6…… Nhomakorabeaa11
Sa[1] Sa[2] Sa[3] Sa[4] Sa[5] Sa[6] Sa[7] Sa[8] a21 a22 a31 a32 a33 a41 a42 a43
2.对角矩阵 压缩的方法:只存储非零元 =
10
5 0 0 0 0
3
7 12 0 0 0
效率分析:时间复杂度为O(M.nu×M.tu),简写成 O(nu×tu)。当tu~nu×mu时,时间复杂度为 O(nu2×tu)。 (2)按照M.data中三元组的次序进行转置,并将转置后 的三元组置入b中恰当的位置。这种转置方法称为快速 转置。时间复杂度为Onu+tu)。
• (1)按照b.data中三元组的次序依次在a.data中找到相应 的三元组进行转置。换句话说,按照矩阵M的列序来 进行转置。为了找到M的每一列中所有的非零元素, 需要对其三元组表a.data从第一行起整个扫描一遍,由 于M.data是以M的行序为主序来存放每个非零元的, 由此得到的恰是T.data应有的顺序。具体算法描述如 下
0
87 8 -6 0 0
0
0 32 20 33 0
A
6 ´6
| 0 0 | | 0 0 | 10 0 | -3 71 | | 81 0 |
0 0
三对角矩阵
二、稀疏矩阵(Sparse Matrices) m×n矩阵的稀疏因子:δ=t/(m×n) t表示非零元的个数。 t远远小于 m×n(δ=0.05<<1)的矩阵叫稀疏矩阵。
A6 6
1 5 37 = 17 22 45
5 1 12 4 0 17
稀疏矩阵及其压缩存储方法
稀疏矩阵及其压缩存储方法1.基本概念稀疏矩阵(SparseMatrix):是矩阵中的一种特殊情况,其非零元素的个数远小于零元素的个数。
设m行n列的矩阵含t个非零元素,则称以二维数组表示高阶的稀疏矩阵时,会产生零值元素占的空间很大且进行了很多和零值的运算的问题。
特殊矩阵:值相同的元素或0元素在矩阵中的分布有一定的规律。
如下三角阵、三对角阵、稀疏矩阵。
压缩存储:为多个值相同的元素只分配一个存储空间;对0元素不分配空间。
目的是节省大量存储空间。
n x n的矩阵一般需要n2个存储单元,当为对称矩阵时需要n(1+n)/2个单元。
2.三元组顺序表——压缩存储稀疏矩阵方法之一(顺序存储结构)三元组顺序表又称有序的双下标法,对矩阵中的每个非零元素用三个域分别表示其所在的行号、列号和元素值。
它的特点是,非零元在表中按行序有序存储,因此便于进行依行顺序处理的矩阵运算。
当矩阵中的非0元素少于1/3时即可节省存储空间。
(1)稀疏矩阵的三元组顺序表存储表示方法#define MAXSIZE 12500 // 假设非零元个数的最大值为12500typedef struct {int i, j; // 该非零元的行下标和列下标ElemType e; //非零元素的值} Triple; // 三元组类型typedef union { //共用体Triple data[MAXSIZE + 1]; // 非零元三元组表,data[0]未用int mu, nu, tu; // 矩阵的行数、列数和非零元个数} TSMatrix; // 稀疏矩阵类型(2)求转置矩阵的操作◆用常规的二维数组表示时的算法for (col=1; col<=nu; ++col)for (row=1; row<=mu; ++row)T[col][row] = M[row][col];其时间复杂度为: O(mu×nu)◆用三元组顺序表表示时的快速转置算法Status FastTransposeSMatrix(TSMatrix M, TSMatrix &T) {// 采用三元组顺序表存储表示,求稀疏矩阵M的转置矩阵TT.mu = M.nu; T.nu = M.mu; T.tu = M.tu;if (T.tu) {for (col=1; col<=M.nu; ++col) num[col] = 0;for (t=1; t<=M.tu; ++t) ++num[M.data[t].j];// 求M 中每一列所含非零元的个数cpot[1] = 1;for (col=2; col<=M.nu; ++col) cpot[col] = cpot[col-1] + num[col-1];// 求M 中每一列的第一个非零元在b.data 中的序号for (p=1; p<=M.tu; ++p) { // 转置矩阵元素col = M.data[p].j; q = cpot[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; ++cpot[col];} // for} // ifreturn OK;} // FastTransposeSMatrix其时间复杂度为: O(mu +nu)3.行逻辑联接的顺序表——压缩存储稀疏矩阵方法之二(链接存储结构)行逻辑联接的顺序表:稀疏矩阵中为了随机存取任意一行的非0元素,需要知道每一行的第一个非0元素在三元组表中的位置,因此将上述快速转置算法中指示行信息的辅助数组cpot 固定在稀疏矩阵的存储结构中,让每一行对应一个单链表,每个单链表都有一个表头指针,这种“带行链接信息”的三元组表即称为行逻辑联接的顺序表。
稀疏矩阵
三 元 组 表 的 定 义
void Add() //向三元组添加元素 { } void Display() //显示三元组表中的元素 { } void MsTranspose(TsMatrix &T) //元素的转置 { }
};
1.三元组表的初始化
TsMatrix(int r,int c,int term) { rows=r; cols=c; maxterms=r*c; a=new Triple[maxterms]; terms=term; }
16
col 1
col
num[col] cpot[col]
1 2 1
2 2 3
3 2 5
4 1 7
5 1 8
6 0 8
M
规律: cpot[1]=1 cpot[col] = cpot[col-1] + num[col-1]
0 0 -3 0 0 15
12 0 0 0 18 0
2 3 4 5 6
9 0 0 24 0 0 0 0 0 0 0 -7 0 0 14 0 0 0
p 1 (1, 2, 12) 2 (1, 3, 9 ) 3 (3, 1, -3) 4 (3, 5, 14)
(4, 3, 24) (5, 2, 18) (6, 1, 15) (6, 4, -7)
q 1 2 3 5
三 元 组 表 M
(1, 3, -3) (1, 6, 15) (2 ,1, 12) (2, 5, 18) (3, 1, 9) (3, 4, 24) (4, 6, -7) (5, 3, 14)
14
24 18 15 -7
注意:为更可靠描述, 通常再加一行“总体” 信息:即总行数、总 列数、非零元素总个 数
数据结构-第四章 矩阵的压缩存储.
3
二维数组同样满足数组的定义。一个二维 数组可以被看成是特殊的一维数组,其中, 每个元素又是一个一维数组。多维数组可以 按同样的方法类推。
) )
Amn
( a11 a12 (a 21 a 22 ... ( ... (a m1 a m 2
( ) (
... ... a1n ) ... ... a 2 n ) ... ... ... ) ... ... a mn )
特殊矩阵:值相同的元素或零元素在矩阵中
分布有一定规律。 稀疏矩阵:零元素较多,分布无规律。
11
4.2.1
对称矩阵
Aij Aji
在一个n阶方阵A中,若元素满足下述性质:
则称A为对称矩阵。对称矩阵中的元素关于主 对角线对称,故只需要存储矩阵的上三角或下 三角矩阵,这样可以节约大约一半的空间。
0 0 0 0 0 14 0 0 0 0 0 0 0 0 0 0 67 0 0
col
1 2 1
2 2
3
4 1
5 0
6 1 8
7 0 9
num[col]
cpot[col]
2
5
3
7
8
扫描矩阵三元组表,根据某项的列号,确定它转置 后的行号,查 cpot表,按查到的位置直接将该项存入 转置三元组表中。
7
二维数组与高维数组
1)存储方式
计算机的存储结构是一维的,因而多维数组必须 按某种次序排成一个线性序列加以存储。
a[1][1] a[2][1] A a[3][1] a[m][1]
a[1][2] a[2][2] a[3][2]
a[1][3] a[2][3] a[3][3]
北京师范大学数据结构教学资料 第4章——数组、串与广义表
精选ppt
25
设矩阵 A 中有 s 个非零元素。令 e = s/(m*n), 称 e 为矩阵的稀疏因子。
有人认为 e≤0.05 时称之为稀疏矩阵。 在存储稀疏矩阵时,为节省存储空间,应只
存储非零元素。但由于非零元素的分布一般 没有规律,故在存储非零元素时,必须记下 它所在的行和列的位置 ( i, j )。 每一个三元组 (i, j, aij) 唯一确定了矩阵A的一 个非零元素。因此,稀疏矩阵可由表示非零 元的一系列三元组及其行列数唯一确定。
精选ppt
26
稀疏矩阵的定义
const int drows = 6, dcols = 7, dterms = 9;
template<class E>
struct Triple {
//三元组
int row, col;
//非零元素行号/列号
E value;
//非零元素的值
void operator = (Triple<E>& R) //赋值
a1 1
a2 1 an1 1
a1 2
a2 2 an1 2
aaan12n1nn111
下 三 角 矩 阵
01 2 3 4 5 6 7 8
n(n+1)/2-1
B a00 a10 a11 a20 a21 a22 a30 a31 a32 …… an-1n-1
若 i j, 数组元素A[i][j]在数组B中的存放位置 为 1 + 2 + + i + j = (i + 1)* i / 2 + j
前i行(0~i-1)元素总数 第i行第j个元素前元素个数
精选ppt
18
4:数组
col num[col] cpot[col]
i(i-1) Loc(aij)=Loc(a11)+[( +(j-1)]*l 2
对角矩阵 a11 a12 0 …………… . 0
a21 a22 a23 0 …………… 0 a32 a33 a34 0 ………
……………………………
0 0
0
0
按行序为主序:
0 … an-1,n-2 an-1,n-1 an-1,n
?
3 4 5 6 7
6
4
-7
6
3
14
解决思路:只要做到 将矩阵行、列维数互换 将每个三元组中的i和j相互调换 重排三元组次序,使mb中元素以N的行(M的列)为主序
方法一:按M的列序转置 即按mb中三元组次序依次在ma中找到相应的三元组进行转置。 为找到M中每一列所有非零元素,需对其三元组表ma从第一行 起扫描一遍。由于ma中以M行序为主序,所以由此得到的恰是mb 中应有的顺序
i 0 1 ma 2 3 4 5 6 7 6 1 1 3 3 4 5 6 j 7 2 3 1 6 3 2 1 v 8 12 9 -3 14 24 18 15
0 0 0 0 0 14 0 0 0 0 0 0 0 0 0 0 67 0 0
0 12 9 N 0 0 0 0
算法描述:
算法分析:T(n)=O(M的列数n非零元个数t) 若 t 与mn同数量级,则T (n) O(m n 2 )
稀疏矩阵存储
稀疏矩阵存储
稀疏矩阵是指矩阵中大部分元素为零的矩阵。
由于这种矩阵中零元素所占比例较大,因此传统的二维数组存储方式会浪费很多空间。
为解决这一问题,人们提出了许多稀疏矩阵存储方法。
常见的稀疏矩阵存储方法有三种:
1.COO存储法:COO存储法是指将矩阵中的非零元素的值、行坐标和列坐标分别存储在三个数组中。
这种方法存储简单,但是由于需要三个数组,因此空间利用率不高。
2.CSR存储法:CSR存储法是指将矩阵中的非零元素按行压缩存储,同时将每行非零元素的列坐标和对应值分别存储在两个数组中。
这种方法减少了存储空间的浪费,但是需要对数据进行排序。
3.DIA存储法:DIA存储法是指将稀疏矩阵进行对角线压缩存储,即只存储矩阵的对角线和超出对角线k行的非零元素。
这种方法适用于对角线元素比较多的矩阵。
在实际应用中,我们需要根据具体情况选择不同的稀疏矩阵存储方法,以达到空间利用率最高、存储效率最高的目的。
- 1 -。
04高级矩阵计算.pdf
MATLAB 学习指南第四章. 高级矩阵运算4.1. 稀疏矩阵稀疏矩阵为了展现使用稀疏矩阵带来的有效性,我们将两次使用有限差分法来解一个PDE。
首先,我们将会使用矩阵指令。
矩阵指令会使用到目前为止我们已经学过的全矩阵。
其次,我们将使用新的指令。
新的指令充分利用大多数元素都是零这一事实来极大地减少内存需求量和解PDE所需的浮点运算的次数。
使用全矩阵格式进行计算通过使用中心有限差分法来离散1维空间中的拉普拉斯算子可得到下列矩阵。
设定离散PDE所得的矩阵,使其1维方格包含点间距为1的num_pts点。
在x=1和x=num_pts处的Dirichlet边界条件已经被设定好了。
对于内部点,我们有一个源项。
现在,我们使用标准MATLAB解算程序来获得格点处PDE的解。
现在我们进一步观察Afull。
指令spy(A)能够绘制矩阵A的图形,具体做法是:无论何处,只要矩阵A的一个元素非零,就编写一个点。
底部的数字nz是非零元素的个数。
我们可以看到只有一小部分矩阵元素非零。
由于我们按常规的方式为格点编号,每个格点的邻近格点都存储在邻近区域,所以此矩阵中的非零元素位于主对角线上以及紧邻两条对角线的上方和下方。
即使我们不按常规给格点编号,我们得到的非零点仍然是这么少。
这种情况是我们经常遇到的,即,在PDE的数值模拟中,我们常常遇到的矩阵都是稀疏的,那就是说,只有一小部分点是非零的。
对于这个矩阵,元素的总数目是:这就意味着Afull的大部分空间是空的,我们浪费了很多内存来存储我们已知的值为零的元素。
除了Afull,清除内存中的所有变量。
稀疏矩阵使用指令“sparse”,我们可将一个矩阵转化成为稀疏的格式。
MATLAB把一个稀疏矩阵当作一个NZ×3型的数组来存储,其中,NZ是非零元素的个数。
第一列是行数,第二列是非零元素的列数,第三列是非零元素的实际值。
总内存使用量远小于用全矩阵格式时的总内存使用量。
现在,我们将使用稀疏矩阵格式来解决问题接下来,我们设定格点值。
稀疏矩阵保存方法
稀疏矩阵保存方法
稀疏矩阵是一种矩阵中有大量元素为零的矩阵,这种矩阵在计算机科学中非常常见。
由于这种矩阵中大部分元素都是零,传统的矩阵存储方法会浪费大量的存储空间,因此需要使用稀疏矩阵保存方法来节省存储空间。
稀疏矩阵保存方法有多种,其中最常用的是压缩存储法。
压缩存储法将稀疏矩阵中的非零元素保存起来,并且记录它们在矩阵中的位置。
这样可以大大减少存储空间的占用。
压缩存储法有两种常用的方式,分别是压缩行存储法和压缩列存储法。
压缩行存储法将矩阵中每行的非零元素保存起来,并记录它们的列号。
具体地,可以使用三个数组来保存稀疏矩阵:一个数组存储每一行的第一个非零元素的位置,一个数组存储每个非零元素的列号,另一个数组存储每个非零元素的值。
压缩列存储法和压缩行存储法类似,不同的是它将矩阵中每列的非零元素保存起来,并记录它们的行号。
除了压缩存储法之外,还有其他的稀疏矩阵保存方法,例如链表存储法和块状存储法等。
总之,稀疏矩阵保存方法可以大大减少存储空间的占用,对于稀疏矩阵的计算和处理也有很大的作用。
- 1 -。
稀疏矩阵说法
稀疏矩阵说法
稀疏矩阵是一种特殊类型的矩阵,其非零元素的数目远远小于矩阵元素的总数,并且非零元素的分布没有规律。
在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵。
与之相反,若非0元素数目占大多数时,则称该矩阵为稠密矩阵。
定义非零元素的总数比上矩阵所有元素的总数为矩阵的稠密度。
稀疏矩阵的应用非常广泛,几乎产生于所有的大型科学工程计算领域,包括计算流体力学、统计物理、电路模拟、图像处理、纳米材料计算等。
在存储和运算方面,稀疏矩阵可以利用零元素节约大量存储、运算和程序运行时间。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
检索
新疆大学精品课程——数据结构教学安排
第八章 排序
第七章 检索 第五章 树和二叉树 8学时 6学时
6学时
第六章 图
10学时
第四章 矩阵 第三章 栈和队列 4学时
4学时
第一章 绪论
4学时
第二章 线性表
6学时
新疆大学精品课程——数据结构实验安排
C程序
矩阵存储 排序检索 图的基本 算法程序 设计训练 (10-12周) 二叉树 线性结 构程序 基本编 程训练 (1-2周)
3n-3
31
4.2 稀疏矩阵
稀疏矩阵
设矩阵A[m][n]中有s个非零元素,若s远远小于矩阵元素的
总数(即s<<m×n),则称A为稀疏矩阵。
稀疏矩阵的三元组表表示
在存储稀疏矩阵时,为了节省存储单元,很自然地想到 使用压缩存储方法。但由于非零元素的分布一般是没有规律
的,因此在存储非零元素的同时,还必须同时记下它所在的
a00 a01
… ….. a0n-1
a10 a11 …. ……. a1n-1
………………….
an-10 an2 …
5
7
6
9
3
8
8
4
an-1n-1
26
4.2 稀疏矩阵
对称矩阵
为节约存储空间,只存对角线及对角线以 上的元素,或者只存对角线及对角线以下的 元素。不失一般性,假设以行主序存储下三 角(包括对角线)中的元素。 以一维数组sa[n(n+1)/2]作为n阶对称矩 阵A的存储结构,则sa[k]和矩阵元aij之间 存在着一一对应的关系: i(i+1)/2+j 当i≧j j(j+1)/2+i 当i<j
a00 a01 a10 a11 a12 a21 a22 a23 …… an-1,0 …… an-1,n-1
k 0 1 2 3 4
a10 a11 a12 0 …………… 0
a21 a22 a23 0 ……… 0
……………………………
0 0 0 … an-2,n-3 an-2,n-2 0… … an-1,n-2 an-2,n-1 an-1n-1
23
第四章 数组与稀疏矩阵
4.1 数组
4.2 稀疏矩阵
24
4.2 稀疏矩阵
问题引入
在科学与工程计算问题中,矩阵是一种常用的数学对象,
在高级语言编制程序时,就是将一个矩阵描述为一个二维数组。
矩阵在这种存储表示之下,可以对其元素进行随机存取,各种 矩阵运算也非常简单。但是在矩阵中非零元素呈某种规律分布 或者矩阵中出现大量的零元素的情况下,实际上占用了许多单 元去存储重复的非零元素或零元素,这对高阶矩阵会造成极大
21
4.1 数组
三维数组元素的地址
对于三维数组a[m][n][ p],可以看成m个大小为np的二 维数组,由a[i][0][0]的地址及二维数组的寻址公式,可求得到 三维数组元素a[i][j][k]寻址公式为: α + i n p + j p + k
22
4.1 数组
数组的特点 对同一数组的任何一个元素,由下标求存储地址的 运算时间是一样的,也就是说对任何一个数组元素的 访问过程是平等的,这是随机存取结构一个优点。 为了在内存中给数组开辟足够的存储单元,数组的 维数和大小必须事先给出。
性序列为:
a00,a10,…,am-1,0,a01,a11,…am-1,1,……,am-1,1, …,an-1,m-1
16
4.1 数组
行优先顺序
一个m行n列的二维数组如下所示: a00 a10 … a01 a11 … … … … a0,n-1 a1,n-1 … am-1,n-1
a00
…… a0,n-1 a10 a11 …… a1,n-1
14
4.1 数组
基本概念
数组是我们最熟悉的数据类型,在早期的高级语言中,数
组是唯一可供使用的数据类型。由于数组中各元素具有统一的 在内存中,数组元素是连续存储的。数组的第一个
类型,并且数组元素的下标一般具有固定的上界和下界,因此 元素的地址称为基地址,也称为数组的起始地址。 ,数组的处理比其它复杂的结构更为简单。 a00 Am×n= a10 a01 a11 … … a0,n-1 a1,n-1
基本算法
设计训练 (13-16周)
编程训练
(6-9周)
设计训练
(3-5周)
新疆大学精品课程——数据结构
第一章 绪论 第三章 栈和队列
第二章 线性表
第四章 矩阵
10
新疆大学精品课程——数据结构
1
理解数组中元素在内存中的表示
2
理解数组元素寻址公式含义
第四章 教学 目标
3
掌握特殊矩阵压缩存储方法 掌握稀疏矩阵压缩存储方法及其 转置和相乘运算的实现
熟悉图的应用算法,特别 重点掌握二叉树的遍历、 重点掌握栈、队列的实 掌握算法概念及算法设 重点掌握各类排序方法 重点掌握各类检索方法 是最短路径、最小生成树、 哈夫曼树的应用 现及与程序设计的关系 计的基本要求 关键路径等在后续课程中 应用检索方法解决问题 应用检索方法解决问题 的应用 重点介绍算法分析方法
的浪费,为了节省存储空间,我们可以对这类矩阵进行压缩存
储:即为多个相同的非零元素只分配一个存储空间;对零元素 不分配空间。
25
4.2 稀疏矩阵
对称矩阵
若n阶矩阵A中的数据元素满足下述性质aij=aji (0≤i,j≤n-
1)则称A为n阶对称矩阵;因aij与aji相等,二者只需分配一个
存储单元。这样,可将n×n个存储单元压缩到n(n+1)/2个单 元。 1 3 3 2 5 6 7 9
2
新疆大学精品课程——数据结构教学目标
提 高 问 题 分 析 能 力 提 高 程 序 调 试 能 力 提 高 程 序 书 写 能 力
训 练 编 程 能 力
3 3
新疆大学精品课程——数据结构参考书
新疆大学精品课程——数据结构学习方法
经典算法将会 成为你今后程 序设计的基石! 正确理解基本概念 是学习知识的基础
28
4.2 稀疏矩阵
三角矩阵
k
a00 c
c …….. ….
c c c
a10 a11 c ……..
a00 a10 a11 … …… an-1,0
0 1 2 3
an-10 an-11 an-13 … an-1n-1
k=
i(i+1)/2+j n(n+1)/2
当 i≧ j 当i<j
……
an-1,n-1 c
n(n+1)/2-1 n(n+1)/2
29
4.2 稀疏矩阵
三对角矩阵
如果矩阵中的所有的非零元素都集中在以主对角线为中心
的带状区域则称为对角矩阵,即除了主对角线和主对角线相邻 两侧的若干条对角线上的元素之外,其余元素皆为零。如常见 的三对角矩阵。
30
4.2 稀疏矩阵
三对角矩阵 a00 a01 0 0 …………… 0
am-1,0 am-1,1 …
……
a0,n-1 a1,n-1 …… am-1,n-1 18
4.1 数组
一维数组元素的地址
知道数组的维数,数组每个元素的地址我们很容易通过数 组的基地址得到。 对于一维数组a[n],假定每个元素占一个存储单元,α是 数组的基地址。则元素a[0]的地址是α,那么元素a[1]的地址就 是α+1,元素a[2]的地址应该是α+2。 那么任一元素a[i]在内存中的地址是 α+i 如果基地址用Loc(a[0])表示,每个元素占L个存储单元, 则有
0
0 0 2 0
3
0 0 0 0
0
0 0 0 0
0
0 0 0 0 33
4.2 稀疏矩阵
稀疏矩阵举例
0 0 1 2 3 4 5 0 0 0 9 1 0 6 0 0 0 2 0 9 0 0 0 3 2 0 3 0 0 4 0 0 0 0 0 5 8 0 0 0 0
5 6
0 0
0 0
2 0
0 0
0 0
0 0
行和列的位置(i,j)。一个三元组(i,j,aij)唯一确定了矩阵A 的一个非零元素。因此,稀疏矩阵可由表示非零元素的三元 组及其行列数唯一确定。
32
4.2 稀疏矩阵
稀疏矩阵举例
0 0 1 5 0 1 0 6 2 0 9 3 2 0 4 0 0 5 8 0
2
3 4 5 6
0
0 9 0 0
0
0 0 0 0
a00 a10 a11 …
,,,,,
k 0 1 2 3 4
……
an-1,0 …… an-1,n-1
n(n+1)/2-1
27
4.2 稀疏矩阵
三角矩阵
以主对角线划分,三角矩阵有上三角和下三角两种。
上三角矩阵是它的下三角(不包括主对角线)中的元素均为 常数或零。下三角矩阵正好相反,它的主对角线上方均为常数 或零。三角矩阵中的重复元素c可共享一个存储空间,其余的元 素正好有n(n+1)/2个,因此,三角矩阵可压缩存储到一维数组sa [n(n+1)/2+1]中。其中c存放在向量的最后一个分量中。
34
4.2 稀疏矩阵
稀疏矩阵的三元组表
稀疏矩阵 M就可存储在三元组表 a[t+1][3]中。其中t=8是 0 1 2 3 4 5
行 列 值
稀疏矩阵中非零元素的个数,三元组表中 0 7a[0][0]、 6a[0][1]和 8 0 5 0 0 2 0 8 1 0 0 5 a[0][2] 1 0 分别表示稀疏矩阵的行数、列数和非零元素个数。 6 9 0 0 0