410 likes | 599 Views
算法分析与设计. 授 课: 课件制作: 单 位:. 吴磊 电子科技大学. Email: wulei@uestc.edu.cn www.uestc.edu.cn--- > 教师社区 ---> 吴磊. 第一章 绪 论. 1.1数据结构的定义和地位 1.2 数据结构的基本术语 1.3 算法和算法分析 1.4 算法与程序 1.5 描述算法. §1.1 数据结构的定义和地位. 什么是程序、软件? N. 沃思( Niklaus Wirth) 教授提出: 程序=算法+数据结构 以上公式说明了如下两个问题:
E N D
算法分析与设计 授 课: 课件制作: 单 位: 吴磊 电子科技大学 Email: wulei@uestc.edu.cn www.uestc.edu.cn--->教师社区--->吴磊
第一章 绪 论 • 1.1数据结构的定义和地位 • 1.2数据结构的基本术语 • 1.3算法和算法分析 • 1.4算法与程序 • 1.5描述算法
§1.1 数据结构的定义和地位 • 什么是程序、软件? • N.沃思(Niklaus Wirth)教授提出: 程序=算法+数据结构 • 以上公式说明了如下两个问题: • (1)数据上的算法决定如何构造和组织数据(算法→数据结构)。 • (2)算法的选择依赖于作为基础的数据结构(数据结构→算法)。 软件=程序+文档(软件工程的观点)
数值计算解决问题的一般步骤: • 数学模型→选择计算机语言→编出程序→测试→最终解答。 • 数值计算的关键是:如何得出数学模型(方程)? • 程序设计人员比较关注程序设计的技巧。 • 非数值计算问题: • 数据元素之间的相互关系一般无法用数学方程加以描述。 • 例1.1 电话号码查询问题: • (1)按顺序存储方式:遍历表 • (2)按姓氏索引方式:要写出好的查找算法,取决于这张表的结构及存储方式。 • 电话号码表的结构和存储方式决定了查找(算法)的效率。
例1.2 田径赛的时间安排问题(无向图的着色问题) : 设有六个比赛项目,规定每个选手至多可参加三个项目,有五人报名参加比赛(如下表所示)设计比赛日程表,使得在尽可能短的时间内完成比赛。
A B F E C D • 田径赛的时间安排问题解法: (1)设用如下六个不同的代号代表不同的项目: • 跳高 跳远 标枪 铅球 100米 200米 • A B C D E F (2)用顶点代表比赛项目 • 不能同时进行比赛的项目之间连上一条边。 (3)某选手比赛的项目必定有边相连(不能同时比赛)。 结论:安排四各比赛时间 1(A,C),2(B,D),3(E),4(F)
…….. …….. …... …... …... …... • 例1.3 人机对弈:树形结构
§1.2 数据结构的基本术语 • 1.数据,数据对象和数据元素 • 数据是对客观事物的符号表示,是指计算机能处理的符号的总称。 • (其他定义类似见书) • 2.数据结构 • 数据结构(Data Structure)是相互之间存在一种或多种特定关系的数据元素的集合。通常有四种结构: • (1)集合 • (2)线形结构 • (3)树型结构 • (4)图状结构或网状结构
3.逻辑结构和物理结构 • 逻辑结构:数据元素间抽象化的相互关系(即数据结构) • 与数据的存储无关,独立于计算机,它是从具体问题 • 抽象出来的数学模型。 物理结构(存储结构): • 数据元素及其关系在计算机存储器中的存储方式。 • 是逻辑结构用计算机语言的实现,它依赖于计算机语言。 小结: (1)数据的逻辑结构、存储结构和数据的运算(算法)构成了数据结构三个方面的含义。 (2)程序设计的实质是对实际问题选择一个好的数据结构,加之设计一个好的算法。而好的算法在很大程度上取决于描述实际问题的数据结构。
4.数据类型 • 抽象数据类型(Abstract Data Type)是指一个数学模型以及定义在该模型上的一组操作。 • ADT 抽象数据类型{ • 数据对象:<数据对象的定义> • 数据关系:<数据关系的定义> • 数据操作:<数据操作的定义> • }ADT 抽象数据类型名 • 5.算法 • 所谓算法(Algorithm)是描述计算机解决给定问题的操作过程(解题方法),即为解决某一特定问题而由若干条指令组成的有穷序列。
§1.3 算法和算法分析 • 一、算法的表示和实现: • 描述---可采用自然语言、数学语言或约定的符号语言。 • 实现---必须借助程序设计语言提供的数据类型及其运算 • 二、算法的定义和特性: • 有穷性: 执行了有限条指令后一定要终止。 • 确定性:算法的每一步操作都必须有确切定义,不得有任何歧义性。 • 可行性:算法的每一步操作都必须是可行的,即每步操作均能在有限时间内完成。 • 输入:一个算法有n(n>=0)个初始数据的输入。 • 输出:一个算法有一个或多个与输入有某种关系的有效信息的输出。 • 思考题:算法和程序主要区别是什么?
三、算法设计的要求: • 正确性 • (1)不含语法错误 • (2)程序对于n组输入数据能够得出满足规格说明要求的结果。 • (3)程序对于精心选择的典型、边界性的n组输入数据能得出满足规格说明要求的结果。 • (4)程序对于一切合适的输入数据都能得出满足规格说明要求的结果(穷举)。 • 可读性 • 健壮性 • 效率与存储需求。
1.程序运行所耗费的时间(由下列因素决定): • 算法所选用的策略 • 问题的规模 • 书写程序所采用的语言 • 编译程序所产生的机器代码的质量 • 机器执行指令的速度 • 一个算法耗费的时间=算法中每条语句的执行时间之和。 • 若不考虑机器硬、软件因素,可以认为算法“运行工作量”的大小是问题规模的函数。 四、算法的度量:
四、算法的度量: • 2.问题的规模(size)---n • 算法求解问题的输入量(或初始数据量)。 3.不考虑机器软硬件环境时算法的时间耗费: • 设:执行每条语句所需时间为单位时间,则: • 一个算法耗费的时间=所有语句的频度之和。 • 时间复杂度T(n)--- • 即:时间耗费,它是算法求解问题n的函数。 • 渐近时间复杂度--- • 即当问题的规模n→∞时的时间复杂度T(n)的数量级(阶),记作:T(n)=O(f(n)) • 评价一个算法的时间性能,主要标准是算法的渐近时间复杂度
四、算法的度量: • 4.算法度量主要指标 频度:语句在算法中重复的次数。 • (渐进)时间复杂度:T(n)=O(f(n)) • (渐进)空间复杂度:S(n)=O(f(n)) • 频度 • 1 • n • n-1 • n-1 • 时间复杂度: • T(n)=O(f(n))=O(3n-1)=O(n) • 例.i=1; • while (i<n) • {x=x+1; • i=i+1;} • 空间复杂度: • S(n)=O(f(n))=O(3)=O(1)
例1.x=0; • for(i=1;i<=n;++i) • for(j=1;j<=n;++j) • for(k=1;k<=n;++k) • ++x; 四、算法的度量: • 例2.scanf(&x); • i=0; • while(i<n&&a[i]==x) • ++i;
例1: • fact=1; • for (i=1;i<=n;i++) • fact*=i; • 例2: • sum=0; • for (i=1;i<=n;i++) • for (j=1;j<=n;j++) • sum+=a[i][j]; • 问题:两个程序哪个快呢?
假如加法速度是乘法的10倍. • 你可能会认为: • 10*n与n*n当n的取值不同时,结果不同. • 但算法分析的结论是: • 程序1的渐进时间复杂度底,因此更优.
思考题: • 计算下列程序中每条语句的频度: • 1. count=1; • for(i=1;i<=n;i++) • for(j=1;j<=i;j++) • for(k=1;k<=j;k++) • count++; • 2. i=n;j=0; • while (i>(j+1)*(j+1)) • j++;
例、储油点问题 • 一辆重型卡车欲穿过1000公里的沙漠,卡车耗油为1升/公里,卡车总载油能力为500升。因此司机必须设法在沿途建立几个储油点,使卡车能顺利穿过沙漠,试问司机如何建立这些储油点?每个储油点应存多少油,才能使卡车以消耗最少油的代价通过沙漠?
例、渡河问题 • 一个人带了一只狼、一只山羊和一棵白菜想要渡河。河上有一只独木船,每次除人外只能带一样东西,另外如果人不在时狼就要吃山羊,羊就要吃白菜。问应该怎样安排渡河,才能做到既把所有东西都带过河,而且在河上来回的次数又最少? • 设M代表人,W代表狼,S代表山羊,V代表白菜。
例、渡河问题 • 算法思想: 用集合表示在某岸上的所有情况(16种): [MWSV] [MWS] [MWV] [MSV][WSV] [MW][MS][MV] [WS][WV][SV] [M][S] [V] [空] 剩下的10种情况,按若甲经过一次渡河可变成乙,那么就在甲与乙之间连一条边,由此得到如下图G: MWSV MWS MWV MSV MS WV W S V 空 结论:在G中找一条连接顶点MWSV与空,并且包含边数最少的路.
考虑下面swap函数的代码其中有语法错误吗?这个函数达到它的预期目标了吗?考虑下面swap函数的代码其中有语法错误吗?这个函数达到它的预期目标了吗? • void swap(int&a,int &b) • { int& tmp=b; • b=a; • a=tmp; • }
1.5 描述算法 Java语言描述算法。 1.Java程序结构 (1)Java程序的两种类型:应用程序和applet • 区别:应用程序的主方法为main,其可在命令行中用命令 语句java 应用程序名来执行; • applet的主方法为init,其必须嵌入HTML文件,由Web浏览器或applet阅读器来执行。 (2)包:java程序和类可以包(packages)的形式组织管理。 (3)import语句:在java程序中可用import语句加载所需的包。 • 例如,import java.io.*;语句加载java.io包。
2.Java数据类型 • 对基本数据类型:在声明一个具有基本数据类型的变 • 量时,自动建立该数据类型的对象(或称实例)。 • 如:int k; • 对非基本数据类型:语句 String s; 并不建立具有数据类型String的对象,而是建立一个类型String的引用对象,数据类型为String的对象可用下面的new语句建立。 s = new String(“Welcome”); String s = new String(“Welcome”);
3.方法 在Java中,执行特定任务的函数或过程统称为方法(methods) 。例如,java的Math类给出的常见数学计算的方法如下表所示:
计算表达式 值的自定义方法ab描述如下: • 3.方法 public static int ab(int a, int b) { return (a+b+Math.abs(a-b))/2; } (1)方法参数:Java中所有方法的参数均为值参数。上述方法ab中,a和b 是形式参数,在调用方法时通过实际参数赋值。 (2)方法重载:Java允许方法重载,即允许定义有不同签名的同名方法。 上述方法ab可重载为: public static double ab(double a, double b) { return (a+b+Math.abs(a-b))/2.0; }
4.异常 Java的异常提供了一种处理错误的方法。当程序发现一个错误,就引发一个异常,以便在合适地方捕获异常并进行处理。 通常用try块来定义异常处理。每个异常处理由一个catch语句组成。 public static void main(String [] args) { try { f ( ); } catch (exception1) { 异常处理; } catch (exception2) { 异常处理; } … finally { finally块; } }
公有(public) 私有(private) 保护(protected) 5.Java的类 Java的类一般由4个部分组成: (1)类名 (2)数据成员 (3)方法 (4)访问修饰
6.通用方法 下面的方法swap用于交换一维整型数组a的位置i和位置j处的值。 public static void swap(int [] a, int i, int j) { int temp = a[i]; a[i] = a[j]; a[j] = temp; } 该方法只适用于 整型数组 以上方法修改如下: public static void swap(object [] a, int i, int j) { object temp = a[i]; a[i] = a[j]; a[j] = temp; } 该方法具有通用性,适用于Object类型及其所有子类
7.垃圾收集 8.递归 Java的new运算用于分配所需的内存空间。 例如, int [] a = new int[500000]; 分配2000000字节空间 给整型数组a。频繁用new分配空间可能会耗尽内存。Java的垃 圾收集器会适时扫描内存,回收不用的空间(垃圾)给new重新 分配。 public static int sum(int [] a, int n) { if (n==0) return 0; else return a[n-1]+sum(a,n-1); } 计算一维整型数组前n个元素之和的递归方法
Java语言的特点 Java= “C++”--“复杂性和奇异性”+“安全性和可移植性” • Java由那些特性? • (1) 面向对象 • 封装性、多态性、继承性、动态链接 • (2) 操作平台无关性 • 严格的语言定义:“没有依据机器的不同而不同” 或“由编译器决定”等字眼,最后的目标码都是一致的,初值都是确定的
Java interpreter Just-in-time compiler Runtime System Operating System Hardware • Java虚拟机 不同的操作系统有不同的虚 拟机. 它类似一个小巧而高效的CPU. byte-code代码是与平台无关的 是虚拟机的机器指令. Java字节代码运行的两种方式: interpreter(解释方式) Just-in-time(即时编译):由代码 生成器将字节代码转换成本机 的机器代码,然后可以以较高速 度执行.
(3) 安全问题 • Java是在网络环境下使用的语言 • 一个安全的网络至少要防止以下几种破坏的可能性: • 毁灭系统资源 • 消耗系统资源 • 挖掘系统或个人机密 • 骚扰正常工作的进行
限定对象的 存取权限 系统堆栈溢出 参数类型一致 Java源程序 (.java文件) Bytecode 载入器 Bytecode检查 Java编译器 Bytecode 解释器 程序执行系统 Java Bytecode (.class文件) 系统执行平台 WWW浏览器 限制Java小应用程序 的不正当使用
(4) 多线程 • Java提供现成的类Thread,只要继承这个类就可以编写多线程的程序。 • (5) Java与C及C++的区别 • 不再有#include 和#define 等于处理功能 • 不再有structure,union及typedef • 不再有函数、不再有指针、不再有多重继承 • 不再有goto • 不再有操作符重载(Operatior Overloading) • 取消自动类型转换,要求强制转换
Java的开发环境 • Java开发环境 JDK • JDK中有Java编译器和bytecode解释器Applwtviewer是小应用程序的bytecode解释器 • JDK的安装 • 直接执行JDK.exe
产生如下目录结构 java\bin的目录下包含义下主要文件: javac: Java编译器, 用来将java程序编译成 Bytecode java: Java编译器,执行已经转换成Bytecode的 java应用程序. jdb: Java调试器, 用来调试java程序 javap: 反编译,将类文件还原回方法和变量. javadoc:文档生成器,创建HTML文件 appletviwer : Java解释器, 用来解释已经转换成 Bytecode的java小应用程序.
JAVA 的API中的类组织成8个包 • Java.applet 包含所有的实现的applets的类 • Java.awt 包含抽象窗口工作集中的图形/文 • (java.awt.image) 本/窗口/GUI类 (java.awt.peer) Java.io 包含所有的输入输出类 java.lang 包含所有的基本语言类 java.net 包含所有实现网络功能的类 java.util 包含有用的数据类型类
class HelloWorldApp { public static void main(String args[]) { System.out.println(“Hi, ”+args[0]); } } • Java应用和Java小应用程序 • 编辑存盘:主类名(含有main方法)和 文件名要一致性 HelloWorldApp.java • 编译程序 : javac HelloWorldApp.java • 运行程序 : java HelloWorldApp “myjava” • 运行结果 : Hi, myjava