数据结构4数组串广义表

合集下载

数据结构第4章 数组和广义表

数据结构第4章  数组和广义表

第4章数组和广义表【例4-1】二维数组A的每一个元素是由6个字符组成的串,其行下标i=0,1,…,8,列下标j=1,2,…,10。

若A以行为主序存储元素,A[8][5]的物理地址与当A按列为主序存储时的元素()的物理地址相同。

设每个字符占一个字节。

A.A[8][5] B.A[3][10] C.A[5][8] D.A[0][9]解:二维数A是一个9行10列的矩阵,即A[9][10]。

按行存储时,A[8][5]是第85个元素存储的元素。

而按列存储时,第85个存储的元素是A[3][10]。

即正确答案为B。

【例4-2】若对n阶对称矩阵A以行序为主序方式将其下三角形的元素(包括主对角线上所有元素)依次存放于一维数组B[n(n+1)/2]中,则在B中确定的位置k的关系为()。

A.jii+-2)1(*B.ijj+-2)1(*C.jii++2)1(*D.ijj++2)1(*解:如果a ij按行存储,那么它的前面有i-1行,其有元素个数为:1+2+3+…+(i-1)=i(i-1)/2。

同时它又是所在行的第j列,因此它排列的顺序还得加上j,一维数组B[n(n+1)/2]中的位置k与其下标的关系是:jii+-2)1(*。

因此答案为A。

【例4-3】已知n阶下三角矩阵A,按照压缩存储的思想,可以将其主对角线以下所有元素(包括主对角线上元素)依次存放于一维数组B中。

请写出从第一列开始以列序为主序分配方式时在B中确定元素a ij的存放位置的公式。

解:如果a ij按列存储,那么它的前面有j-1列,共有元素:n+(n-1)+(n-2)+ …+[n-(j-2)]=(j-1)*n-2)1)(2(--jj而它又是所在列的第i行,因此在它前的元素个数还得加上i。

因此它在一维数组B中的存储顺序为:(j-1)*n-2)1)(2(--jj+i【例4-4】已知广义表L=((x,y,z),a,(u,t,w)),从L表中取出的原子项ASCII码最大的运算是()。

数据结构答案第4章

数据结构答案第4章

第 4 章广义线性表——多维数组和广义表2005-07-14第 4 章广义线性表——多维数组和广义表课后习题讲解1. 填空⑴数组通常只有两种运算:()和(),这决定了数组通常采用()结构来实现存储。

【解答】存取,修改,顺序存储【分析】数组是一个具有固定格式和数量的数据集合,在数组上一般不能做插入、删除元素的操作。

除了初始化和销毁之外,在数组中通常只有存取和修改两种操作。

⑵二维数组A中行下标从10到20,列下标从5到10,按行优先存储,每个元素占4个存储单元,A[10][5]的存储地址是1000,则元素A[15][10]的存储地址是()。

【解答】1140【分析】数组A中每行共有6个元素,元素A[15][10]的前面共存储了(15-10)×6+5个元素,每个元素占4个存储单元,所以,其存储地址是1000+140=1140。

⑶设有一个10阶的对称矩阵A采用压缩存储,A[0][0]为第一个元素,其存储地址为d,每个元素占1个存储单元,则元素A[8][5]的存储地址为()。

【解答】d+41【分析】元素A[8][5]的前面共存储了(1+2+…+8)+5=41个元素。

⑷稀疏矩阵一般压缩存储方法有两种,分别是()和()。

【解答】三元组顺序表,十字链表⑸广义表((a), (((b),c)),(d))的长度是(),深度是(),表头是(),表尾是()。

【解答】3,4,(a),((((b),c)),(d))⑹已知广义表LS=(a,(b,c,d),e),用Head和Tail函数取出LS中原子b的运算是()。

【解答】Head(Head(Tail(LS)))2. 选择题⑴二维数组A的每个元素是由6个字符组成的串,行下标的范围从0~8,列下标的范围是从0~9,则存放A至少需要()个字节,A的第8列和第5行共占()个字节,若A按行优先方式存储,元素A[8][5]的起始地址与当A按列优先方式存储时的()元素的起始地址一致。

第四、五章串、数组和广义表练习题答案

第四、五章串、数组和广义表练习题答案

第四、五章串、数组和广义表练习题答案一.填空题1. 不包含任何字符(长度为0)的串称为空串;由一个或多个空格(仅由空格符)组成的串称为空白串。

2. 设S=“A;/document/Mary.doc”,则strlen(s)= 20 , “/”的字符定位的位置为3。

3. 子串的定位运算称为串的模式匹配;被匹配的主串称为目标串,子串称为模式。

4. 设目标T=”abccdcdccbaa”,模式P=“cdcc”,则第 6 次匹配成功。

5. 若n为主串长,m为子串长,则串的古典(朴素)匹配算法最坏的情况下需要比较字符的总次数为(n-m+1)*m。

6. 假设有二维数组A6×8,每个元素用相邻的6个字节存储,存储器按字节编址。

已知A的起始存储位置(基地址)为1000,则数组A的体积(存储量)为288 B ;末尾元素A57的第一个字节地址为1282 ;若按行存储时,元素A14的第一个字节地址为(8+4)×6+1000=1072 ;若按列存储时,元素A47的第一个字节地址为(6×7+4)×6+1000)=1276 。

(注:数组是从0行0列还是从1行1列计算起呢?由末单元为A57可知,是从0行0列开始!)7. 〖00年计算机系考研题〗设数组a[1…60, 1…70]的基地址为2048,每个元素占2个存储单元,若以列序为主序顺序存储,则元素a[32,58]的存储地址为8950 。

答:不考虑0行0列,利用列优先公式:LOC(a ij)=LOC(a c1,c2)+[(j-c2)*(d1-c1+1)+i-c1)]*L 得:LOC(a32,58)=2048+[(58-1)*(60-1+1)+32-1]]*2=89508. 三元素组表中的每个结点对应于稀疏矩阵的一个非零元素,它包含有三个数据项,分别表示该元素的行下标、列下标和元素值。

9.求下列广义表操作的结果:(1)GetHead【((a,b),(c,d))】=== (a, b) ; //头元素不必加括号(2)GetHead【GetTail【((a,b),(c,d))】】=== (c,d) ;(3)GetHead【GetTail【GetHead【((a,b),(c,d))】】】=== b ;(4)GetTail【GetHead【GetTail【((a,b),(c,d))】】】=== (d);10.C语言规定,字符串常量按_字符数组_____处理,它的值在程序的执行过程中是不能改变的。

数据结构答案第4章

数据结构答案第4章
【解答】设稀疏矩阵为m行n列,如果采用二维数组存储,其空间复杂度为O(m×n);因为要将所有的矩阵元素累加起来,所以,需要用一个两层的嵌套循环,其时间复杂度亦为O(m×n)。如果采用三元组顺序表进行压缩存储,假设矩阵中有t个非零元素,其空间复杂度为O(t),将所有的矩阵元素累加起来只需将三元组顺序表扫描一遍,其时间复杂度亦为O(t)。当t<<m×n时,采用三元组顺序表存储可获得较好的时、空性能。
⑴二维数组A的每个元素是由6个字符组成的串,行下标的范围从0~8,列下标的范围是从0~9,则存放A至少需要()个字节,A的第8列和第5行共占()个字节,若A按行优先方式存储,元素A[8][5]的起始地址与当A按列优先方式存储时的()元素的起始地址一致。
A 90 B 180 C 240 D 540 E 108 F 114 G 54
⑵二维数组A中行下标从10到20,列下标从5到10,按行优先存储,每个元素占4个存储单元,A[10][5]的存储地址是1000,则元素A[15][10]的存储地址是()。
【解答】1140
【分析】数组A中每行共有6个元素,元素A[15][10]的前面共存储了(15-10)×6+5个元素,每个元素占4个存储单元,所以,其存储地址是1000+140=1140。
Head(Tail(Tail(Head(ST))))=奖金
⑵工资表ST的头尾表示法如图4-7所示。7.若在矩阵A中存在一个元素ai,j(0≤i≤n-1,0≤j≤m-1),该元素是第i行元素中最小值且又是第j列元素中最大值,则称此元素为该矩阵的一个马鞍点。假设以二维数组存储矩阵A,试设计一个求该矩阵所有马鞍点的算法,并分析最坏情况下的时间复杂度。
⑵因为k和i, j之间是一一对应的关系,k+1是当前非零元素的个数,整除即为其所在行号,取余表示当前行中第几个非零元素,加上前面零元素所在列数就是当前列号,即:

考研《数据结构》复习知识点归纳

考研《数据结构》复习知识点归纳

《数据结构》复习重点知识点归纳一.数据结构的章节结构及重点构成数据结构学科的章节划分基本上为:概论,线性表,栈和队列,串,多维数组和广义表,树和二叉树,图,查找,内排,外排,文件,动态存储分配。

对于绝大多数的学校而言,“外排,文件,动态存储分配”三章基本上是不考的,在大多数高校的计算机本科教学过程中,这三章也是基本上不作讲授的。

所以,大家在这三章上可以不必花费过多的精力,只要知道基本的概念即可。

但是,对于报考名校特别是该校又有在试卷中对这三章进行过考核的历史,那么这部分朋友就要留意这三章了。

按照以上我们给出的章节以及对后三章的介绍,数据结构的章节比重大致为:·概论:内容很少,概念简单,分数大多只有几分,有的学校甚至不考。

·线性表:基础章节,必考内容之一。

考题多数为基本概念题,名校考题中,鲜有大型算法设计题,如果有,也是与其它章节内容相结合。

·栈和队列:基础章节,容易出基本概念题,必考内容之一。

而栈常与其它章节配合考查,也常与递归等概念相联系进行考查。

·串:基础章节,概念较为简单。

专门针对于此章的大型算法设计题很少,较常见的是根据KMP进行算法分析。

·多维数组及广义表:基础章节,基于数组的算法题也是常见的,分数比例波动较大,是出题的“可选单元”或“侯补单元”。

一般如果要出题,多数不会作为大题出。

数组常与“查找,排序”等章节结合来作为大题考查。

·树和二叉树:重点难点章节,各校必考章节。

各校在此章出题的不同之处在于,是否在本章中出一到两道大的算法设计题。

通过对多所学校的试卷分析,绝大多数学校在本章都曾有过出大型算法设计题的历史。

·图:重点难点章节,名校尤爱考。

如果作为重点来考,则多出现于分析与设计题型当中,可与树一章共同构成算法设计大题的题型设计。

·查找:重点难点章节,概念较多,联系较为紧密,容易混淆。

出题时可以作为分析型题目给出,在基本概念型题目中也较为常见。

数据结构第4章数组和串

数据结构第4章数组和串
1
● 教学目的:理解抽象数据类型数组的概念, 掌握数组的不同存储结构的实现及应用,了 解广义表的相关概念,掌握串的逻辑结构、 存储结构及其基本运算。
● 教学重点:数作在不同 存储结构上的实现。 ● 教学难点:带状矩阵的压缩存储;稀疏矩 阵的三元组表实现及其转置算法,堆结构的 串操作实现;串的模式匹配算法。
矩阵的压缩存储
printf("Array a:\n"); k=0; for(i=0;i<N;i++)//输出矩阵A { for(j=0;j<N;j++) if(i<j)printf("%5d",sa[M-1]); else printf("%5d",sa[i*(i+1)/2+j]); printf("\n"); } printf("Array b:\n"); k=0; for(i=0;i<N;i++)//输出矩阵B { for(j=0;j<N;j++) if(i>j)printf("%5d",sb[M-1]); else printf("%5d",sb[j*(j+1)/2+i]); printf("\n"); }}
矩阵的压缩存储
由此可见,要唯一表示一个稀疏矩阵,在存储三 元组表的同时还需存储该矩阵总的行数、列数及非 零元个数。 练习:写出图4-9(a)所示稀疏矩阵的三元组表。
三元组表(也是线性表)的存储方式主要有两种: 顺序存储和链式存储,从而可引出稀疏矩阵的两种 压缩存储方法:三元组顺序表和十字链表。 3、三元组顺序表
矩阵的压缩存储

《数据结构——用C语言描述(第二版)》第5章 数组和广义表

《数据结构——用C语言描述(第二版)》第5章  数组和广义表
是指矩阵的下三角(不含对角线)中的元素均为常数C或零的n阶矩阵,下 三角矩阵则与之相反,如图5.3所示。
第五章 数组和广义表
在压缩存储时,矩阵中值相同的元素C可共享一个存储空间,元素 为零则可不必分配空间,而其余的元素有 n(n+1)/2个,因此三角矩阵 可用一维数组M[n×(n+1)/2+1]来存储,其中常数C放在数组的最后一 个下标变量中。
假设A和B矩阵分别用matrix型指针变量a和b表示,矩阵的转置可以 按以下进行:由于B的行是A的列,所以可按照b->data三元组表的次序在 a->data中找到相应的三元组进行转置,即可按a->data的列序转置,所得 到的转置矩阵B的三元组表b->data必定是按行优先存放的。因此,可以对 三元组表a->data从第一行起扫描,找到A的每一列中所有的非零元素,就 可以实现转置。
LOC ( aij ) =LOC ( a00) +(i×n+j) × c 同理可推导出以列为主序优先存储时数据元素a i j 的存储地址,其计算公式 为:
LOC( a i j ) =LOC( a00 ) +( j × n +i ) × c 对于三维数组Am×n×p而言,若以行为主序优先存储时,则其数据元 素aijk的存储地址可为: LOC ( a i j k) =LOC ( a000) +[ i × m×p +j ×p +k] × c 对于一般的二维数组A[c1…d1,c2…d2]而言,此处c1,c2的值不一定是 0,a i j 的地址为: LOC ( a i j ) =LOC ( a c 1 c 2 ) +[ ( i – c 1 )* ( d 2 – c 2 +1) +j – c 2 ] * c

(完整word版)数据结构(c语言版)课后习题答案完整版资料

(完整word版)数据结构(c语言版)课后习题答案完整版资料

第1章绪论5.选择题:CCBDCA6.试分析下面各程序段的时间复杂度。

(1)O(1)(2)O(m*n)(3)O(n2)(4)O(log3n)(5)因为x++共执行了n—1+n—2+……+1= n(n—1)/2,所以执行时间为O(n2)(6)O(n)第2章线性表1.选择题babadbcabdcddac2.算法设计题(6)设计一个算法,通过一趟遍历在单链表中确定值最大的结点。

ElemType Max (LinkList L ){if(L—〉next==NULL) return NULL;pmax=L-〉next;//假定第一个结点中数据具有最大值p=L-〉next—>next;while(p != NULL ){//如果下一个结点存在if(p->data > pmax—>data) pmax=p;p=p->next;}return pmax-〉data;(7)设计一个算法,通过遍历一趟,将链表中所有结点的链接方向逆转,仍利用原表的存储空间.void inverse(LinkList &L) {// 逆置带头结点的单链表Lp=L-〉next;L->next=NULL;while (p){q=p—>next;// q指向*p的后继p->next=L—>next;L—>next=p; // *p插入在头结点之后p = q;}}(10)已知长度为n的线性表A采用顺序存储结构,请写一时间复杂度为O(n)、空间复杂度为O(1)的算法,该算法删除线性表中所有值为item的数据元素.[题目分析]在顺序存储的线性表上删除元素,通常要涉及到一系列元素的移动(删第i个元素,第i+1至第n个元素要依次前移)。

本题要求删除线性表中所有值为item的数据元素,并未要求元素间的相对位置不变。

因此可以考虑设头尾两个指针(i=1,j=n),从两端向中间移动,凡遇到值item的数据元素时,直接将右端元素左移至值为item的数据元素位置。

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

If(terms>0) { for(int i=0;i<cols;i++) rowSize[i]=0;//初始 for( i=0;i<terms;i++) rowSize[smArray[i].col]++; rowSart[0]=0; for( i=1;i<cols;i++) rowSart[i]=rowSize[i-1]+rowSize[i]; //位置计算完成
While(current<terms){ int RowA=smArray[current].row; for(int i=0;i<b.cols;i++) temp[i]=0; //开始计算一行数据 while(current<terms&& smArray[current].row== RowA){ int colA= smArray[current].col; for(i=rowStart(colA);i<rowStart(colA+1);i++){ int colB= b.smArray[current].col ; temp[colB]+= smArray[current].value*b. mArray[i].value; } current++; } //一行计算完成
用c++来定义数组

Class int_arry{ Private: int *elements; int arraySize; void getArray(); //分派空间 public: int_array(int size=defaultSize) ;//构造函数 int_array(const int_array &x) ;//拷贝构造

functions:
返回数组的长度,即元素个数 下标函数,返回数组在下标i (0≤i≤n)处 的值。(抽取操作)
lengt给前面的位置。
=
resize
数组复制函数,把后面数组的信息复制到q 前面的数组。
重新定义(修改)数组的大小。
End Array 浮点数的矩阵、整数的矩阵、复数的 矩阵、实数的矩阵。。。。。。

Class float_arry{ Private: float *elements; float arraySize; void getArray(); //分派空间 public: float_array(int size=defaultSize) ; //构造函数 float_array(const int_array &x) ; //拷贝构造
};
2.4.2稀疏矩阵的压缩表示法
例:999条线路把1000台计算机连成网络。 1000x1000稀疏矩阵。(1998个1,其余0) 解决方案:三元数组(row,col,value)序列。 Templete <class T> class SquarseMatrix<T>; Templete <class T> class Trituple{ Friend class SquarseMatrix<T>; Privite: Int row,col; T value; }
for(int i=0;i<b.cols;i++) rowSize[i]=0;//初始 for( i=0;i<b.terms;i++) rowSize[b.smArray[i].row]++; rowSart[0]=0; for( i=1;i<b.rows;i++) rowSart[i]=rowSize[i-1]+rowSize[i-1]; //位置计算完成 Int current=0; //A的指针 Int lastInResule=-1; //新结果矩阵的指针18
第二章 数组

2.1 作为抽象数据类型的数组
2.2
特殊矩阵 2.3 稀疏矩阵 2.4 字符串 广义表




2.1 作为抽象数据类型的数组 数组的定义:具有相同数据类型的n(n≥0) 各元素的有限序列。通过直接操作下标来完 成数组操作运算。 以抽象数据类型的形式讨论数组的定义和 实现,可以让我们加深对数组类型的理解。 数组的逻辑结构和物理结构都是顺序结构。 ADT array IS Data: Float *element; Int arraySize;
if(tems>0){ int currentB=0; for(int k=0;k<Cols;k++) for(int i=0;i<terms;i++) if(smArray[i].col==k){ b. smArray[currentB].row=k; b. smArray[currentB].col=smArray[i].row; b. smArray[currentB].value=smArray[i].value; currentB++; } } return b; }
模板类
模板类的定义形式: templete <class T> class class_name{ ……… 返回类型 函数名(参数) }; //函数在体外实现必须是 Templete <class type> 返回类型 class_name <T>::函数名(参数) {函数的具体实现}

关于数组的几个结论
~float_array() ; //析构函数 float_array & operator = (const float_array &A) //数组复制函数 float & operator [ ](int i) ; //返回下标处的值 float * operator *() const; //指针转换 Int length()const; //返回数组的长度 Void reSize(int s); //修改数组的长度 }; //浮点数组的定义


Templete <class T> class SqarseMatrix{ privite: int rows,cols,terms,MaxTerms; trituple <T> sm[maxTerms], public: SquarseMatrix(int MaxRow,int MaxCol); SquarseMatrix <T> Transpose(); SquarseMatrix <T>Add(SquarseMatrix <T> b); SquarseMatrix <T>Multiply(SquarseMatrix <T> b);
};
稀疏矩阵的算法
1.转置算法 A.先转,后排序。(用p20的排序方法, 算法的时间复杂性0(terms)+0(terms2)= 0(terms2) B.扫描法

扫描法软件实现

Templete <class T> class SqarseMatrix<T> class SqarseMatrix<T>::Transpose(){ SqarseMatrix<T> b(cols,rows,MaxTerms); b.rows=cols; b.cols=rows; b.Terms=terms; b.MaxTerms=MaxTerms; //b的初始化工作

Templete <class T> class SqarseMatrix<T> class SqarseMatrix<T>::Transpose(){ SqarseMatrix<T> b(cols,rows,MaxTerms); b.rows=cols; b.cols=rows; b.Terms=terms; b.MaxTerms=MaxTerms; //b的初始化工作 int *rowSize=new int[Cols]; int *rowStart=new int[Cols]; //分配辅助空间
for(i=0;i<terms;i++){ int j=rowStart[smArray[i].col]; b. smArray[j].row= smArray[i].col; b. smArray[j].col=smArray[i].row; b. smArray[j].value=smArray[i].value; rowStart[smArray[i].col]++; } } Delete [ ]rowSize; Delete [ ]rowStart; Return b; }
算法的程序实现

Templete <class T> SqarseMatrix<T> SqarseMatrix<T>::Multiply(SqarseMatrix<T> b){ if(cols!=b.ros) //precondition {cout<<„矩阵不相容,不能乘!<<endl; exit(1);} int *rowSize=new int[b.rows]; int *rowStart=new int[b.rows]; T *temp=new T[b.cols] ; //分配辅助空间 SqarseMatrix<T> result(cols,rows,MaxTerms); result.rows=a.rows; result.cols=b.cols; result.Terms=0; //初始化结果矩阵
相关文档
最新文档