数据结构电子教案深圳大学自动化ds_第1页
数据结构电子教案深圳大学自动化ds_第2页
数据结构电子教案深圳大学自动化ds_第3页
数据结构电子教案深圳大学自动化ds_第4页
数据结构电子教案深圳大学自动化ds_第5页
已阅读5页,还剩67页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第一章数据结构概念数据结构电子教案殷人昆王宏1第1页什么是数据结构抽象数据类型及面向对象概念算法定义模板算法简单性能分析与度量第一章数据结构概念2第2页“学生”表格3第3页“课程”表格4第4页学生(学号,姓名,性别,籍贯)课程(课程号,课程名,学分)选课(学号,课程号,成绩)

“选课单”包含以下信息

学号课程编号成绩时间

学生选课系统中实体组成网状关系5第5页UNIX文件系统系统结构图/(root)binlibuseretcmathdsswyintaoxieStack.cppQueue.cppTree.cpp6第6页数据(data)数据是信息载体,是描述客观事物数、字符、以及全部能输入到计算机中,被计算机程序识别和处理符号集合。数据分类:数值性数据非数值性数据7第7页姓名所在院系性别出生日期年月职务业绩数据元素(dataelement)数据基本单位。在计算机程序中常作为一个整体进行考虑和处理。有时一个数据元素能够由若干数据项(DataItem)组成。数据项是含有独立含义最小标识单位。数据元素又称为元素、结点、统计。8第8页什么是数据结构定义:由某一数据元素集合以及该集合中全部数据元素之间关系组成。记为:Data_Structure={D,R}其中,D是某一数据元素集合,R是该集合中全部数据元素之间关系有限集合。9第9页例:N个网点之间连通关系

树形关系网状关系15615243624310第10页数据结构是数据组织形式包含三个方面:数据元素间逻辑关系,即数据逻辑结构;数据元素及其关系在计算机存放内表示,即数据存放表示;数据运算,即对数据元素施加操作。11第11页数据逻辑结构数据逻辑结构从逻辑关系上描述数据,与数据存放无关;数据逻辑结构能够看作是从详细问题抽象出来数据模型;数据逻辑结构与数据元素本身形式、内容无关;数据逻辑结构与数据元素相对存放位置无关。12第12页数据逻辑结构分类线性结构

线性表非线性结构

树图(或网络)13第13页线性结构树形结构树二叉树二叉搜索树bindevetclibuser1413121123456789103158710119987456623131114第14页堆结构

“最大”堆“最小”堆12354871110291641012115123698715第15页图结构网络结构1254361133181466516192112563416第16页数据存放结构数据存放结构是逻辑结构用计算机语言实现;数据存放结构依赖于计算机语言。次序存放表示链接存放表示索引存放表示散列存放表示主要用于内存存放表示主要用于外存(文件)存放表示17第17页抽象数据类型及面向对象概念数据类型

定义:一组性质相同值集合,以及定义于这个值集合上一组操作总称.C语言中数据类型

charintfloatdoublevoid

字符型整型浮点型双精度型无值18第18页结构数据类型由基本数据类型或结构数据类型组成。结构数据类型由不一样成份类型组成。基本数据类型能够看作是计算机中已实现数据结构。数据类型就是数据结构,不过它是从编程者角度来使用。数据类型是模板,必须定义属于某种数据类型变量,才能参加运算。19第19页抽象数据类型

(ADTs:AbstractDataTypes)抽象数据类型是由用户定义,用以表示应用问题数据模型。特点是:信息隐蔽和数据封装,使用与实现相分离。抽象数据类型可用(D,S,P)三元组表示,其中,D是数据元素集合(简称数据对象),S是D上关系集合,P是对D基本操作集合。

20第20页抽象数据类型查找登录删除修改

符号表21第21页抽象数据类型描述其中数据对象、数据之间关系用伪码描述;基本操作定义格式为ADT抽象数据类型名{ 数据对象:〈数据对象定义〉 数据关系:〈数据关系定义〉 基本操作:〈基本操作定义〉}ADT抽象数据类型名基本操作名(参数表)前置条件:〈先决条件描述〉后置条件:〈操作结果描述〉22第22页基本操作有两种参数:赋值参数只为操作提供输入值;引用参数以&打头,除可提供输入值外,还将返回操作结果。“前置条件”描述了操作执行之前数据结构和参数应满足先决条件,若不满足,则操作失败,并返回对应犯错信息。“后置条件”说明了操作正常完成之后,数据结构改变情况和应返回结果。若前置条件为空,则省略之。23第23页自然数抽象数据类型定义ADT

NaturalNumberisobjects:一个整数有序子集合,它开始于0,结束于机器能表示最大整数(MaxInt)。Function:对于全部x,y

NaturalNumber;

False,True

Boolean,+、-、<、==、=等都是可用服务。

Zero():NaturalNumber

//前置条件:无//后置条件:返回自然数0

24第24页

IsZero(x):Boolean

//前置条件:x为NaturalNumber

//后置条件:if(x==0)then返回True

else返回FalseAdd(x,y):NaturalNumber

//前置条件:x,y为NaturalNumber且x+y≤MaxInt

//后置条件:返回x+ySubtract(x,y):NaturalNumber

//前置条件:x,y为NaturalNumber且x≥y

//后置条件:返回x-y

25第25页

Equal(x,y):Boolean

//前置条件:x,y为NaturalNumber

//后置条件:

if(x==y)返回Trueelse返回FalseSuccessor(x):NaturalNumber

//前置条件:x为NaturalNumber

//后置条件:if(x==MaxInt)

返回xelse返回x+1end

NaturalNumber26第26页面向对象概念面向对象=对象+类+继承+通信对象在应用问题中出现各种实体、事件、规格说明等。由一组属性值和在这组值上一组服务(或称操作)组成。与C中结构数据类型不一样在于:C中结构数据类型变量仅包括属性值,与操作分离,而C++中对象则不然。27第27页类(class),实例(instance)含有相同属性和服务对象归于同一类,形成类。类中对象为该类实例。同一类实例共享类属性和类操作;经过继承共享其父类公共和保护性属性和操作;同一类不一样实例有不一样属性值。28第28页四边形类及其对象属性aPoint1aPoint2aPoint3aPoint4服务Draw()move(x,y)contains(aPoint)属性值属性值quadrilateral1quadrilateral2(35,10)(50,10)(35,25)(50,25)(45,65)(50,45)(65,66)(60,70)Draw()move(x,y)contains(aPoint)Draw()move(x,y)contains(aPoint)服务服务quadrilateral29第29页继承派生类(子类):四边形,三角形,…基类(父类):多边形派生类继承特征+特有特征基类多边形四边形三角形六边形30第30页通信消息传递C++中消息传递方式:定义:Pointp;voidmove(intΔx,intΔy);使用:p.move(x,y);C中则不一样,需使用函数调用方式:定义:Pointp;voidmove(Pointq,intΔx,intΔy);使用:move(p,x,y);

31第31页Draw()move(x,y)contains(aPoint)PolygonreferencePointVerticesPolygon类referencePointVerticesDraw()move(

x,y)contains(aPoint)Polygon子类Quadrilateral类Quadrilateral32第32页算法定义定义:一个有穷指令集,这些指令为处理某一特定任务要求了一个运算序列特征:输入有0个或多个输入输出有一个或多个输出(处理结果)确定性每步定义都是确切无歧义有穷性算法应在执行有穷步后结束有效性每一条运算应足够基本33第33页事例学习:选择排序问题明确问题:递增排序处理方案:逐一选择最小数据算法框架:

for(inti=0;i<n-1;i++){//n-1趟 从a[i]检验到a[n-1];

若最小整数在a[k],交换a[i]与a[k];}细化程序:程序SelectSort算法设计

自顶向下,逐步求精

34第34页

voidselectSort(inta[],constintn){

//对n个整数a[0],a[1],…,a[n-1]按递增次序排序for(inti=0;i<n-1;i++){

intk=i;

//从a[i]查到a[n-1],找最小整数,在a[k]

for(intj=i+1;j<n;j++)

if(a[j]<a[k])k=j;

inttemp=a[i];a[i]=a[k];a[k]=temp;}}

35第35页模板(template)定义

适合各种数据类型类定义或算法,在特定环境下经过简单地代换,变成针对详细某种数据类型类定义或算法。36第36页用模板定义用于排序数据表类#ifndefDATALIST_H#defineDATALIST_H#include<iostream.h>//K是表项关键码类型template<classK,classE> //E是表项类型classdataList{ private:E*element; intlistSize; voidswap(intm1,intm2);intminKey

(intlow,inthigh);37第37页

public:dataList

(intsize=10):listSize(size),element(new

E[size]){}~dataList(){delete[]element;} voidsort();friendostream&operator<<(ostream&

outStream,dataList<K,E>&outList);friendistream&operator>>(istream&

inStream,dataList<K,E>&inList);};

#endif38第38页类中全部操作作为模板函数实现template<classK,classE>voiddataList

<K,E>::swap

(intm1,intm2){

//交换由m1,m2为下标数组元素值Etemp=element

[m1];

element

[m1]=element

[m2];

element[m2]=temp;};39第39页template<classK,classE>intdataList<K,E>::minKey

(intlow,inthigh){//查找数组Element[low]到Element[high]中具//有最小关键码值表项,函数返回其位置intmin=low;for(inti=low+1,i<=high,i++) if(element[i]<element[min]) min=i; returnmin;};定义重载操作40第40页template<classK,classE>ostream&operator<<(ostream&outStream,

dataList<K,E>outList){outStream<<“输出数组内容:\n”;for(inti=0;i<outList.listSize;i++)

outStream<<outList.element[i];

outStream<<endl;ouStream<<“输出数组当前大小:”<<

outList.listSize<<endl;returnoutStream;}

41第41页

template<classK,classE>istream&

operator>>(istream&inStream,

dataList<K,E>inList){//输入对象为inList,输入流对象为inStream

cout<<“输入数组当前大小:”;

instream>>inList.listSize; cout<<“输入数组元素值:\n”; for(inti=0;i<inList.listSize;i++){

cout

<<“元素”<<i<<“:”;

inStream>>inList.element[i];}returninStream;}42第42页template<classK,classE>voiddataList<K,E>::sort(){//按非递减次序对listSize个关键码element[0]到//element[ArraySize-1]排序for(inti=0;i<=listSize-2;i++){intj=minKey(i,listSize-1);if(j!=i)swap(j,i);}}#endif43第43页使用模板选择排序算法主函数

#include<iostream.h>

#include“dataList.h”constintSZ=10;intmain(){

structsick{

//患者

intkey;

char*name[15];intage;

char*address[30];

booloperator<(sick

x){returnkey<x.key;}

};

44第44页dataList<int,sick>TestList(SZ);

cin

>>TestList;

cout

<<TestList<<endl;TestList.Sort();

cout

<<TestList<<endl;

return0;}

定义对象时,代入实际数据类型重载友元操作标准I/O操作消息通信45第45页算法简单性能分析与度量算法性能标准算法后期测试算法事前预计46第46页算法性能标准正确性(Correctness)

算法应满足详细问题需求。可读性(Readability)

算法应该轻易阅读。以有利于阅读者对程序了解。效率效率指是算法执行时间和空间利用率。通常这二者与问题规模相关。健壮性(Robustness)

算法应含有容错处理功效。当输入非法数据时,算法应对其作出反应,而不应产生莫名其妙输出结果。47第47页算法后期测试对一个算法要作出全方面分析可分成两个阶段进行,即事前分析和事后测试事前分析要求事前求出该算法一个时间界限函数。事后测试则要求在算法执行后经过算法执行时间和实际占用空间统计资料来分析。事后分析要求在算法中一些部位插装时间函数

time

(),测定算法完成某一功效所花费时间。48第48页比如,给出次序搜索(SequenialSearch)算法intseqsearch(inta[],intn,intx){//在a[0],…,a[n-1]中搜索与给定值x相等元//素,函数返回其位置,失败返回-1。

inti=0;

while(i<n&&a[i]!=x)

i++;

if(i==n)return

-1;

returni;}

49第49页

插装time()计时程序

doublestart,stop;time(&start);

intk=seqsearch(a,n,x);time(&stop);

doublerunTime=stop-start;

cout<<""<<n<<""<<runTime<<endl;实际上,算法运行时间要受输入规模、利用编译程序生成目标代码质量、计算机程序指令系统品质和速度等制约。50第50页算法事前预计算法事前预计主要包含时间复杂性和空间复杂性分析:问题规模:如:矩阵阶数、图结点个数、被分类序列正整数个数等。时间复杂性:算法所需时间和问题规模函数,记为T(n)。当n

时时间复杂性,称为渐进时间复杂性。空间复杂性:算法所需空间和问题规模函数。记为S(n)。当n

时时间复杂性,称为渐进空间复杂性。51第51页空间复杂度度量存放空间固定部分

程序指令代码空间,常数、简单变量、定长成份(如数组元素、结组成份、对象数据组员等)变量所占空间可变部分

尺寸与实例特征相关成份变量所占空间、引用变量所占空间、递归栈所用空间、经过new和delete命令动态使用空间52第52页时间复杂度度量编译时间运行时间程序步语法上或语义上有意义一段指令序列;执行时间与问题规模无关;比如:申明语句:程序步数为0;表示式:程序步数为153第53页程序步确定方法插入计数全局变量count建表,列出个语句程序步例以迭代方式求累加和函数floatsum(floata[],intn){

floats=0.0;

for(inti=0;i<n;i++)s=s+a[i];

returns;}54第54页在求累加和程序中加入count语句floatsum(floata[],intn){float

s=0.0;count++; //count统计执行语句条数

for(inti=0;i<n;i++){count+=2;//针对for语句 s+=a[i]; count++;//针对赋值语句} count+=2; //针对for最终一次count++; //针对return语句

returns;}

执行结束得程序步数count=3*n+455第55页程序简化形式

voidsum(floata[],intn){for(inti=0;i<n;i++)count+=3;count+=4;}56第56页注意:

一个语句本身程序步数可能不等于该语句一次执行所含有程序步数。

比如:赋值语句x=sum(R,n)本身程序步数为1;一次执行对函数sum(R,n)调用需要程序步数为3*n+4;一次执行程序步数为

1+3*n+4=3*n+557第57页计算累加和程序

程序步数计算工作表格58第58页时间复杂度渐进表示法例求两个n阶方阵乘积C=A

BvoidMatrixMultiply(intA[n][n],intB[n][n],

intC[n][n]){for(inti=0;i<n;i++)

…2n+2

for(intj=0;j<n;j++){

…n(2n+2)

C[i][j]=0;

…n2

for(intk=0;k<n;k++)

…n2(2n+2)

C[i][j]=C[i][j]+A[i][k]*B[k][j];

…n3

}}3n3+5n2+4n+259第59页时间复杂度渐进表示法算法中全部语句频度之和是矩阵阶数n函数

T(n)=

3n3+5n2+4n+2普通地,称n是问题规模。则时间复杂度T(n)是问题规模n函数。当n趋于无穷大时,把时间复杂度数量级(阶)称为算法渐进时间复杂度

T(n)=O(n3)─大O表示法60第60页加法规则针对并列程序段

T(n,m)=T1(n)+T2(m) =O(max(f(n),g(m)))

各种函数增加趋势

c<log2n<n<nlog2n<n2<n3<2n<3n<n!61第61页T(n)=T1(n)+T2(n)+T3(n)=O(max(1,n,n2))=O(n2)变量计数for(inti=0;i<n;i++)

for(intj=0;j<n;j++)y++;T1

(n)=O(1)T2(n)=O(n)T3(n)=O(n2)x=0;y=0;for(intk=0;k<n;k++)x++;62第62页乘法规则针对嵌套程序段

T(n,m)=T1(n)*T2(m)

=O(f(n)*g(m))

渐进空间复杂度

S(n)=O(f(n))两个并列循环例子63第63页

voidexam(floatx[][],intm,intn){floatsum[];for(inti=0;i<m;i++){//x中各行

sum[i]=0.0;//数据累加for(intj=0;j<n;j++) sum[i]+=x[i][j];

}

for(i=0;i<m;i++)//打印各行数据和

cout<<i<<“:”<<sum[i]<<endl;}

渐进时间复杂度为O(max(m*n,m))64第64页起泡排序voidbubbleSort(inta[],intn){

//对表a[]逐趟比较,n是表当前长度

for(inti=1;i<=n-1;i++){//n-1趟

for(intj=n-1;j>=i;j--)//n-i次比较

if(a[j-1]>a[j]){

inttmp=a[j-1];a[j-1]=a[j];

a[j]=tmp;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论