课后习题.docx

上传人:b****6 文档编号:6462511 上传时间:2023-01-06 格式:DOCX 页数:22 大小:310.43KB
下载 相关 举报
课后习题.docx_第1页
第1页 / 共22页
课后习题.docx_第2页
第2页 / 共22页
课后习题.docx_第3页
第3页 / 共22页
课后习题.docx_第4页
第4页 / 共22页
课后习题.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

课后习题.docx

《课后习题.docx》由会员分享,可在线阅读,更多相关《课后习题.docx(22页珍藏版)》请在冰豆网上搜索。

课后习题.docx

课后习题

第三章课后习题

3.3.2对角矩阵的压缩存储

所谓对角矩阵是指矩阵中的所有非零元素都集中在以主对角线为中心的带状区域中,即除了主对角线上和直接在主对角线上、下方对称的若干条对角线上的元素之外,其余元素均为零。

下面给出的矩阵B就是一个对角矩阵(确切地说是一个三对角矩阵,这里,我们仅以三对角矩阵为例子)。

三对角矩阵一共有3n—2个非零元素。

我们可以按照某个原则(或者以行序为主序的分配方式,或者以列序为主序的分配方式,或者按照对角线的顺序进行分配)将对角矩阵B的所有非零元素压缩存储到一个一维数组LTB[3n—2]中。

这里,不妨仍然以行序为主序的分配方式对B进行压缩存储,当B中任一非零元素Bij与LTB[k]之间存在着如下一一对应关系k=2*i+j-3时,则有Bij=LTB[k]。

称LTB[3n—2]为对角矩阵B的压缩存储,如下图所示。

上面讨论的几种特殊矩阵中,非零元素的分布都具有明显的规律,因而都可以被压缩

存储到一个一维数组中,并且能够确定这些矩阵的每一个元素(或非零元素)在一维数组

中的位置。

但是,对于那些非零元素在矩阵中的分布没有规律的特殊矩阵(如稀疏矩阵),

则需要寻求其他的方法来解决压缩存储问题。

3.5稀疏矩阵的十字链表表示

上一节讨论了用三元组表的形式来存储一个稀疏矩阵的方法。

但是,在实际应用中,当稀疏矩阵中非零元素的位置或者个数经常发生变化时,使用三元组表就不太方便了。

本节将介绍稀疏矩阵的另一种表示方法,即十字链表表示。

如何用链表形式来表示一个稀疏矩阵呢?

方法之一就是将所有非零元素以行序为主序方式(当然也可以以列序为主序方式)采用循环链表链接起来。

链结点的构造由四个域组成:

其中i,j分别表示某一个非零元素所在的行号与列号;value表示该非零元素的值;link域用来指向下一个非零元素所在的链结点,它是一个指针。

另外,再设置一个链表头结点,其构造如下:

其中,m,n分别表示稀疏矩阵的行数与列数;t为稀疏矩阵非零元素的总个数;link域用来指向第一个非零元素对应的链结点。

例如,对于如下一个稀疏矩阵:

若采用行序为主序方式(每行又按列的先后顺序)依次将所有非零元素链接起来,则得到如图3.4所示的一个带有头结点的循环链表。

这种表示方法最明显的一个缺点就是,当要访问某行某列的一个非零元素时,必须从链表的最前面那个链结点开始进行搜索,其效率之低可想而知。

一个能提高访问效率的方法就是采用十字链表表示。

这种方法为稀疏矩阵的每一行设置一个单独的行循环链表,同样也为每一列设置一个单独的列循环链表。

这样,稀疏矩阵中的每一个非零元素同时包含在两个链表中,即包含在它所在的行链表与所在的列链表中,也就是这两个链表的交汇处。

对于一个mXn的稀疏矩阵,分别建立m个行的循环链表与n个列的循环链表,每个非零元素用一个链结点来存储。

链结点的结构可以设计为

其中,rOW,c01,value分别表示某非零元素所在的行号、列号和相应的元素值;down与right分别称为向下指针与向右指针,它们分别用来链接同一列中的与同一行中的某非零元素结点。

也就是说,稀疏矩阵中同一行的所有非零元素是通过right指针链接成一个行链表,同一列中的所有非零元素是通过down指针链接成一个列链表。

而对每一个非零元素而言,它既是某个行链表中的一个链结点,同时又是某个列链表中的一个链结点,这个非零元素好比处在一个十字路口,故称这种链表表示为十字链表表示法。

作为链表,应该用某种方式能访问表中的第一个结点,为此,对于m个行链表,分别设置m个行链表表头结点。

表头结点的构造与链表中其他链结点一样,只是令row与凹1域的值均为0,right域指向相应行链表的第一个链结点。

同理,对于n个列链表,分别设置n个列链表表头结点。

头结点结构也同其他链结点一样,只是令rOW与c01的值均为0,down域指向相应列链表的第一个链结点。

另外,通过value域把所有这些表头链结点也链接成一个循环链表。

十字链表中的链结点类型可以描述如下:

typedefstructnode{

introw,col;

union{

ElemTypeval;

structnode'ptr;

1value;

structnode1right,'down;

1CNode,xCrossLink;/‘定义十字链表结点类型x/

从m个行链表的表头结点与n个列链表的表头结点的设置情况看到,行链表的头结点只用了right域作为指针,而列链表的头结点只用了down域与value域,其他域没有使用。

因此,可以设想原来的(m+n)个头结点实际上可以合并成MAX(m,n)。

为此,再设置一个结点作为头结点链表的头结点,不妨称之为总头结点,其结构如下所示:

m

n

Link

t

其中,m,n分别为稀疏矩阵的行数与列数;t为非零元素的总个数;1ink指向头结点链表的第一个头结点。

总头结点的类型可以如下描述:

typedefstruct{

intm,n,t,nil;

CrossLinkxlink;

}HNode,*HLink;/x定义十字链表总头结点类型x/‘

综上所述,若给出一个稀疏矩阵B如下,则它的十字链表表示如图3.5所示。

下面给出创建一个具有m行n列、有t个非零元素的稀疏矩阵的十字链表的算法。

稀疏矩阵用三元组表的形式作为输入。

首先输入稀疏矩阵的行数、列数以及非零元素总个数(m,n,t),然后依次读入个三元组。

算法中用到了一个辅助数组hdnode[MAX(m,n)]。

其中,hdnode[i]用来分别存放第i列(也是第i行)链表的头结点的指针(1≤i≤MAX(m,n))。

#defineMaxNl00

HLinkMREAD()

{

HLinkHEAD,p,last,hdnode[MaxN];

ihtm,nt,k,i,Current_row,

intrrow,ccol,val;

scanf("%d%d%",&n,&n,&t);/x读入矩阵的行、列和非零元素的个数‘/

if(t<=0)

returnNULL;

k=(m>n)?

m:

n;

for(i=0;i

p=(HLink)malloc(sizeof(HNode));

hdnode[i]=p;

p->row=0;

p->col=0;

p->value.ptr=P;

p->rlght=p;

p->down=p;

}/*建立k个头结点;初始时第i个头结点的地址存放于hdnode[i-1]中x/

Current_row=1;

last=hdnode[0];

for(i=1;i<=t;i++){

scanf("%d%d%d",&rrow,&ccol,&val);/x读人一个某非零元素的三元组x/

if(rrow>current_row){

last—>right=hdnode[Current_row—1];

current_row=rrow;

last=hdnode[rrow—1];

}

p=(CrossLink)malloc(sizeof(CNode));/x申请一个新的链结点空间x/

p—>row=rrow;

p->col=ccol;

p—>value.val=val;

last->right=p;/x生成一个新的链结点x/

last=p;

hdnode[ccol—1)->value.ptr->down=p;/‘将新结点链接到相应行链表中,/

kfnode[ccol—1)->value.ptr=p;/x将新结点链接到相应列链表中,/

if(t!

=0)

last->right:

hdnode[current—row—1];/x封闭最后——行x/

for(i=0;i

hdnode[i]->value.ptr->down=hdnode[i];/x封闭所有列链表x/

HEAD=(HLink)malloc(sizeof(HNode));/,申请一个总的头结点x/

HEAD->m=m;

HEAD->n=n;

HEAD->t=t;

for(i=0;i

hdnode[i]->value.ptr=nanode[i+1];

if(k==0)

HEAD->value.ptr=HEAD;

else{

hdnode[k-1]->value.ptr=HEAD;

HEAD->value.ptr=hdnode[0];

returnHEAD;}

习题

3.1判断题(在你认为正确的题后的括号中打√,否则打X)。

(1)数组是一种线性表结构。

()

(2)数组最基本的操作是插入和删除。

()

(3)对数组的操作是基于数组下标进行的。

()

(4)具有特殊用途的矩阵称为特殊矩阵。

()

(5)只需存储n阶对称矩阵的下三角部分的元素。

()

(6)在n阶三对角矩阵中,矩阵的每一列都有3个非零元素。

()

(7)稀疏矩阵的特点就是矩阵中的元素较少。

()

(8)采用三元组表方法存储稀疏矩阵的优点之一是可以随机地访问矩阵中的每一个非零元

素。

()

(9)用一维数组存储特殊矩阵的目的是为了节省存储空间。

()

(10)从理论上说,任何一个矩阵都可以采用三元组表方法进行存储。

()3.2填空题。

(1)一般情况下,数组最基本的操作是——。

(2)一个m行n列的矩阵可以看成是长度为——的线性表,表中的每一个元素是长度为

m的线性表。

(3)一个m行n列的矩阵可以看成是长度为——的线性表,表中的每一个元素是长度为n的线性表。

(4)已知二维数组A(4)[6]采用行序为主序方式存储,每个元素占用4个存储单元,该数组一

共占用了——个存储单元。

(5)已知二维数组A[4爪6]采用行序为主序方式存储,每个元素占用3个存储单元,并且

A10爪0]的存储地址为1200,元素A12)14]的存储地址是——。

(6)已知二维数组A14爪6]采用列序为主序方式存储,每个元素占用4个存储单元,

并且A[3][4]的存储地址为1234,元素A[0][0]的存储地址是——。

(7)对特殊矩阵采用压缩存储方法的目的是——。

(8)一个20阶五对角矩阵一共有——个元素,其中有——个非零元素。

(9)将n阶三对角矩阵A中所有非零元素按照行序为主序方式依次存放于数组B中,非零元素A[i][j]在B中的位置是——。

3.3单项选择题。

(1)所谓稀疏矩阵是指——的矩阵。

A.零元素较多且分布无规律·B非零元素较少

C.元素较少D.不适合采用二维数组表示

(2)下面的说法中,不正确的是——。

A.只需存放对称矩阵中包括主对角线元素在内的下(或上)三角部分的元素即可

B‘只需存放对角矩阵中的非零元素即可

C.稀疏矩阵中值为零的元素较多,因此可以采用三元组表方法存储

D.稀疏矩阵中大量值为零的元素分布有规律,因此可以采用三元组表方法存储

(3)与三元组表方法相比,稀疏矩阵采用十字链表表示的优点在于——。

A.便于实现增加或减少矩阵中非零元素的操作

B.便于实现增加或减少矩阵元素的操作

C.节省存储空间

D.可以更快地查找到某个矩阵元素

(4)对稀疏矩阵采用压缩存储,其缺点之一是——。

A.无法判断矩阵的行数和列数

B.无法根据行列号计算矩阵元素的存储地址

C.无法根据行列号查找某个矩阵元素

D.使得矩阵元素之间的逻辑关系更加复杂

(5)将一个20阶的五对角矩阵中所有非零元素压缩存储到一个一维数组中,该一维数组至少应该有——个数组元素。

A.90B.92C.94D.96

(6)将10阶三对角矩阵中的所有非零元素按照行序为主序方式依次存放于一维数组中,矩阵的第7行第8列的元素在该一维数组中————。

A.是第22个数组元素B.是第21个数组元素

C.是第20个数组元素D.不存在

(7)将10阶三对角矩阵中的所有非零元素按照行序为主序方式依次存放于一维数组中,一维数组中的第18个数组元素是矩阵——的那个元素。

A.第6行第3列B.第6行第7列C。

第7行第7列、D.第7行第6列

(8)若将n阶对称矩阵A按照行序为主序方式将包括主对角线元素在内的下三角形的所有元素依次存放在一个一维数组B中,则该对称矩阵在B中占用了一个数组元素。

A.n2B.n*(n-1)C.n*(n+1)/2D.n*(n-1)/2

(9)若将n阶三对角矩阵A按照行序为主序方式将所有非零元素依次存放在一个一维数组B中,则该三对角矩阵在B中占用了——个数组元素。

A.n2B.3n-2C.3nD.3n+2

(10)若将对称矩阵A按照行序为主序方式将包括主对角线元素在内的下三角形的所有元素依次存放在一个一维数组B中,那么,A中某元素Aij(i

A.(i*(i—1))/2+j-1B.(i*(i—1))/2—j—1

C.(j*(j—1))/2十i—1D.(j*(j-1))/2—i—1

(11)对三对角矩阵A采用压缩存储的方法将所有非零元素存放于一个一维数组BC3n—2]中,某非零元素Aij在B中位置是——。

A.2*i+j-2B.2*i+j+2C.2*i+j-3D.2*i+j-1

3.4已知一元多项式f(x)=4X(6)—5X(4)十7X

(2)-1,请写出f(x)的一维数组表示的两种方法。

3.5按照压缩存储的思想,对于一个具有t个非零元素的mXn阶稀疏矩阵,若采用三元组表存储方法,t到达什么程度时这样做才有意义?

3.6已知稀疏矩阵A[6][5]如下所示,请分别写出它的三元组表表示与十字链表表示。

3.8已知稀疏矩阵A为m行n列,请写出将该稀疏矩阵转换为三元组表表示的算法。

3.9设A为一个n阶上三角矩阵,若将此三角矩阵的所有非零元素按照列序为主序分配方式存放在数组B[n*(n+1)/2]中,a11存放于B[0]中,请写出此三角矩阵的非零元素Aij(i≤j)的寻址公式。

3.10请写算法,该算法将一个n阶矩阵A主对角线以下的所有元素(不包括主对角线上的元素)按照列序为主序方式依次存放于一个一维数组B中。

3.11请写算法,该算法将一个n阶矩阵A主对角线以下的所有元素(包括主对角线上的元素)按照行序为主序方式依次存放于一个一维数组B中。

3.12已知n阶对称矩阵A的下三角部分元素按照行序为主序方式依次存放于一个一维数组B[m]中,请写出输出该对称矩阵的算法。

3.13已知某二维数组A[n][n]按照行序为主序方式依次为每个数组元素获取值,请写一算法,求该数组两条对角线上的元素之乘积。

3.14已知二维数组A[m][n],请写一算法,求出该数组最外围一圈的元素之和。

已知二维数组A[n][n],请写一时间复杂度为O

(1)的算法,将该数组按照顺时针方向旋转若稀疏矩阵采用三元组表表示,请写出求两个具有相同行、列数的稀疏矩阵相加的算法。

3.17若在m*n阶的矩阵A中有一元素Aij满足条件:

Aij既是第i行元素的最小值,同时又是第j列元素的最大值,此时称Aij为A的鞍点。

试写出求矩阵鞍点的算法。

若矩阵中不存在鞍点,应给出相应信息。

3.18编写一个将十字链表表示的矩阵A转置的算法,转置的结果仍采用十字链表表示。

3.19若稀疏矩阵采用十字链表表示,请设计两个稀疏矩阵进行相乘运算的算法,即已知A矩阵与B矩阵,求矩阵C=A*B,并且要求C也采用十字链表表示。

3.20试设计一个算法,将数组A[n]中的元素循环右移k位,要求只用一个元素大小的附加空间。

3.21试设计一个时间复杂度为O(n)的算法,该算法将数组A[n]中的元素循环右移k位,要求采用尽可能少的附加空间。

3.22n阶三对角矩阵A按行序为主序分配方式把所有非零元素存放于数组B[3n—2]中,Aij存放于B[0]中,请设计一个算法以确定数组B中元素~的值(1≤i,j≤n)。

3.23已知存放整型数据的一维数组A[n],请写一时间复杂度为O(n)的算法,该算法将数组调整为左右两部分,使得左边所有元素均为奇数,右边所有元素均为偶数。

3.24已知具有n个数组元素的一维数组A,请写一算法,将该数组中所有值为0的元素都依次移到数组的前端A[i](0≤i≤n-1)。

历年试题

1.执行下列程序段后,串X的值为(   )

S=〞abcdefgh〞;T=〞xyzw〞;

substr(X,S,2,strlen(T));

substr(Y,S,stelen(T),2);

strcat(X,Y);

A.〞cdefgh〞B.〞cdxyzw〞

C.〞cdefxy〞D.〞cdefef〞

2.多维数组之所以有行优先顺序和列优先顺序两种存储方式是因为(   )

A.数组的元素处在行和列两个关系中B.数组的元素必须从左到右顺序排列

C.数组的元素之间存在次序关系D.数组是多维结构,内存是一维结构

3.从广义表LS=((p,q),r,s)中分解出原子q的运算是(   )

A.tail(head(LS))B.head(tail(head(LS)))

C.head(tail(LS))D.tail(tail(head(LS)))

4.数组通常具有两种基本运算,即(   )

A.创建和删除B.索引和修改

C.读和写D.排序和查找

5.设有一5阶上三角矩阵A[1..5,1..5],现将其上三角中的元素按列优先顺序存放在一堆数组B[1..15]中。

已知B[1]的地址为100,每个元素占用2个存储单元,则A[3,4]的地址为(   )

A.116B.118C.120D.122

6.为查找某一特定单词在文本中出现的位置,可应用的串运算是()

A.插入B.删除C.串联接D.子串定位

7.已知函数Sub(s,i,j)的功能是返回串s中从第i个字符起长度为j的子串,函数Scopy(s,t)的功能为复制串t到s。

若字符串S=″SCIENCESTUDY″,则调用函数Scopy(P,Sub(S,1,7))后得到()

A.P=″SCIENCE″B.P=″STUDY″

C.S=″SCIENCE″D.S=″STUDY″

8.三维数组A[4][5][6]按行优先存储方法存储在内存中,若每个元素占2个存储单元,且数组中第一个元素的存储地址为120,则元素A[3][4][5]的存储地址为()

A.356B.358C.360D.362

9.串S=″Iamaworker″的长度是________。

10.假设一个10阶的下三角矩阵A按列优顺序压缩存储在一维数组C中,则C数组的大小应为________。

11、二维数组X的行下标范围是0~5,列下标范围是1~8,每个数组元素占六个字节,则该数组的体积为__A__个字节,若已知X的最后一个元素的起始字节地址为382,则X的首地址(即第一个元素的起始字节地址)为__B__,记为Xd。

若按行存储,则X[1,5]的起始地址是__C__,结束字节地址是___D__。

若按列存储,则X[4,8]的起始字节地址为__E__。

供选择的答案:

A:

①210②240③288④294

B:

①0②6③94④100

C:

①Xd+24②Xd+72③Xd+78④Xd+144

D:

①Xd+29②Xd+77③Xd+83④Xd+147

E:

①Xd+186②Xd+234③Xd+270④Xd+276

12、有一个二维数组A,行下标的范围是1~6,列下标的范围是0~7,每个数组元素用相邻的6个字节存储,存储器按字节编址。

那么,这个数组的体积是_A_个字节。

假设存储数组元素A[1,0]的第一个字节的地址是0,则存储数组A的最后一个元素的第一个字节的地址是_B_。

若按行存储,则A[2,4]的第一个字节的地址是_C_。

若按列存储,则A[5,7]的第一个字节的地址是_D_。

就一般情况而言,当_E_时,按行存储的A[5,7]的第一个字节的地址是_D_。

就一般情况而言,当_E_时,按行存储的A[I,J]地址与按列存储的A[J,I]地址相等。

供选择的答案:

A~D:

①12    ②66③72④96

⑤114⑥120⑦156   ⑧234

   ⑨276    ⑩282⑾283⑿288

E:

  ①行与列的上界相同         ②行与列的下界相同

③行与列的上界相同且行与列的下界相同

   ④行的元素个数与列的元素的个数相同

13、设W为一个二维数组,其每个数据元素Wij占用6个字节,行下标i从0到8,列下标j从2到5,则二维数组W的数据元素共占用_A_个字节。

W中第6行的元素和第4列的元素共占用_B_个字节。

若按行顺序存放二维数组W,其起始地址的字节号为100,则二维数组W的最后一个数据元素的起始地址的字节号为_C_,数据元素W34的起始地址号为_D_,而数据元素W22的起始地址与当W按列顺序存放时数据元素_E_的起始地址相同。

供选择的答案

A:

①480②192③216④144

B:

①78②72③66④84

C:

①310②311③315④314

D:

①179②178③184④185

E:

①W05②W28③W52④W82

14、已知一个6行5列的稀疏矩阵中非零元的值分别为:

-90,41,-76,28,-54,65和-8,它们在矩阵中的列号依次为:

1,4,5,1,2,4和5。

当以带行表的三元组表作存储结构时,其行表RowTab中的值依次为0,0,2,2,3和5。

请写出该稀疏矩阵(注:

矩阵元素的行列下标均从1开始)。

15、已知串的存储结构为动态存储分配的顺序串。

阅读下列算法,并回答问题:

(1)写出执行函数调用strc(s,r)的返回结果,其中s=〃aba〃,r=〃abababa〃;

(2)简述函数strc的功能。

intstrc(HString*sub,HString*str)

{

inti=0,j,k,count=0;

while(ilength–sub->length+1)

{

j=i;k=0;

while(klength&&str->ch[j]==sub->ch[k])

{

j++;k++;

}

if(k==sub->length)

{count++;i=j-sub->length+1;}

elsei++;

}

returncount;

}

16、阅读以下程序说明和C程序,将应填入程序中(n)处的字句,写在答卷的对应栏内。

[程序说明]

已知某数的前二项为2和3,其后继项根据当前最后二项的乘积按下列规则生成

 ⑴若乘积为一位数,则该乘积即为数列的后继项;

 ⑵若乘积为二位数,则该乘积的十位数和个位数依次作为数

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1