收藏 分享(赏)

《数据结构A》第04章.ppt

上传人:jw66tk88 文档编号:8117850 上传时间:2019-06-09 格式:PPT 页数:67 大小:577.50KB
下载 相关 举报
《数据结构A》第04章.ppt_第1页
第1页 / 共67页
《数据结构A》第04章.ppt_第2页
第2页 / 共67页
《数据结构A》第04章.ppt_第3页
第3页 / 共67页
《数据结构A》第04章.ppt_第4页
第4页 / 共67页
《数据结构A》第04章.ppt_第5页
第5页 / 共67页
点击查看更多>>
资源描述

1、南京邮电大学计算机学院 2006年9月,数据结构,Data Structures in C+,南京邮电大学计算机学院 2006年9月,第4章 数组和字符串,南京邮电大学计算机学院 2006年9月,4.1 数组 4.2 特殊矩阵 4.3 稀疏矩阵 4.4 字符串,南京邮电大学计算机学院 2006年9月,4.1 数组,南京邮电大学计算机学院 2006年9月,数组是非常有用的数据结构,几乎所有的高级程序设计语言中都提供了数组类型。 本章从数据结构的角度介绍数组的概念、它的抽象数据类型和类的定义。在自然科学中,矩阵常被用于解决许多实际问题。由于稀疏矩阵在存储表示上的特点,本章也对它进行专门的讨论。,南

2、京邮电大学计算机学院 2006年9月,数组的定义数组是下标index 和值value 组成的序对的集合。 (index,value),一维数组: A = (0,15),(1,24),(2,33),(3,21),4.1.1 数组ADT,南京邮电大学计算机学院 2006年9月,数组抽象数据类型 ADT Array Data :下标index和元素值value组成的数据对集合,其中任意两个数据对的下标index各不相同。 Operations:Create(): 建立一个数组。Retrieve(i): 返回下标为i的元素值。Store(i,x): 将下标为i的数据对的值置为x。 ;,南京邮电大学计算

3、机学院 2006年9月,一维数组的顺序表示二维数组的顺序表示多维数组的顺序表示,4.1.2 数组的顺序表示,南京邮电大学计算机学院 2006年9月,一维数组的顺序表示Loc(ai)=Loc(a0)+i*Li=0,1,2,n-1 基地址:Loc(a0) 每个元素占L个存储单元。,南京邮电大学计算机学院 2006年9月,二维数组的顺序表示二维数组amn映射到一维的存储空间时有两种顺序:行优先和列优先。大多数语言如PASCAL、BASIC、C、C+等都是按行优先顺序存储的,FORTRAN是按列优先顺序存储的。,南京邮电大学计算机学院 2006年9月,loc(aij)=loc(a00)+(i*n+j)

4、*k (0im; 0jn),南京邮电大学计算机学院 2006年9月,loc(aij)=loc(a00)+(j*m+i)*k,南京邮电大学计算机学院 2006年9月,多维数组的顺序表示推广到多维数组am1m2 mn,数组元素ai1i2 in的存储地址为 : loc(ai1i2 in)=loc(a00)+ ( i1* m2 * m3 * mn+ i2* m3 * m4 * mn+ + in-1* mn+ in ) * k =,南京邮电大学计算机学院 2006年9月,用C+的模板类定义的一维数组抽象数据类型。公有成员函数包括:构造函数析构函数重载下标操作符:重载下标操作符用来返回指向第i个元素的引用

5、重载数组赋值: 赋值操作符实现数组的整体赋值。,4.1.3 一维数组的C+类,南京邮电大学计算机学院 2006年9月,#include template class Array1D public:Array1D(int sz=0); Array1D() delete elements; T,南京邮电大学计算机学院 2006年9月,template Array1D:Array1D(int sz) assert(sz=0); /越界检查size=sz;elements=new Tsz; ,南京邮电大学计算机学院 2006年9月,template T ,南京邮电大学计算机学院 2006年9月,tem

6、plate Array1D ,南京邮电大学计算机学院 2006年9月,template Istream ,南京邮电大学计算机学院 2006年9月,#include “array1d.h“ void main() Array1D a(5),b(8);Array1D c; /采用缺省长度0cina; coutb; cout“b “b;cout“c “c;cout“a0=“a0“;“b5=“b5endl;c=b; cout“c=b, c “c;b=a; cout“b=a, b “b; ,南京邮电大学计算机学院 2006年9月,4.2 特殊矩阵,对称矩阵和三角矩阵 在nn的矩阵A中,若aij=aji(

7、0i,jn),则称其为n阶对称矩阵。 对于对称矩阵,可以只存储上三角(或下三角)中的元素(包括对角线上的元素)。,南京邮电大学计算机学院 2006年9月,0 1k,4.2.1 对称矩阵,南京邮电大学计算机学院 2006年9月,4.3 稀疏矩阵,稀疏矩阵:大多数元素为零的矩阵称为稀疏矩阵。对于稀疏矩阵可只存非零元素。,南京邮电大学计算机学院 2006年9月,ADT SparseMatrix 数据:绝大多数元素为零的矩阵。 运算:Create();建立一个稀疏矩阵。Destroy():撤消一个稀疏矩阵。Add(B,C):当前矩阵对象与B相加,C中返回相加和。Mul(B,C):当前矩阵对象与B相乘,

8、C中返回相乘积。Transpose(B): B中返回当前矩阵对象的转置矩阵。 ,4.3.1 稀疏矩阵ADT,南京邮电大学计算机学院 2006年9月,稀疏矩阵的C+类 template class SparseMatrix public:SparseMatrix(int maxRowSize, int maxColSize);SparseMatrix();virtual void Add(const SparseMatrix ,南京邮电大学计算机学院 2006年9月,三元组表示法按照压缩存储的思想,稀疏矩阵Am n中的每一个非零元素 aij 的值、行号和列号可以用一个三元组( i, j, v)表

9、示。三元组可以按行或按列的顺序存储。,4.3.2 稀疏矩阵的顺序表示,南京邮电大学计算机学院 2006年9月,三元组按行顺序存储,南京邮电大学计算机学院 2006年9月,三元组的Term类 template struct Terms int row,col;T value; ;,南京邮电大学计算机学院 2006年9月,行三元组表的C+类 template class SeqTriple public:SeqTriple(int mSize);SeqTriple() delete trip; ;void Add(const SeqTriple ,南京邮电大学计算机学院 2006年9月,priva

10、te:int maxSize; /最大元素个数int m,n,t; / 行数、列数和非零元素个数Term *trip; /动态一维数组的指针 ;,南京邮电大学计算机学院 2006年9月,矩阵转置,南京邮电大学计算机学院 2006年9月,普通矩阵转置:for (int i=0; im; i+)for (int j=0; jn; j+)Bji=Aij;时间复杂度为O(mn)。,南京邮电大学计算机学院 2006年9月,在三元组表示下实现矩阵转置如果稀疏矩阵Am n用行三元组A表示,转置矩阵保存在一维数组B中,则B应仍为行三元组。,南京邮电大学计算机学院 2006年9月,方法一:将三元组A中所有元素的

11、行、列号交换后保存到B中;然后按B中的行号排序。这样,矩阵转置的时间就取决于选择的排序算法的时间。,A,B,B,南京邮电大学计算机学院 2006年9月,方法二:对数组A 扫描 n 遍,每扫描一遍找出 B 的一行元素,第 i 遍扫描得到 B 的第 i 行元素,依此存入B中。此方法的时间为 O( n * t ), t是A的长度。,A,B,南京邮电大学计算机学院 2006年9月,方法三:快速转置使用n个指针kn (n是矩阵的列数),指向A中每一列的第一个非零元素在B中的存放位置。,B,A,南京邮电大学计算机学院 2006年9月,计算 kiki可以简单地由下式计算。,南京邮电大学计算机学院 2006年

12、9月,for (int i=0; iCols; i+) numi=0; for (i=0; it; i+) numtripi.col+;,计算numi,南京邮电大学计算机学院 2006年9月,template void SeqTriple:Transpose(SeqTriple,南京邮电大学计算机学院 2006年9月,for(i=0; it; i+) int j=ktripi.col+; B.tripj.row=tripi.col; B.tripj.col=tripi.row;B.tripj.value=tripi.value;delete num; delete k; ,南京邮电大学计算机学

13、院 2006年9月,4.4 字符串,南京邮电大学计算机学院 2006年9月,4.4.1 字符串ADT,字符串的定义字符串(简称为串)是由n(0)个字符组成的有限序列。 S=“a0 a1 an1” ( n0 ) 其中,S 是串名,单引号括起来的字符序列是串S的值。n 是串中字符个数,又称串长度,n=0的串称为空串。 要注意区分空串和空白串。,南京邮电大学计算机学院 2006年9月,串中任意连续个字符组成的子序列称为该串的子串,包含子串的串称为 主串。通常以子串的首字符在主串中的位置作为子串在主串中的位置。S=abcabcaabcbcdeP=aabc,南京邮电大学计算机学院 2006年9月,ADT

14、 String 数据:字符串是由n(0)个字符组成的有限序列S=“a0a1an-1“,0in 。运算:Create():建立一个空串。Destroy():撤消一个串。Length():返回当前串对象的长度。Clear():置为空串。,南京邮电大学计算机学院 2006年9月,Assign(S):串S的值赋给当前串对象。 Concat(b):将串b连接在当前串对象之后。Insert(P,i):将串P插在当前串对象的位置i处。Delete(i,len):从当前串对象的位置i起删除len个字符。Substr(i,len):返回当前串对象中,从位置i开始的len个字符组成的子串。Find(i,P):返回

15、子串P在当前串对象中的位置。若当前串对象不包含串P,则返回-1。 ,南京邮电大学计算机学院 2006年9月,4.4.2 字符串的存储表示,顺序存储表示串的顺序表示可用C+的一维字符数组来描述。 #include char s20=“cdabcde“;,南京邮电大学计算机学院 2006年9月,链接存储表示,南京邮电大学计算机学院 2006年9月,#include class String public:String();String(const char *p);String() delete str; ;int Find(int i, String ,南京邮电大学计算机学院 2006年9月,S

16、tring:String(const char *p) n=strlen(p);str=new charn+1;strcpy(str, p); ,南京邮电大学计算机学院 2006年9月,4.4.3 简单模式匹配算法,设有两个字符串s和p,在串s中找串p的过程被称为模式匹配 。这里s为主串,p为子串,又称为模式。,南京邮电大学计算机学院 2006年9月,#include #include void main() char p10=“abc“,s20=“cdabcde“,*t;if (t=strstr(s,p)cout“The string from strstr is:“tendl;else c

17、out“The pattern was not found with strstr“endl; 运行结果:abcde,南京邮电大学计算机学院 2006年9月,简单模式匹配,南京邮电大学计算机学院 2006年9月,南京邮电大学计算机学院 2006年9月,int String:Find(int i, String ,南京邮电大学计算机学院 2006年9月,char *pp=P.str, char *t=str+i; while (*pp!=x0 ,南京邮电大学计算机学院 2006年9月,简单匹配算法的渐近时间复杂度:设主串和模式串的长度为n和m,while循环最多进行n-m+1趟,每趟最多比较m次

18、,这样总的比较次数最多是(n-m+1)m。由于(n-m+1)m(n-m+m)m=nm,因此简单模式匹配算法在最坏情况下的时间复杂度是O(nm)。,南京邮电大学计算机学院 2006年9月,4.4.4 模式匹配的KMP算法,S=“a b a a b a a b a b a b b” P=“a b a a b a b a”a a b a b a a b a b a,南京邮电大学计算机学院 2006年9月,失败函数的定义 设有长度为m的模式串pp0 p1 pm1,失败函数f定义为:,南京邮电大学计算机学院 2006年9月,从定义计算失败函数,南京邮电大学计算机学院 2006年9月,KMP算法,南京邮电

19、大学计算机学院 2006年9月,KMP匹配算法 int String:FindKMP(int i, String ,南京邮电大学计算机学院 2006年9月,int j=0, m=P.n;while (in ,南京邮电大学计算机学院 2006年9月,时间分析 语句“if (j=-1|stri=p.strj)”的执行次数 if语句有两个分支: (1)i+; j+; (2)j=p.fj;KMP算法的时间复杂度为O(n)。,南京邮电大学计算机学院 2006年9月,失败函数递推计算公式,其中,f1(j)=f(j), fm(j)=f(fm-1(j),南京邮电大学计算机学院 2006年9月,void String:Fail() / 计算失败函数int j=0,k=-1; f0=-1;while (jn)if (k=-1) | (strj=strk)j+; k+; fj=k; else k=fk; ,递推计算失败函数,南京邮电大学计算机学院 2006年9月,计算失败函数的改进方法,void String:Fail () int j=0,k=-1;f0=-1;while (jn)if (k=-1) | (strj=strk)j+; k+; if (strj=strk) fj=fk; else fj=k; else k=fk; ,南京邮电大学计算机学院 2006年9月,

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

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报