配套课件-数据结构与算法分析.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《配套课件-数据结构与算法分析.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 配套 课件 数据结构 算法 分析
- 资源描述:
-
1、第第1 1章章 绪绪 论论1.1 软件的基本概念1.2 数据结构概述1.3 算法与算法分析1.4 程序设计的关键技术1.5 程序设计的步骤及实例1.1 软件的基本概念从一般意义上讲,能够在计算机上运行的程序都可以称为软件。软件更准确的定义是利用计算机本身提供的逻辑功能,合理地组织计算机的工作流程,简化或替代人们使用计算机过程中的各个环节,提供给使用者一个便于操作的工作环境的“程序集”。软件是逻辑的而不是物理的产品,与硬件相比具有以下完全不同的特征:(1)软件是由开发或工程化而形成的,而不是由传统意义上的制造产生的。(2)软件不会磨损。软件的故障率随时间的推移而降低,而硬件的故障率随时间的推移而
2、增加。(3)大多数软件是自定义的,而不是通过已有的组件组装而来的。1.1.1 软件应用从某种程度上讲,对软件应用给出一个确切的分类是比较困难的。下面给出的一些软件的应用领域,可以看做是一种潜在的应用分类:(1)系统软件。(2)实时软件。(3)商业软件。(4)工程和科学计算软件。(5)嵌入式软件。(6)个人软件。(7)人工智能软件。1.1.2 软件生存期1制定计划2需求分析和定义3软件设计4程序编制5软件测试6运行/维护 图1-1 软件生存期模型1.1.3 软件技术软件是由程序、数据和文档组成的。为了开发高质量的软件,软件工程师必须遵循一个开发策略,即软件过程模型。软件技术是指开发软件所需的所有
3、技术的总称。按照软件分支学科的内容划分,软件技术包括以下几个领域:(1)软件工程技术。(2)程序设计技术。(3)软件工具环境技术。(4)系统软件技术。(5)数据库技术。(6)实时软件技术。(7)网络软件技术。(8)与实际工作相关的软件技术。1.1.4 程序设计技术程序设计技术的目标是提高程序的质量与生产率,最终实现程序的工业化生产。影响程序质量的因素有很多,如正确性、性能、可靠性、容错性、易用性、灵活性、可扩充性、可理解性、可维护性和复用性等。下面所介绍的程序设计技术主要是针对规模小且一个人能够独立完成的程序设计技术。程序设计的主要环节有:明确需求、设计、实现(即编码)、测试等,如图1-2所示
4、。图1-2 程序设计的主要环节1明确需求程序设计的第一步工作是明确需求,即明确待解决的问题是什么,也称为问题分析阶段。2设计设计是把需求转化为程序的最重要的环节。设计的优劣在根本上决定了程序的质量,它包括程序结构设计、模块设计、数据结构与算法设计和用户界面设计。1)结构设计结构是程序中最本质的内容。(1)结构是对复杂事物的一种抽象。(2)结构在一定的时间内保持稳定。2)模块设计 在程序结构设计完成后,就已经在宏观上明确了各个模块具有的功能以及在结构中的位置。我们习惯地从功能上划分模块,并保持“功能独立”是模块化设计的基本原则,这是因为功能独立的模块可以降低开发、测试、维护等阶段的代价。但是功能
5、独立并不意味着模块之间保持绝对的孤立,一个系统要完成某项任务,需要各个模块相互配合才能实现,此时模块之间就要进行信息交流。评价模块设计优劣的三个特征因素是信息隐藏、内聚与耦合和封闭开放性。(1)信息隐藏。(2)内聚与耦合。耦合的强度依赖于以下几个因素:一个模块对另一个模块的调用;一个模块向另一个模块传递的数据量;一个模块施加到另一个模块的控制的多少;模块之间接口的复杂程度。(3)封闭开放性。3)数据结构与算法设计设计高效率的程序是基于良好的数据结构与算法,而不是基于编程小技巧。人们对常用的数据结构与算法的研究已经相当透彻了,可以归纳出下列设计原则:(1)每一种数据结构与算法都有其时间、空间的开
6、销和收益。(2)与开销和收益有关的是时间空间的权衡。(3)程序员应该充分地了解一些常用的数据结构与算法,避免不必要的重复设计工作。(4)数据结构与算法为应用服务。4)用户界面设计(1)界面的合适性。(2)界面的风格。(3)界面的广义美。3编码编码(Coding)的任务是为每个模块编写程序,也就是说,将设计的结果转换为用某种程序设计语言编写的程序,这个程序必须是无错的,并且要有必要的内部文档和外部文档。4测试程序测试是指在受控制的条件下对程序进行操作并评价操作结果的过程。所谓控制条件,应包括正常条件与非正常条件。测试是程序的执行过程,测试的目的是发现尽可能多的缺陷。1.2 数据结构概述1.2.1
7、 数据结构的引入从提出一个实际问题到计算机解出答案,需要经历下列步骤:分析阶段、设计阶段、编码阶段和测试维护阶段等。其中,分析阶段就是要从实际问题中提取操作对象以及操作对象之间的关系。下面举例说明。例1-1计算机管理图书目录问题。要利用计算机帮助查询书目,首先必须将书目存入计算机,那么这些书目如何存放呢?我们既希望查询时间短,又要求节省空间。一个简单的办法就是建立一张表,每本书的信息只用一张卡片表示,在表中占一行,如表1-1所示。例1-2 工厂的组织管理问题。某工厂的组织机构如图1-3所示。厂长要通过计算机了解各个科室及车间的工作和生产情况,于是,将该组织机构抽象成某个结构树,如图1-4所示,
8、它可以表示问题中各数据之间的关系。只要将数据按一定的方式存入计算机中,并对这棵树遍历,就能了解厂内的整个情况。图1-3 工厂组织机构 图1-4 树形结构 例1-3 多岔路口交通灯管理问题。通常,在十字交叉路口只要设置红绿两色的交通灯便可保持正常的交通秩序,但是对于多岔路口,需要设置几种颜色的交通灯,既能使车辆相互间不发生碰撞,又能达到交通控制的最大流通量呢?图1-5(a)所示是一个实际的五岔路口,我们如何设置交通灯,即最少应设置几种颜色的交通灯,才能保证正常的交通秩序?图1-5 五岔路口交通灯管理问题1.2.2 数据结构的基本概念计算机处理的对象是数据,那么什么是数据呢?简单地讲,数据就是客观
9、事物在计算机中的表示,它具有可识别性、可加工处理性和可存储性等特征。数据结构所要研究的主要内容可以简要地归纳为以下三个方面:(1)研究数据元素之间固有的客观联系,即数据的逻辑结构(Logical Structure)。(2)研究数据在计算机内部的存储方法,即数据的存储结构(Storage Structure),又称物理结构。(3)研究如何在数据的各种结构(逻辑的和物理的)上施加有效的操作或处理(算法)。表 1-2 学 生 成 绩 表 学 号 姓 名 性 别 课 名 成 绩 22001 王 丽 女 物理 81 22002 刘建东 男 物理 76 22031 陈立平 男 物理 92 数据的逻辑结构
10、有两大类:(1)线性结构。线性结构的逻辑特征是有且仅有一个开始结点和一个终端结点,且所有结点都最多只有一个直接前趋和一个直接后继。线性表就是一种典型的线性结构。本书第2章第4章介绍的数据逻辑结构都是线性结构。(2)非线性结构。非线性结构的逻辑特征是一个结点可能有多个直接前趋和直接后继。例如,树和图就是典型的非线性结构。数据的存储结构可用以下四种基本的存储方法得到。(1)顺序存储方法。(2)链接存储方法。(3)索引存储方法。(4)散列存储方法。例1-4 抽象数据类型复数的定义。1.2.3 数据结构与程序设计关于“计算机科学”,从20世纪60年代以来,一直有两种观点。一种观点认为“计算机科学是一种
11、基于信息结构转换的科学”,另一种观点认为“计算机科学是算法的学问”。这两种观点从不同的侧面说明了数据结构、算法在计算机科学中的重要位置。实际上数据结构与算法之间存在着本质联系,应该说,数据结构与算法是计算机科学的核心。例1-5 电话号码查询问题。假定要编写一个程序,查询某人的电话号码。对任意给出的一个姓名(假设不存在重名的情况),若该人的电话已登记,则要迅速找到其电话号码;否则指出该人没有电话。解决此问题的办法是,首先要构造一张电话号码登记表,表中每个结点存放两个数据项:姓名和电话号码。其次,如何组织表中的数据是问题的关键,最简单的方法是将每个人的信息顺序存放在表中(如图1-6所示),查找时从
12、头开始依次查找姓名,直到找到相应的姓名,或找遍整个表没有找到为止。但是,这种查找方法不适用于表中内容庞大的情况。图1-6 电话号码查询中的顺序存储现在我们从数据结构的角度考虑,即对图1-6所示表中信息的组织和存储重新考虑,将表中的姓名按姓氏排列,并另外再建一张姓氏索引表,其存储结构如图1-7所示。图1-7 电话查询中的索引存储 例1-6 人事档案的建立及管理。假设要建立一个大学的教师和学生档案,并完成日常的管理(如查询、插入、删除等)。教师和学生档案的逻辑结构如图1-8所示(以一系教师和学生逻辑结构示意)。图1-8 人事档案1.3 算法与算法分析1.3.1 算法的概念通俗地讲,一个算法就是一种
13、解题方法。更严格地说,算法是由若干条指令组成的有限序列,它必须满足以下性质。(1)输入性:具有零个或多个输入量,即算法开始前对算法给出的初始量。(2)输出性:至少产生一个输出。(3)有穷性:每条指令的执行次数必须是有限的。(4)确定性:每条指令的含义必须明确,无二义性。(5)可行性:每条指令都应在有限的时间内完成。1.3.2 算法分析求解一个问题,可以有许多种不同的算法,究竟如何评价这些算法的好坏呢?显然,选用的算法首先应该是“正确的”,其次,还需考虑以下几个因素:(1)执行算法所消耗的时间。(2)执行算法所消耗的存储空间,其中主要考虑辅助存储空间。(3)算法的可读性好,易理解,易编码、调试。
14、例如,求两个n阶方阵的乘积C=AB,其算法描述如下:例如,MatrixMulti算法的时间复杂度T(n)在n趋向无穷大时,显然有2n12n3nn2limnT(n)lim323n3n例如,交换i和j的内容。temp=i;i=j;j=temp;对于较复杂的算法,我们则可以将其分隔成容易估算的几个部分,然后利用“O”的求和原则得到整个算法的时间复杂度。例如,若算法中两个部分的时间复杂度分别为T1(n)=(f(n)和T2(n)=O(g(n),则总的时间复杂度为 T(n)=T1(n)+T2(n)=O(max(f(n),g(n)若T1(m)=O(f(m),T2(n)=O(g(n),则总的时间复杂度为T(m
15、,n)=T1(m)+T2(n)=O(f(m)+g(n)图1-9 几种常见函数的增长率类似于时间复杂度的讨论,一个算法的空间复杂度(Space Complexity)S(n)定义为该算法所耗费的存储空间的量度,记做S(n)=O(f(n)其中,n为问题的规模。渐近空间复杂度也常常简称为空间复杂度。1.4 程序设计的关键技术结构化程序设计中要遵循如下原则:(1)分解原则。(2)模块独立性原则。(3)编码结构化原则。1.4.1 程序结构设计1自顶向下自顶向下层次结构设计方法的主要思想是:先设计第一层(即顶层),然后步步深入,逐层细分,逐步求精,直到整个问题可用程序设计语言明确地描述出来为止。2自底向上
16、自底向上层次结构设计方法的主要思想:先设计底层,最后设计顶层。这种层次结构设计方法的优点是:由表及里、由浅入深地解决问题。自底向上层次结构设计方法的不足之处是:在逐步细化的过程中可能发现原来的分解细化不够完善。这种层次结构设计方法主要用于修改、优化或扩充一个程序。3模块划分模块划分的目的是将较复杂的程序/模块分解为规模较小、功能单一的子模块,以便于把握程序的实现。为了达到这个目的,必须深入理解程序/模块的功能及其应用环境,在此基础上才能设计出好的程序。图1-10 程序结构与组成示意图 图1-11 程序的分解示意图(1)模块独立性原则。每一个功能模块都必须是独立的,即模块内部的处理与其他模块的任
17、何信息处理无关。模块外部只提供输入条件和输出条件,这是与其化模块之间仅有的联系。图1-12 块间联系与块内联系示意图(2)信息隐蔽原则。程序经常被其他程序设计人员阅读,在整个生命期中要经历多次修改,程序设计时如何划分模块,才能使将来修改的影响范围尽量小呢?D.Parnas提出了信息隐蔽原则。根据信息隐蔽的原则,设计时应列出可能发生变化的因素,在划分模块时将一个可能发生变化的因素包含在某个模块的内部,使其他模块与这个因素无关。这样,将来某个因素发生变化时,我们只需要修改一个模块就够了,而其他模块则不受这个因素的影响。下面用一个例子来解释信息隐蔽原则:用数组实现了一个栈,有十个模块要对栈做存取操作
18、。一种设计方案是将数组、栈顶、深度等作为全程变量,由各个模块自行对栈进行存取操作,如图1-13(a)所示,也就是说十个模块都需了解栈的具体结构细节。这个方案的缺点是:如果将来栈的具体结构发生变化(如深度增加),那么这十个模块都必须做相应的修改。另一种设计方案是根据信息隐蔽的原则,先构造两个模块Push和Pop,它们分别负责对栈做存取操作,十个模块通过调用Push和Pop实现栈操作,如图1-13(b)所示。此时,栈的具体结构是隐含在Push和Pop两个模块内部的,其他十个模块完全不了解这些细节,栈对这十个模块来说是一个抽象的数据结构。这个方案的优点是:如果将来需要修改栈的具体结构,只须改动Pus
19、h和Pop两个模块就够了,其余十个模块完全不受影响。图1-13 模块对栈的存取操作(3)重用性原则。软件的可重用性一直是软件工程所追求的目标之一,人们希望利用标准化的软件模块快速地构建特定的应用系统。软件开发的全生命周期都有可重用的价值,包括项目的组织,软件需求、设计、文档、实现、测试方法和测试用例,都是可以被重复利用或借鉴的有效资源。软件代码的可重用性是最直观、最容易想到的部分,也是程序员们最乐意追求和有成就感的部分。4模块功能确定和接口定义在模块划分原则的基础上,可根据程序的功能对程序进行模块划分。在模块划分时一定要遵循模块划分原则和程序的功能要求。程序具有特定的功能,而程序的功能是由所有
20、模块的功能经过有机组合来实现的,因此确定每一个模块的功能和模块间的关系是非常重要的。确定模块的功能必须与模块划分同时考虑。接口定义是指为了实现模块间的相互调用而约定的调用协议,即调用模块所应遵守的规则。如图1-13中的模块Push,该模块的输入是一个有效的X,其操作结果是将X入栈,那么该模块的接口可定义为(用C语言给出):Output_Type Push(Stack_Type X);在调用该模块时,应采用如下格式:Stack_Type input;Output_Type output;output=Push(input);5调用关系确定模块间的调用关系是指模块间调用的次序。模块调用关系分为递归
21、调用和非递归调用。递归调用是指模块自身调用自己;非递归调用是指模块调用其他模块。递归调用分为直接递归调用和间接递归调用,直接递归调用是指模块直接调用自身;间接递归调用是指模块通过其他模块调用自身。图1-14 模块间调用关系说明在确定调用关系时,应根据程序的处理流程确定模块间的调用关系。实际上,程序的处理流程与程序中模块的调用关系有着明显的对应关系。例如,在1.5.2节将介绍的程序设计实例中,查询请求的处理流程(图1-18)所对应的模块调用关系如图1-15所示。图1-15 模块调用关系1.4.2 模块设计1输入到输出的映射建模输入到输出的映射建模是根据模块的功能要求,对输入进行有效的变换,得到期
22、望的输出结果。假设Compute模块的功能是求input的平方根,并且没有现成的平方根函数,则抽象的映射为inputoutput 2数据结构和算法设计算法的描述方法有自然语言描述法、类计算机语言描述法、形式语言描述法和图示描述法,而使用最普遍的方法是类计算机语言描述法和图示描述法。最具代表性的类计算机语言描述方法是类Pascal语言,而图示描述法中常用的方法是流程图。1.4.3 良好的编程风格好程序除了满足必需的要求(如正确性、可靠性、健壮性、高效率等)外,还必须具有好的编程风格。好的编程风格对于好的程序设计具有关键性作用,它使程序代码容易被读懂。1命名在程序中有大量的变量、常量、宏和函数等,
23、如何为这些变量和函数命名?名字用来标识某个对象,带着说明其用途的一些信息。一个名字应该是简练的、容易记忆的,如果可能的话,最好是能够拼读的。一个变量的作用域越大,它的名字所携带的信息就应该越多。因为全局变量可以出现在整个程序中的任何地方,所以它们的名字应该足够长,具有足够的说明性,以便使读者能够记得它们的用途。2注释注释是帮助程序阅读的一种手段。好的注释可用于简洁地说明程序的突出特征,帮助读者理解程序。(1)不要注释明显的内容。(2)给函数和全局数据加注释。(3)不要注释差的代码,而应重写代码。(4)不要与代码矛盾。(5)澄清情况,不要添乱。3程序的外观1)块的对齐方式2)适当的缩进和空白一致
24、的缩进风格会使程序清晰易懂。缩进用于描述程序中各部分或语句之间的结构关系。在嵌套结构中,每个内层部分或语句应该比外层缩进适当的空格。例如:for(i+;i 100;fieldi+=c);fieldi=0;return 0;该程序段的格式就不好,重新调整格式如下所示:for(i+;i=actblks|(block_id unblocks)4)分解复杂的表达式C语言有很丰富的表达式语法结构和运算符,因此很容易把一大堆内容写进一个语句中。例如:*x+=(*xp=(2*k (n-m)?ck+1:dk-);该表达式虽然很紧凑,但是写进一个语句里的内容确实太多了,把它分解成几个部分,其含义更容易把握,如下
25、所示:if(2*k (n-m)*xp+=ck+1;else*xp+=dk-;如果将其改写为if(2*k (n-m)*xp=ck+1;else*xp=dk-;*x+=*xp;则更加直观。4一致性和习惯用法1)使用一致的缩排和加括号风格缩排可以显示出程序的结构,那么什么样的缩排风格最好呢?是采用次行风格,还是采用行尾风格?实际上,特定风格远没有一致性那么重要。2)为了保持一致性,使用习惯用法和自然语言一样,程序设计语言也有许多习惯用法,也就是那些经验丰富的程序员的习惯方式。在学习一个语言的过程中,一个主要问题就是逐渐熟悉它的习惯用法。1.4.4 排错与测试1排错1)排错系统每种语言的编译系统通常都
展开阅读全文