数据结构与算法 特殊矩阵和稀疏矩阵

合集下载

中国农业大学_821数据结构_《数据结构》实验笔记(4)

中国农业大学_821数据结构_《数据结构》实验笔记(4)

实验4 数组与广义表
课程实验共安排8个难度各易的实验,训练重点在于掌握基本的数据结构,而不强调面面俱到。

通过实验,掌握抽象数据类型的概念和基本数据结构,掌握各种数据结构内在的逻辑关系,各种数据结构在计算机中的存储表示,基于各种数据结构上的基本运算、算法实现及算法分析。

●实验目的
(1) 了解数组的存储表示方法,掌握其在作为运行的存储结构中的地址计算方法。

(2) 了解特殊矩阵及稀疏矩阵压缩存储特点和适用范围,领会其运算采用的处理方法。

(3) 了解广义表的结构特点及存储表示方法,掌握其主要运算的实现方法。

●实验内容
1. 鞍点问题
[问题描述] 若矩阵A中的某一元素A[i, j]是第i行中的最小值,而又是第j列中的最大值,则称A[i, j]为矩阵A中的一个鞍点。

请写出一个可确定此鞍点位置的算法(如果这个鞍点存在),并给出此算法的时间复杂度。

[基本要求] 要求算法要考虑某行中具有多个相同的且又是该行中最小的元素的情况。

2. 对称矩阵运算
[问题描述] 已知A和B为两个n×n阶的对称矩阵,试编写一个计算对称矩阵A和B的乘积的函数。

[基本要求] 输入时对称矩阵只输入下三角形元素,存入一维数组,即采用压缩存储。

3. 广义表运算
[问题描述] 在给定的广义表中查找数据为x的结点,编写该算法。

[基本要求] 广义表采用扩展线性链表存储表示。

●实验要求
(1) 认真分析题目。

(2) 进行算法设计。

(3) 编写程序代码
(4) 上机调试程序。

(5) 保存和打印出程序的运行结果,并结合程序进行分析。

数据结构之稀疏矩阵稀疏矩阵的存储方式和操作分析

数据结构之稀疏矩阵稀疏矩阵的存储方式和操作分析

数据结构之稀疏矩阵稀疏矩阵的存储方式和操作分析稀疏矩阵是指矩阵中大部分元素为零的特殊矩阵。

在实际应用中,稀疏矩阵经常出现,如图像处理、网络分析和科学计算等领域。

对于稀疏矩阵的存储和操作是数据结构中的重要内容。

本文将介绍稀疏矩阵的存储方式和相关操作的分析。

一、稀疏矩阵存储方式稀疏矩阵的存储方式有多种,其中三元组顺序表和二维数组是比较常用的方法。

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. 相乘操作稀疏矩阵的相乘操作是指将两个矩阵相乘得到一个新的矩阵。

密集矩阵和稀疏矩阵

密集矩阵和稀疏矩阵

密集矩阵和稀疏矩阵在计算机科学和数学领域,矩阵是一种重要的数据结构,用于表示线性关系和进行各种数学运算。

根据矩阵中元素的分布情况,可以将矩阵分为密集矩阵和稀疏矩阵。

密集矩阵是指矩阵中绝大多数元素都是非零的情况。

换句话说,密集矩阵中的元素很少为零。

这意味着在计算机内存中存储密集矩阵所需的空间较大。

由于矩阵运算中通常涉及到对每个元素的操作,密集矩阵在计算过程中需要更多的计算资源和时间。

相比之下,稀疏矩阵是指矩阵中大部分元素都是零的情况。

在实际应用中,很多矩阵都是稀疏的,比如社交网络中的好友关系矩阵、文本处理中的词频矩阵等。

由于稀疏矩阵中的元素很少,所以在计算机内存中存储稀疏矩阵所需的空间相对较小。

此外,由于稀疏矩阵中有大量的零元素,可以采用特殊的存储方式来节省存储空间,并且可以通过跳过零元素的计算,提高计算效率。

对于密集矩阵,由于每个元素都需要存储和计算,所以在进行矩阵运算时需要耗费大量的时间和资源。

而对于稀疏矩阵,由于零元素的存在,可以通过跳过这些零元素的计算,大大减少了运算的时间和资源消耗。

这使得稀疏矩阵在很多应用中具有重要的优势。

在实际应用中,根据矩阵的特点选择适合的存储方式是非常重要的。

如果矩阵是密集矩阵,并且计算量较小,可以选择直接存储矩阵的元素。

如果矩阵是稀疏矩阵,并且计算量较大,可以选择采用压缩存储方式,如压缩稀疏矩阵(CSR)或压缩列矩阵(CSC)等。

密集矩阵和稀疏矩阵是在计算机科学和数学领域中常见的概念。

密集矩阵适用于元素较多且计算量较小的情况,而稀疏矩阵适用于元素较少且计算量较大的情况。

根据实际应用的需求,选择合适的存储方式和计算方法可以提高计算效率和节省资源。

《数据结构与算法》第五章-数组和广义表学习指导材料

《数据结构与算法》第五章-数组和广义表学习指导材料

《数据结构与算法》第五章数组和广义表本章介绍的数组与广义表可视为线性表的推广,其特点是数据元素仍然是一个表。

本章讨论多维数组的逻辑结构和存储结构、特殊矩阵、矩阵的压缩存储、广义表的逻辑结构和存储结构等。

5.1 多维数组5.1.1 数组的逻辑结构数组是我们很熟悉的一种数据结构,它可以看作线性表的推广。

数组作为一种数据结构其特点是结构中的元素本身可以是具有某种结构的数据,但属于同一数据类型,比如:一维数组可以看作一个线性表,二维数组可以看作“数据元素是一维数组”的一维数组,三维数组可以看作“数据元素是二维数组”的一维数组,依此类推。

图5.1是一个m行n列的二维数组。

5.1.2 数组的内存映象现在来讨论数组在计算机中的存储表示。

通常,数组在内存被映象为向量,即用向量作为数组的一种存储结构,这是因为内存的地址空间是一维的,数组的行列固定后,通过一个映象函数,则可根据数组元素的下标得到它的存储地址。

对于一维数组按下标顺序分配即可。

对多维数组分配时,要把它的元素映象存储在一维存储器中,一般有两种存储方式:一是以行为主序(或先行后列)的顺序存放,如BASIC、PASCAL、COBOL、C等程序设计语言中用的是以行为主的顺序分配,即一行分配完了接着分配下一行。

另一种是以列为主序(先列后行)的顺序存放,如FORTRAN语言中,用的是以列为主序的分配顺序,即一列一列地分配。

以行为主序的分配规律是:最右边的下标先变化,即最右下标从小到大,循环一遍后,右边第二个下标再变,…,从右向左,最后是左下标。

以列为主序分配的规律恰好相反:最左边的下标先变化,即最左下标从小到大,循环一遍后,左边第二个下标再变,…,从左向右,最后是右下标。

例如一个2×3二维数组,逻辑结构可以用图5.2表示。

以行为主序的内存映象如图5.3(a)所示。

分配顺序为:a11 ,a12 ,a13 ,a21 ,a22,a23 ; 以列为主序的分配顺序为:a11 ,a21 ,a12 ,a22,a13 ,a23 ; 它的内存映象如图5.3(b)所示。

数据结构——特殊矩阵

数据结构——特殊矩阵

数据结构——特殊矩阵数据结构,特殊矩阵特殊矩阵是一种在计算机科学中常见的数据结构,它是由一组元素组成的二维数组。

特殊矩阵具有特定的属性,使得它们在特定的问题领域中非常有用。

在这篇文章中,我们将介绍几种常见的特殊矩阵,并讨论它们的应用。

首先,我们来讨论对角矩阵。

对角矩阵是指只有主对角线上有非零元素的矩阵。

其他位置上的元素都是零。

对角矩阵可以用于多种计算问题,如线性方程组的求解和矩阵乘法。

由于对角矩阵的特殊结构,它的存储和运算都可以更高效地执行。

其次,我们来讨论上三角矩阵和下三角矩阵。

上三角矩阵是指只有主对角线及其以上的元素都不为零的矩阵,而下三角矩阵则是指只有主对角线及其以下的元素都不为零的矩阵。

这两种特殊矩阵也常用于矩阵运算中,因为它们具有更高效的存储和计算方式。

另一个常见的特殊矩阵是稀疏矩阵。

稀疏矩阵是指其中大部分元素都为零的矩阵。

在很多应用中,矩阵的元素并不是均匀分布的,而是集中在一些特定的位置。

因此,使用传统的二维数组来存储这种矩阵会浪费很多的空间。

稀疏矩阵的一个常见的存储方法是压缩矩阵,只存储非零元素的值和其对应的位置。

最后,我们来讨论特殊矩阵的应用。

特殊矩阵广泛应用于图论、网络分析和科学计算等领域。

在图论中,邻接矩阵是一种常见的特殊矩阵,用于表示图的连接关系。

在网络分析中,PageRank算法使用了特殊矩阵的运算方法,用于计算网页的重要性。

在科学计算中,特殊矩阵的高效存储和计算方式可以大大提高计算效率。

总结起来,特殊矩阵是一种重要的数据结构,它具有特定的结构和属性,使得它们在特定的问题领域中非常有用。

了解特殊矩阵的类型和应用可以帮助我们更好地理解和应用数据结构。

希望本文对读者对特殊矩阵有更深入的了解,并能在实际问题中灵活应用。

数据结构(第二版)习题谜底第4章[基础]

数据结构(第二版)习题谜底第4章[基础]

数据结构(第二版)习题答案第4章第4章字符串、数组和特殊矩阵4.1稀疏矩阵常用的压缩存储方法有(三元组顺序存储)和(十字链表)两种。

4.2设有一个10 × 10的对称矩阵 A采用压缩方式进行存储,存储时以按行优先的顺序存储其下三角阵,假设其起始元素 a00的地址为 1,每个数据元素占 2个字节,则 a65的地址为( 53 )。

4.3若串S =“software”,其子串的数目为( 36 )。

4.4常对数组进行的两种基本操作为(访问数据元素)和(修改数组元素)。

4.5 要计算一个数组所占空间的大小,必须已知(数组各维数)和(每个元素占用的空间)。

4.6对于半带宽为 b的带状矩阵,它的特点是:对于矩阵元素 aij,若它满足(|i-j|>b),则 aij = 0。

4.7字符串是一种特殊的线性表,其特殊性体现在(该线性表的元素类型为字符)。

4.8试编写一个函数,实现在顺序存储方式下字符串的 strcompare (S1,S2)运算。

【答】:#include <stdio.h>#include <string.h>#define MAXSIZE 100typedef struct{char str[MAXSIZE];int length;}seqstring;/* 函数 strcompare()的功能是:当 s1>s2时返回 1,当 s1==s2时返回 0,当 s1<s2时返回-1*/int strcompare(seqstring s1,seqstring s2){ int i,m=0,len;len=s1.length<s2.length ?s1.length:s2.length;for(i=0;i<=len;i++)if(s1.str[i]>s2.str[i]){m=1;break;}else if(s1.str[i]<s2.str[i]){m=-1;break;}return m;}int main(){ seqstring s1,s2;int i,m;printf("input char to s1:\n");gets(s1.str);s1.length=strlen(s1.str);printf("input char to s2:\n");gets(s2.str);s2.length=strlen(s2.str);m=strcompare(s1,s2);if(m==1) printf("s1>s2\n");else if(m==-1) printf("s2>s1\n");else if(m==0) printf("s1=s2\n");}4.9试编写一个函数,实现在顺序存储方式下字符串的replace(S,T1,T2)运算。

数据结构之特殊矩阵

数据结构之特殊矩阵

数据结构之特殊矩阵特殊矩阵:即指⾮零元素或零元素的分布有⼀定规律的矩阵,为了节省存储空间,我们可以对这类矩阵进⾏压缩存储;即为多个相同的⾮零元素只分配⼀个存储空间;对零元素不分配空间⼀、稀疏矩阵稀疏矩阵:设矩阵A中有s个⾮零元素,若s远远⼩于矩阵元素的总数,则称A为稀疏矩阵。

如果我们把整个数据存⼊内存,如果每个单元格⼀个字节则需要6*5个字节我们要对稀疏矩阵进⾏压缩存储:即只存储稀疏矩阵中的⾮零元素和矩阵的⼤⼩;采⽤三元组的表⽰⽅式例如:(6,5,30)矩阵⼤⼩、(0,3,34)、(1,1,1)、(1,3,3)、(1,4,59)、(2,0,23)、(2,2,12)、(3,1,45)、(3,3,51)、(3,4,46)、(4,2,34)、(5,0,78)、(5,2,56)、(5,4,2)稀疏矩阵占⽤空间⼤⼩:7*3个字节⼆、三⾓矩阵:上三⾓矩阵、下三⾓矩阵三⾓矩阵中的重复元素c(常量)可共享⼀个存储空间,其余的元素正好有n(n+1)/2个,因此,三⾓矩阵可压缩存储到向量s[0..n(n+1)/2]中,其中c存放在向量的最后⼀个分量中================上三⾓矩阵=================以主对⾓线划分,三⾓矩阵有上三⾓和下三⾓两种。

上三⾓矩阵,它的下三⾓(不包括主对⾓线)中的元素均为常数或者0,在⼤多数情况下,三⾓矩阵常数为零。

该图就是⼀个上三⾓矩阵a(m,n)=a(4,4)是⼀个4阶的⽅阵,将该矩阵压缩存储到⼀维数组S后下标012345678910数据12346781112160转换后⼀维数组的长度:S.length=1+n(n+1)/2最后⼀个位置:S[n(n+1)/2]=0其他上三⾓元素的位置在⼀维数组S的下标:S[i(2n-i+1)/2+j-i ]=a(i,j) ;例如 a(2,3)=S[2*(2*4-2+1)/2+3-2]=S[8]=12================下三⾓矩阵=================以主对⾓线划分,三⾓矩阵有上三⾓和下三⾓两种。

中南大学数据结构与算法第5章数组和广义表课后作业答案

中南大学数据结构与算法第5章数组和广义表课后作业答案

第5章数组与广义表习题练习答案5.1请按行及按列优先顺序列出四维数组A2*3*2*3的所有元素在内存中的存储次序,开始结点为a0000。

解:按行优先的顺序排列时,先变化右边的下标,也就是右到左依次变化,这个四维数组的排列是这样的:(将这个排列分行写出以便与阅读,只要按从左到右的顺序存放就是在内存中的排列位置) a0000a0001a0002a0010a0011a0012a0100a0101a0102a0110a0111a0112a0200a0201a0202a0210a0211a0212a1000a1001a1002a1010a1011a1012a1100a1101a1102a1110a1111a1112a1200a1201a1202a1210a1211a1212按列优先的顺序排列恰恰相反,变化最快的是左边的下标,然后向右变化,所以这个四维数组的排列将是这样的,(这里为了便于阅读,也将其书写为分行形式):a0000a1000a0100a1100a0200a1200a0010a1010a0110a1110a0210a1210a0001a1001a0101a1101a0201a1201a0011a1011a0111a1111a0211a1211a0002a1002a0102a1102a0202a1202a0012a1012a0112a1112a0212a02125.2 给出C语言的三维数组地址计算公式。

解:因为C语言的数组下标下界是0,所以Loc(A mnp)=Loc(A000)+((i*n*p)+k)*d其中Amnp表示三维数组。

Loc(A000)表示数组起始位置。

i、j、k表示当前元素的下标,d表示每个元素所占单元数。

5.3设有三对角矩阵A n*n,将其三条对角线上的元素逐行地存储到向量B[0...3n-3]中,使得B[k]=a ij,求:(1)用i , j 表示k的下标变换公式。

(2)用k 表示i,j 的下标变换公式。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

常熟理工学院
《数据结构与算法》实验指导与报告书
_2017-2018_____学年第__1__ 学期
专业:物联网工程
实验名称:特殊矩阵和稀疏矩阵
实验地点: N6-210 指导教师:聂盼红
计算机科学与工程学院
2017
实验五特殊矩阵和稀疏矩阵
【实验目的】
1、掌握数组的结构类型(静态的内存空间配置);通过数组的引用下标转换成该数据在内存中的地址;
2、掌握对称矩阵的压缩存储表示;
3、掌握稀疏矩阵的压缩存储-三元组表表示,以及稀疏矩阵的转置算法。

【实验学时】
2学时
【实验预习】
回答以下问题:
1、什么是对称矩阵?写出对称矩阵压缩存储sa[k]与aij之间的对应关系。

若n阶矩阵A中的元素满足下述性质:a ij=a ji,则称为n阶对称矩阵。

sa[k]与矩阵元素a ij之间存在着一一对应的关系:
若i>=j,k=i*(i+1)/2+j;
若i<j,k=j*(j+1)/2+i。

0<=i, j<=n-1 0<=k<=n*(n+1)/2-1
2、什么是稀疏矩阵?稀疏矩阵的三元组表表示。

假设在m×n的矩阵中,有t个元素不为零,且t<<m×n,则称此矩阵为稀疏矩阵。

稀疏矩阵的三元组成表示: 矩阵的行数、列数和非零元个数
【实验内容和要求】
1、编写程序,将对称矩阵进行压缩存储。

(1)对称矩阵数组元素A[i][j]转换成为以行为主的一维数组sa[k],请描述k与ij
的关系。

(注意C程序中,i,j,k均从0开始)
(2)调试程序与运行。

对称矩阵存储下三角部分即i>=j。

对称矩阵为3,9,1,4,7
9,5,2,5,8
1,2,5,2,4
4,5,2,1,7
7,8,4,7,9
参考程序如下:
#include<>
#define N 5
int main()
{
int upper[N][N]= {{3,9,1,4,7},
{9,5,2,5,8},
{1,2,5,2,4},
{4,5,2,1,7},
{7,8,4,7,9}
}; /*对称矩阵*/
int rowMajor[15]; /*存储转换数据后以行为主的数组*/
int Index; /*数组的索引值*/
int i,j;
printf("Two dimensional upper triangular array:\n");
for (i=0; i<N; i++) /*输出对称矩阵*/
{
for(j=0; j<N; j++)
printf("%3d",upper[i][j]);
printf("\n");
}
for(i=0; i<N; i++) /*进行压缩存储*/
for(j=0; j<N; j++)
if(i>=j) /*下三角元素进行存储*/
{
Index=i*(i+1)/2+j; /*ij与index的转换*/
rowMajor[Index]=upper[i][j];
}
printf("\nRow Major one dimensional array:\n");
for(i=0; i<15; i++) /*输出转换后的一维数组*/
printf("%3d", rowMajor[i]);
printf("\n");
return 1;
}
2、完成程序,实现稀疏矩阵的三元组表存储及稀疏矩阵的转置。

调试并给出结果:
补充完整程序,运行稀疏矩阵的一般转置算法;
完成稀疏矩阵的快速转置算法,并修改主函数的转置调用算法,验证快速转置算
法的正确性。

部分代码如下:
#include<>
#define MAXSIZE 20 /*非零元素个数最大值*/
typedef int ElemType;
typedef struct
{
int i,j;
ElemType e;
}Triple;
typedef struct
{
Triple data[MAXSIZE+1]; /*三元组表,data[0]不用*/
int mu,nu,tu; /*矩阵的行数、列数、非零元个数*/
}TSMatrix;
void TransposeSMatrix(TSMatrix *T,TSMatrix *M); /*一般转置算法*/ void FastTransposeSMatrix(TSMatrix *M,TSMatrix *T); /*快速转置算法*/
int main()
{
int i,j,k,q,col,p;
int temp[6][7]={{0,12,9,0,0,0,0}, /*稀疏矩阵*/
{0,0,0,0,0,0,0,},
{-3,0,0,0,0,14,0},
{0,0,24,0,0,0,0},
{0,18,0,0,0,0,0},
{15,0,0,-7,0,0,0},
};
TSMatrix T,M;
=6;
=7;
=0;
k=1;
for (i=0;i< ;i++) /*转换为稀疏矩阵的三元组表示*/ {
for (j=0;j< ;j++)
{
if (temp[i][j]!=0)
{
[k].i=i+1;
[k].j=j+1;
[k].e=temp[i][j];
k++;
}
}
}
=k-1;
FastTransposeSMatrix(&M,&T); /*调用转置算法进行转置*/
/*输出转置结果*/
printf("稀疏矩阵:\n");
for (i=0;i< ;i++) /*转换为稀疏矩阵的三元组表示*/ {
for (j=0;j< ;j++)
{
printf("%3d",temp[i][j]);
}
printf("\n");
}
printf("转置前M三元组表:\nmu\tnu\ttu\n"); printf("%d\t%d\t%d\n",,,;
printf("\ni\tj\te\n");
for (i=1;i<=;i++)
printf("%d\t%d\t%d\n",[i].i,[i].j,[i].e); printf("转置后T三元组表:\nmu\tnu\ttu\n"); printf("%d\t%d\t%d\n",,,;
printf("\ni\tj\te\n");
for (i=1;i<=;i++)
printf("%d\t%d\t%d\n",[i].i,[i].j,[i].e); }
/*稀疏矩阵的转置*/
void TransposeSMatrix(TSMatrix *M,TSMatrix *T)
{
int q,col,p;
T->mu=M->nu;
T->tu=M->tu;
if (T->tu)
{
q=1;
for (col=1;col<=M->nu;++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;
}
}
}
/*稀疏矩阵的快速转置算法*/
void FastTransposeSMatrix(TSMatrix *M,TSMatrix *T) {
int t,q,col,p,num[MAXSIZE],cpot[MAXSIZE];
T->mu=M->nu;
T->nu=M->mu;
if (T->tu)
{
/*快速转置过程的实现,请补充代码*/
for(col=1;col<=M->mu;++col)
num[col]=0; ]; ;
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];
}
}
}
【实验小结】
本实验掌握了对称矩阵的压缩存储表示,稀疏矩阵的压缩存储-三元组表表示,以及稀疏矩阵的转置算法。

明白了可以改变矩阵的储存方式来节省内存空间,今后可以利用这一思想来节省内存。

相关文档
最新文档