收藏 分享(赏)

算法与数据结构1.ppt

上传人:Facebook 文档编号:3536800 上传时间:2018-11-13 格式:PPT 页数:38 大小:133KB
下载 相关 举报
算法与数据结构1.ppt_第1页
第1页 / 共38页
算法与数据结构1.ppt_第2页
第2页 / 共38页
算法与数据结构1.ppt_第3页
第3页 / 共38页
算法与数据结构1.ppt_第4页
第4页 / 共38页
算法与数据结构1.ppt_第5页
第5页 / 共38页
点击查看更多>>
资源描述

1、算法设计的重要性: 例1:从n个数中找出第k大的那个数 例2:百钱买百鸡问题,第一章 绪 论,程序设计的要求: 1。正确性 2。有效性 3。可维护性 4。可靠性 5。可重用性(包括可移植性) 6。简明性,“数据结构”所处的地位,用计算机解决问题的步骤:,问题分析:这阶段的任务是弄清所要解的问题是什么;并且把它用一种语言(自然语言、说明语言或数学语言)清楚地描述出来。 算法设计:这阶段的任务是建立程序系统的结构,重点是算法的设计和数据结构的设计。对于大型的复杂的程序系统,这一阶段往往还包括模块的设计。 程序设计:采用适当的程序设计语言,编写出可执行的程序。 程序测试和维护:发现和排除在前几个阶段

2、中产生的错误,经测试通过的程序便可投入运行,在运行过程中还可能发现隐含的错误和问题,因此还必须在使用中不断维护和完善。,1.1问题求解,问题分析示例,为了设计一个交通信号灯的管理系统,首先需要分析一下所有车辆的行驶路线的冲突问题。这个问题可以归结为对车辆的可能行驶方向作某种分组,对分组的要求是使任一个组中各个方向行驶的车辆可以同时安全行驶而不发生碰撞。,根据这个路口的实际情况可以确定13个可能通行方向:AB,AC,AD,BA,BC,BD,DA,DB,DC,EA,EB,EC,ED。可以把AB简写成AB,用一个结点表示 ,在不能同时行驶,1.1.1问题分析,的结点间画一条连线(表示它们互相冲突),

3、便可以得到如右图所示的表示。这样得到的表示可以称之为“图” 。,如果把上图中的一个结点理解为一个国家,结点之间的连线看作两国有共同边界,上述问题就变成著名的“着色问题”:即求出最少要几种颜色可将图中所有国家着色,使得任意两个相邻的国家颜色都不相同。 通过上面的分析,我们就获得了该交通管系统的数学模型,下面就可以着手进行算法的设计。,1.1.2程序设计,一、算法设计1。穷举法2。贪心法,二、程序设计 首先,为问题中所有有关数据设计适当的表示形式,不仅包括需要表示的结点和连接,可能还有为计算过程的实现而用的辅助性数据结构。,然后选择一种适当的程序设计语言实现这些数据结构,并在设计好的数据结构上精确

4、地描述上面提出的算法,完成一个程序,使之能在计算机上运行。,假设需要着色的图是G,集合V1包括图中所有未被着色的结点,着色开始时V1是G所有结点集合。NEW表示已确定可以用新颜色着色的结点集合。从G中找出可用新颜色着色的结点集的工作可以用下面的程序框架描述:置NEW为空集合;for 每个v V1 doif v与NEW中所有结点间都没有边从V1中去掉v ; 将v加入NEW ;,这个程序片段里涉及对集合和图的操作,包括由集合中去掉一个元素,向集合里增加一个元素,检查两个结点之间在图中是否有边连接等。有了这些结构和操作,程序的实现非常简单。 但是,常见程序设计语言并不直接支持图和集合等数据结构,通常

5、只提供了一些基本数据类型(例如整数、实数、字符等)和一些数据构造手段(例如数组、记录、指针等)。要解决这个计算问题,我们必须自己用选定的语言所提供的机制实现这些结构(集合、图等)和操作(对集合的元素增删、对图的边的判断等),这些正是本课程将要讨论的基本内容。,1.2 数据结构,数据结构主要关心的是下面三个方面 : 1。结构中各元素之间的逻辑关系线性结构:如图书馆的书目索引树形结构:图形结构: 2。结构中各元素的存储方式 3。结构具有的行为特征,例2: 问题:计算机和人对弈 模型:树形结构,树形结构,返回,例3: 问题:多叉路口交通灯的管理 模型:图形结构,图形结构,返回,1.2.1基本术语,数

6、据(Data):在计算机科学中是至所有能输入到计算机中并 被计算机程序处理的符号的总称。 数据元素(Data Element):数据的基本单位,在计算机程序 中通常作为一个整体进行考虑和处理。 一个数据元素可以由若干个数据项(Data Item)组成。 数据对象(Data Object):是性质相同的数据元素的集合。 数据结构(Data Structure):是相互之间存在一种或多种特 定关系的数据元素的集合。,逻辑结构:表示数据元素之间的逻辑关系。 物理结构:数据结构在计算机中的表示(影响),又称存 储结构。 数据类型(Data Type):是一个值的集合和定义在这个值 集上的一组操作的总称

7、。 原子类型(Atom Type) 结构类型(Structure Type) 作用:实现信息的隐蔽 抽象数据类型(Abstract Data Type):是数据类型的延伸。 是一个三元组(D,S,P)。,在计算机中的表示:,1.2.2本课程涉及的主要结构,线性表:线性表是一种逻辑上十分简单但应用非常广泛的数据结构,线性表中各元素之间是一种简单的“线性”关系。顺序表和链表是两种常用的实现线性表的数据结构,它们也是许多复杂结构的基本表示形式。 字符串:字符串也是一种特殊的线性结构,它以字符为元素。本书中讨论的字符串,主要采用顺序表示的形式,因此每个字符可以直接访问。 堆栈与队列:堆栈和队列是两种十

8、分重要的数据结构。堆栈元素的存入和取出按照后进先出原则,最先取出的总是在此之前最后放进去的那个元素;而队列实现先进先出的原则,最先到达的元素也最先离开队列。,树与二叉树:树和二叉树都属“树形结构”,在逻辑上表示了结点的层次关系,是一种非线性结构。树最上面一层只有一个元素,称为“树根”。每个元素可以有若干相关联的下层元素,这些元素被称为是该上层元素的“子结点”;每个下层元素至多有一个对应的上层元素,称为它的“父结点”。许多实际的和理论的问题中都可以抽象出某种树形结构来。 字典:字典可以看作是一种二元组的集合,每个二元组包含着一个关键码和一个值。抽象地看,一个字典就是由关键码集合到值集合的一个映射

9、。按关键码进行检索是字典中最常用的操作。根据对字典中进行元素插入、删除频率的不同,有所谓“动态字典”和“静态字典”之分。“散列表”是实现字典的有效结构,散列表的主要特点是可以实现对大量离散元素的有效存储和快速访问。由于树形结构便于灵活地执行插入和删除,所以经常用来表示动态字典。,图:图是一种较复杂的结构,它包括一个结点集合和一个边集合,边集合中每条边联系着两个结点。信息可以存储在结点里,也可以存储在边里。许多实际问题中的数据可以用图表示,如公路网络、通信网络、不同事物间的联系,等等。,1.3算法,算法是为实现某个计算过程而规定的基本动作的执行序列。重要特性: (1)有穷性 (2)确定性 (3)

10、可行性 (4)输入 (5)输出,设计要求 (1)正确性 a.不含语法错 b.对于机组数据能够输出正确结果 c.对于典型、苛刻数据能得出正确结果 d.对于一切合法数据能得出正确结果 (2)可读性 (3)健壮性 (4)效率与低存储量要求,在实际应用中,算法的表现形式千变万化,但是算法的情况也和数据结构类似,许多算法的设计思想具有相似之处,我们可以对它们分类进行学习和研究。本课程提到的算法大致有如下一些: 贪心法 分治法:如二分法检索 回溯法 动态规划法 局部搜索法 分支限界法,1.4算法分析,评价一个程序优劣的重要依据是看这个程序的执行需要占用多少机器资源。在各种机器资源中,时间和空间是两个最主要

11、的方面。因此,在进行程序分析时人们最关心的就是程序所用算法运行时所要花费的时间代价和程序中使用的数据结构占有的空间代价。,算法的空间代价(或称空间复杂性):当被解决问题的规模(以某种单位计算)由1增至n时,解该问题的算法所需占用的空间也以某种单位由f(1) )增至f(n),这时我们称该算法的空间代价是f(n)。 算法的时间代价(或称时间复杂性):当问题规模以某种单位由1增至n时,对应算法所耗费的时间也以某种单位由g(1)增至g(n),这时我们称该算法的时间代价是g(n)。,空间单位一般规定为一个简单变量(如整型、实型等)所占存储空间的大小;时间单位则一般规定为执行一个简单语句(如赋值语句、判断

12、语句等)所用时间。在描述算法分析的结果时,人们通常采用“大O”表示法:说某个算法的时间代价(或者空间代价)为O(f(n),则表示如果存在正的常数c和n0,当问题的规模nn0后,该算法的时间(或空间)代价T(n)cf(n)。这时也称该算法的时间(或空间)代价的增长率为f(n)。这种说法意味着:当n充分大时,该算法的复杂性不大于f(n)的一个常数倍。 常用的计算规则: 1。加法准则T(n) = T1(n)+ T2(n) = O(f1(n) + O(f2(n) = O(max(f1(n), f2(n),2。乘法准则T(n) = T1(n)T2(n) = O(f1(n) O(f2(n)= O(f1(n

13、)f2(n),采用大O表示法简化了时间和空间代价的度量,其基本思想是主要关注复杂性的量级,而忽略量级的系数,这使我们在分析算法的复杂度时,可以忽略零星变量的存储开销和循环外个别语句的执行时间,重点分析算法的主要代价。 用同一个算法处理两个规模相同的问题,所花费的时间和空间代价也不一定相同。要全面分析一个算法,应该考虑它在最坏情况下的代价(对同样规模的问题所花费的最大代价)、最好情况下的代价和平均情况下的代价等。然而要全面准确地分析每个算法是相当困难的,因此本书中在分析算法的性质时将主要考虑它们在最坏情况下的代价,个别地方也涉及到其他情况。,1.5抽象数据类型,模块化设计的思想: 抽象数据类型是

14、模块化的思想的发展,它为模块的划分提供了理论依据,抽象数据类型(Abstract Data Type 简称为ADT)可以看作是定义了一组操作的一个抽象模型。例如,集合与集合的并、交、差运算就可以定义为一个的抽象数据类型。一个抽象数据类型要包括哪些操作,这一点由设计者根据需要确定。例如,对于集合,如果需要,也可以把判别一个集合是否空集或两个集合是否相等作为集合上的操作。,从使用的角度看,一个抽象数据类型隐藏了所有使用者不关心的实现细节。使用抽象数据类型观点,可以使程序模块的实现与使用分离,从而能够独立地考虑模块的外部界面和内部算法和数据结构的实现。这也可以使应用程序只要按抽象数据类型的观点统一其

15、调用方式,不管其内部换用其他的任何数据表示方式和运算实现算法,对应用程序都没有影响。这个特征对系统的维护和修改非常有利。 在许多程序设计语言中预定义的类型,例如整数类型、浮点类型、指针类型等,都可以看作是简单的抽象数据类型。从原则上讲,数据结构课程中讨论的各种表、栈、队列、二叉树和字典等,也可以像整数、浮点数等一样定义为程序设计语言预定义的抽象数据类型,复数抽象数据类型 ADT Complex 数据对象:D = c1, c2 | c1, c2 R(R为实数集)数据关系:S = ( c1为实部,c2为虚部)基本操作:void Assign(*A, c1, c2)void Add(*A, B)vo

16、id Minus(*A, B)void Multiply(*A, B)void Divide(*A, B). ADT Complex,抽象数据类型示例,typedef ItemType double; typedef struct ItemType r ;ItemType v; Complex; /* 复数抽象数据类型 */void Assign(Complex *A, ItemType r, ItemType v); /* 赋值 */ void Add(Complex *A, Complex B); /* A+B */ void Minus(Complex *A, Complex B); /

17、* A-B */ void Multiply(Compex *A, Complex B); /* A*B */ void Divide(Complex *A, Complex B); /* A/B */ .,复数抽象数据类型的C语言定义,void Assign(Complex *A, ItemType real, ItemType virtual) A-r = real;A-v = virtual; /* Assign( ) */void Add(Complex *A, Complex B) A-r += B.r;A-v += B.v; /* Add( ) */,复数抽象数据类型的C语言实现,

18、(1)事后统计法 缺陷: a.必须先运行程序 b.所得时间统计量依赖于计算机软硬件等环境因素 (2)事前估算法 因素: a.算法的策略(以百钱买百鸡问题为例) b.问题的规模(n) c.程序语言 d.编译程序所产生的机器代码的质量 e.机器执行指令的速度,算法时间效率的度量,例:两个N*N矩阵相乘的算法 for(I=1; I=n; +I)for(j=1; j=n; +j)cIj = 0;for(k=1; k=n; +k)cIj += aIk * bkj; /* 原操作 */ 问题规模:n 原操作: cIj += aIk * bkj; 基本操作重复执行的次数:f(n) = n3 该算法时间度量记

19、作T(n) = O(f(n) = O(n3) 时间复杂度:O(n3),矩阵相乘算法的分析,有的情况下,算法中基本操作重复执行的次数还随问题的 输入数据集的不同而不同。例如: void Bubble_Sort(int a, int n) int I, change=TRUE;for(I=n-1; I 1 ,冒泡排序法,百钱买百鸡问题,100元钱买100只鸡,母鸡每只5元,公鸡每只3元,小鸡 3只1元,问共可以买多少只母鸡、多少只公鸡、多少只小 鸡? 求解:设母鸡、公鸡、小鸡各为x, y, z只。则有:x + y + z = 1005x + 3y + z/3 = 100只需要解出本方程就可以得到答

20、案。 方法1:用三重循环:for(I=0; I=100; I+)for(j=0; j=100; j+)for(k=0; k=100;k+), if(k%3 = = 0 ,方法2:用两重循环:因总共买100只鸡,所以小鸡的数目可以由母鸡数和公鸡数 得到。 For(I=0;I100;I+)for(j=0;j100;j+) k=100 i j ;if(k%3=0 ,方法3:用两重循环:钱共100元,而母鸡5元1只,所以母鸡数不可能超过20只, 同样,公鸡数也不超过33只。 For(I=0;I=20;I+)for(j=0;j33;j+) k=100 i j ;if(k%3=0 方法4:用一重循环由x+

21、y+z = 100和5*x+3*y+z/3=100可以合并为一个方程:14*x+8*y = 200, 进一步简化为: 7*x+4*y=100 从上面方程可见,x不超过14,并可以进一步判断x必为4 的倍数,于是有:,For(I=0;I=14;I+=4) j = (100 7*I)/4;k=100 i j;printf(“%d,%d,%dn”, I,j,k); 上面四个方法中,第一个方法的循环次数为: 100*100*100 即一百万次;第二个方法的循环次数为:100*100,1万次; 第三个方法为:20*34,680次,第四个方法为:4次,由此 可见,算法的设计至关重要。,返回,小 结,在用计

22、算机解题过程中,算法和数据结构是相辅相成、缺一不可的两个方面。数据结构是算法处理的对象也是设计算法的基础。一个具体问题的数据在计算机中往往可以采用多种不同的数据结构来表示;一个计算过程的实现又常常有多种可用的算法。因此选择什么样的算法和数据结构就成为实现程序过程中最重要的一个课题。 抽象数据类型的引入,提高了程序设计的抽象层次,也为数据结构和算法的研究提供了一种分层的模型。 重点掌握数据结构和算法的基本知识,理解它们在问题求解中的作用;了解下述概念:数据的逻辑结构、存储结构和操作,静态结构和动态结构,抽象数据类型,数据结构和算法的分类,算法的分析,空间代价和时间代价等。,练习题,随机产生n个整数,然后用一种排序算法将它们从小到大排序。,

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

当前位置:首页 > 中等教育 > 小学课件

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


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

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

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