1 / 41

算法分析与设计

算法分析与设计. 授 课: 课件制作: 单 位:. 吴磊 电子科技大学. Email: wulei@uestc.edu.cn www.uestc.edu.cn--- > 教师社区 ---> 吴磊. 第一章 绪 论. 1.1数据结构的定义和地位  1.2 数据结构的基本术语  1.3 算法和算法分析  1.4 算法与程序  1.5 描述算法. §1.1 数据结构的定义和地位. 什么是程序、软件? N. 沃思( Niklaus Wirth) 教授提出: 程序=算法+数据结构 以上公式说明了如下两个问题:

sean-morrow
Download Presentation

算法分析与设计

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 算法分析与设计 授 课: 课件制作: 单 位: 吴磊 电子科技大学 Email: wulei@uestc.edu.cn www.uestc.edu.cn--->教师社区--->吴磊

  2. 第一章 绪 论 • 1.1数据结构的定义和地位 • 1.2数据结构的基本术语 • 1.3算法和算法分析 • 1.4算法与程序 • 1.5描述算法

  3. §1.1 数据结构的定义和地位 • 什么是程序、软件? • N.沃思(Niklaus Wirth)教授提出: 程序=算法+数据结构 • 以上公式说明了如下两个问题: • (1)数据上的算法决定如何构造和组织数据(算法→数据结构)。 • (2)算法的选择依赖于作为基础的数据结构(数据结构→算法)。 软件=程序+文档(软件工程的观点)

  4. 数值计算解决问题的一般步骤: • 数学模型→选择计算机语言→编出程序→测试→最终解答。 • 数值计算的关键是:如何得出数学模型(方程)? • 程序设计人员比较关注程序设计的技巧。 • 非数值计算问题: • 数据元素之间的相互关系一般无法用数学方程加以描述。 • 例1.1 电话号码查询问题: • (1)按顺序存储方式:遍历表 • (2)按姓氏索引方式:要写出好的查找算法,取决于这张表的结构及存储方式。 • 电话号码表的结构和存储方式决定了查找(算法)的效率。

  5. 例1.2 田径赛的时间安排问题(无向图的着色问题) : 设有六个比赛项目,规定每个选手至多可参加三个项目,有五人报名参加比赛(如下表所示)设计比赛日程表,使得在尽可能短的时间内完成比赛。

  6. 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)

  7. …….. …….. …... …... …... …... • 例1.3 人机对弈:树形结构

  8. §1.2 数据结构的基本术语 • 1.数据,数据对象和数据元素 • 数据是对客观事物的符号表示,是指计算机能处理的符号的总称。 • (其他定义类似见书) • 2.数据结构 • 数据结构(Data Structure)是相互之间存在一种或多种特定关系的数据元素的集合。通常有四种结构: •    (1)集合 •    (2)线形结构 •    (3)树型结构 •    (4)图状结构或网状结构

  9. 3.逻辑结构和物理结构 • 逻辑结构:数据元素间抽象化的相互关系(即数据结构) • 与数据的存储无关,独立于计算机,它是从具体问题 • 抽象出来的数学模型。 物理结构(存储结构): • 数据元素及其关系在计算机存储器中的存储方式。 • 是逻辑结构用计算机语言的实现,它依赖于计算机语言。 小结: (1)数据的逻辑结构、存储结构和数据的运算(算法)构成了数据结构三个方面的含义。 (2)程序设计的实质是对实际问题选择一个好的数据结构,加之设计一个好的算法。而好的算法在很大程度上取决于描述实际问题的数据结构。

  10. 4.数据类型 • 抽象数据类型(Abstract Data Type)是指一个数学模型以及定义在该模型上的一组操作。 •   ADT 抽象数据类型{ •       数据对象:<数据对象的定义> •       数据关系:<数据关系的定义> •       数据操作:<数据操作的定义> •   }ADT 抽象数据类型名 • 5.算法 • 所谓算法(Algorithm)是描述计算机解决给定问题的操作过程(解题方法),即为解决某一特定问题而由若干条指令组成的有穷序列。

  11. §1.3 算法和算法分析 • 一、算法的表示和实现: • 描述---可采用自然语言、数学语言或约定的符号语言。 • 实现---必须借助程序设计语言提供的数据类型及其运算 • 二、算法的定义和特性: • 有穷性: 执行了有限条指令后一定要终止。 • 确定性:算法的每一步操作都必须有确切定义,不得有任何歧义性。 • 可行性:算法的每一步操作都必须是可行的,即每步操作均能在有限时间内完成。 • 输入:一个算法有n(n>=0)个初始数据的输入。 • 输出:一个算法有一个或多个与输入有某种关系的有效信息的输出。 • 思考题:算法和程序主要区别是什么?

  12. 三、算法设计的要求: • 正确性 • (1)不含语法错误 • (2)程序对于n组输入数据能够得出满足规格说明要求的结果。 • (3)程序对于精心选择的典型、边界性的n组输入数据能得出满足规格说明要求的结果。 • (4)程序对于一切合适的输入数据都能得出满足规格说明要求的结果(穷举)。 • 可读性 • 健壮性 • 效率与存储需求。

  13. 1.程序运行所耗费的时间(由下列因素决定): • 算法所选用的策略 • 问题的规模 • 书写程序所采用的语言 • 编译程序所产生的机器代码的质量 • 机器执行指令的速度 • 一个算法耗费的时间=算法中每条语句的执行时间之和。 • 若不考虑机器硬、软件因素,可以认为算法“运行工作量”的大小是问题规模的函数。 四、算法的度量:

  14. 四、算法的度量: • 2.问题的规模(size)---n • 算法求解问题的输入量(或初始数据量)。 3.不考虑机器软硬件环境时算法的时间耗费: • 设:执行每条语句所需时间为单位时间,则: • 一个算法耗费的时间=所有语句的频度之和。 • 时间复杂度T(n)--- • 即:时间耗费,它是算法求解问题n的函数。 • 渐近时间复杂度--- • 即当问题的规模n→∞时的时间复杂度T(n)的数量级(阶),记作:T(n)=O(f(n)) • 评价一个算法的时间性能,主要标准是算法的渐近时间复杂度

  15. 四、算法的度量: • 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)

  16. 例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;

  17. 例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]; • 问题:两个程序哪个快呢?

  18. 假如加法速度是乘法的10倍. • 你可能会认为: • 10*n与n*n当n的取值不同时,结果不同. • 但算法分析的结论是: • 程序1的渐进时间复杂度底,因此更优.

  19. 思考题: • 计算下列程序中每条语句的频度: • 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++;

  20. 例、储油点问题 • 一辆重型卡车欲穿过1000公里的沙漠,卡车耗油为1升/公里,卡车总载油能力为500升。因此司机必须设法在沿途建立几个储油点,使卡车能顺利穿过沙漠,试问司机如何建立这些储油点?每个储油点应存多少油,才能使卡车以消耗最少油的代价通过沙漠?

  21. 例、渡河问题 • 一个人带了一只狼、一只山羊和一棵白菜想要渡河。河上有一只独木船,每次除人外只能带一样东西,另外如果人不在时狼就要吃山羊,羊就要吃白菜。问应该怎样安排渡河,才能做到既把所有东西都带过河,而且在河上来回的次数又最少? • 设M代表人,W代表狼,S代表山羊,V代表白菜。

  22. 例、渡河问题 • 算法思想: 用集合表示在某岸上的所有情况(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与空,并且包含边数最少的路.

  23. 考虑下面swap函数的代码其中有语法错误吗?这个函数达到它的预期目标了吗?考虑下面swap函数的代码其中有语法错误吗?这个函数达到它的预期目标了吗? • void swap(int&a,int &b) • { int& tmp=b; • b=a; • a=tmp; • }

  24. 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包。

  25. 2.Java数据类型 • 对基本数据类型:在声明一个具有基本数据类型的变 • 量时,自动建立该数据类型的对象(或称实例)。 • 如:int k; • 对非基本数据类型:语句 String s; 并不建立具有数据类型String的对象,而是建立一个类型String的引用对象,数据类型为String的对象可用下面的new语句建立。 s = new String(“Welcome”); String s = new String(“Welcome”);

  26. 3.方法 在Java中,执行特定任务的函数或过程统称为方法(methods) 。例如,java的Math类给出的常见数学计算的方法如下表所示:

  27. 计算表达式 值的自定义方法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; }

  28. 4.异常 Java的异常提供了一种处理错误的方法。当程序发现一个错误,就引发一个异常,以便在合适地方捕获异常并进行处理。 通常用try块来定义异常处理。每个异常处理由一个catch语句组成。 public static void main(String [] args) { try { f ( ); } catch (exception1) { 异常处理; } catch (exception2) { 异常处理; } … finally { finally块; } }

  29. 公有(public) 私有(private) 保护(protected) 5.Java的类 Java的类一般由4个部分组成: (1)类名 (2)数据成员 (3)方法 (4)访问修饰

  30. 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类型及其所有子类

  31. 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个元素之和的递归方法

  32. Java语言的特点 Java= “C++”--“复杂性和奇异性”+“安全性和可移植性” • Java由那些特性? • (1) 面向对象 • 封装性、多态性、继承性、动态链接 • (2) 操作平台无关性 • 严格的语言定义:“没有依据机器的不同而不同” 或“由编译器决定”等字眼,最后的目标码都是一致的,初值都是确定的

  33. Java interpreter Just-in-time compiler Runtime System Operating System Hardware • Java虚拟机 不同的操作系统有不同的虚 拟机. 它类似一个小巧而高效的CPU. byte-code代码是与平台无关的 是虚拟机的机器指令. Java字节代码运行的两种方式: interpreter(解释方式) Just-in-time(即时编译):由代码 生成器将字节代码转换成本机 的机器代码,然后可以以较高速 度执行.

  34. (3) 安全问题 • Java是在网络环境下使用的语言 • 一个安全的网络至少要防止以下几种破坏的可能性: • 毁灭系统资源 • 消耗系统资源 • 挖掘系统或个人机密 • 骚扰正常工作的进行

  35. 限定对象的 存取权限 系统堆栈溢出 参数类型一致 Java源程序 (.java文件) Bytecode 载入器 Bytecode检查 Java编译器 Bytecode 解释器 程序执行系统 Java Bytecode (.class文件) 系统执行平台 WWW浏览器 限制Java小应用程序 的不正当使用

  36. (4) 多线程 • Java提供现成的类Thread,只要继承这个类就可以编写多线程的程序。 • (5) Java与C及C++的区别 • 不再有#include 和#define 等于处理功能 • 不再有structure,union及typedef • 不再有函数、不再有指针、不再有多重继承 • 不再有goto • 不再有操作符重载(Operatior Overloading) • 取消自动类型转换,要求强制转换

  37. Java的开发环境 • Java开发环境 JDK • JDK中有Java编译器和bytecode解释器Applwtviewer是小应用程序的bytecode解释器 • JDK的安装 • 直接执行JDK.exe

  38. 产生如下目录结构 java\bin的目录下包含义下主要文件: javac: Java编译器, 用来将java程序编译成 Bytecode java: Java编译器,执行已经转换成Bytecode的 java应用程序. jdb: Java调试器, 用来调试java程序 javap: 反编译,将类文件还原回方法和变量. javadoc:文档生成器,创建HTML文件 appletviwer : Java解释器, 用来解释已经转换成 Bytecode的java小应用程序.

  39. JAVA 的API中的类组织成8个包 • Java.applet 包含所有的实现的applets的类 • Java.awt 包含抽象窗口工作集中的图形/文 • (java.awt.image) 本/窗口/GUI类 (java.awt.peer) Java.io    包含所有的输入输出类 java.lang 包含所有的基本语言类 java.net   包含所有实现网络功能的类 java.util   包含有用的数据类型类

  40. 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

More Related