算法设计与分析 Algorithm Design and Analysis

Slides:



Advertisements
Similar presentations
主要内容 Java 的常用包 Java 的常用包 “ == ” 和 “ equals ” 的用法 “ == ” 和 “ equals ” 的用法 基本数据类型与引用类型 基本数据类型与引用类型 String 和 StringBuffer String 和 StringBuffer 对象的克隆( clone.
Advertisements

Java 程序分类 Java Application :是完整程序,需要独立的解 释器解释运行;以 “.java” 为后缀的文件,以 main() 方法作为程序入口,由 java 编译器编译生 成字节码,由 Java 解释器加载执行字节码。 Java Applet 没有 main() 方法作为程序入口,是嵌在.
单元二:面向对象程序设计 任务二:借书卡程序设计.
第四章 类、对象和接口.
第三讲 面向对象(上).
3.2 Java的类 Java 类库的概念 语言规则——程序的书写规范 Java语言 类库——已有的有特定功能的Java程序模块
JAVA 编 程 技 术 主编 贾振华 2010年1月.
第一單元 建立java 程式.
项目6 通用堆栈.
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
Introduction 基本概念 授課老師:蕭志明
第一章 資料結構導論 1-1 資料結構簡介 1-2 認識程式設計 1-3 演算法效能分析 1-4 物件導向程式設計與Java.
算法设计与分析 李清勇 教授 办公室:第九教学楼北201.
Java程序设计教程 第一讲 Java概述.
四資二甲 第三週作業 物件導向程式設計.
南京理工大学 第2章 Java基本语法 本章我们将学习Java编程语言的基本语法,包括变量、操作符、表达式、语句、字符串、数组、控制流以及如何使用帮助文档。 使用下面的编程框架: public class Test{ public static void main(String []args){ //以下添加测试代码.
第二章 JAVA语言基础.
第二部分 Java语言基础篇 第4章 Java语言与面向对象 (之一).
JAVA程序设计 (03) JAVA Programming
第5章 异常处理 王德俊 上海交通大学继续教育学院.
2.1 基本資料型別 2.2 變數 2.3 運算式與運算子 2.4 輸出與輸入資料 2.5 資料型別轉換 2.6 實例
第5章 面向对象程序设计 本章要点 5.1 面向对象程序设计概述 5.2 Java语言的面向对象程序设计 5.3 方法的使用和对象数组
物件導向程式設計 (Object-Oriented rogramming)
常用工具类.
實作輔導 日期: 3/11 09:10~16:00 地點:臺北市立大學 臺北市中正區愛國西路一號 (中正紀念堂站7號出口)
第3章 語法入門 第一個Java程式 文字模式下與程式互動 資料、運算 流程控制.
JAVA 编 程 技 术 主编 贾振华 2010年1月.
本單元介紹何謂變數,及說明變數的宣告方式。
西南科技大学网络教育系列课程 高级语程序设计(Java) 第五章 继承、接口与范型.
JAVA程序设计 第5章 深入理解JAVA语言----补充.
程式設計實作.
第2章回顾 标识符:不用记,动手 关键字:if, else, switch, for, while, do, break, continue, void, …… 局部变量和成员变量 ①变量作用域 ②内存布局 基本数据类型 ①4类8种 ②互相转换 流程控制语句 ①分支 if……else, switch.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
程式撰寫流程.
Java程序设计 第9章 继承和多态.
第三章 流程控制與例外處理 資訊教育研究室 製作 注意:本投影片僅供上課使用,非經同意,請勿散播或轉載。
QQ: 李祥 QQ: 欢迎多种方式的学习交流,祝大家学有所成.
3.1 数据类型 3.2 标识符与关键字 3.3 常量 3.4 变量 3.5 运算符与表达式 3.6 一个编程实例
2019/1/17 Java语言程序设计-程序流程 教师:段鹏飞.
异常及处理.
Java程序设计 第2章 基本数据类型及操作.
Ch02-基礎語法.
C/C++/Java 哪些值不是头等程序对象
第一單元 建立java 程式.
第三章 C# 基础知识.
JAVA 编 程 技 术 主编 贾振华 2010年1月.
《JAVA程序设计》 语音答疑 辅导老师:高旻.
實作輔導 2 日期: 3/24(星期六) 09:10~16:00 地點:臺北市立大學 臺北市中正區愛國西路一號 (中正紀念堂站7號出口)
第二章Java基本程序设计.
第三课 标识符、关键字、数据类型.
第二章 Java基本语法 讲师:复凡.
第1章 绪论 2019/4/16.
Java變數 2014/6/24.
第二章 Java基本语法 讲师:复凡.
第二章 Java语法基础.
演算法分析 (Analyzing Algorithms)
第二章 类型、对象、运算符和表达式.
Review 1~3.
#include <iostream.h>
第二章 Java基本语法 讲师:复凡.
Java程序设计 第17章 异常和断言.
PPT注意事项: 当前PPT课件文件必须和提供的源代码文件夹“代码”在同一目录中即不要移动文件夹“代码”的默认位置。
JAVA 程式設計與資料結構 第三章 物件的設計.
變數、資料型態、運算子.
第2章 Java语言基础.
基本資料型態 變數與常數 運算子 基本的資料處理 授課:ANT 日期:2014/03/03.
PPT注意事项: 当前PPT课件文件必须和提供的源代码文件夹“代码”在同一目录中即不要移动文件夹“代码”的默认位置。
第 5 章 常用类的使用 伍孝金
第二章 Java基础语法 北京传智播客教育
Summary
Presentation transcript:

算法设计与分析 Algorithm Design and Analysis 上海理工大学 光电信息与计算机工程学院 高丽萍 Tel : 13761997772 Email : lipinggao@usst.edu.cn Office: Room 602(新图书馆楼602房间) 1

First Example: Identifying Genes in Human DNA (基因识别) Identifying all the 100,000 genes in human DNA determining the sequences of the 3 billion(109) chemical base pairs that make up human DNA. (30亿组化学基对组成人类DNA,如何界定这些序列,从而进行基因识别) Computer: 3G Hz CPU, 3*109B/s, suppose that it executes one billion instructions per second (设该计算机的运行速度为 10亿条基本指令/s ) Input size: n = 3*109 Insertion sort: running time n2 t = s/v :

First Example: Identifying Genes in Human DNA Identifying all the 100,000 genes in human DNA determining the sequences of the 3 billion(109) chemical base pairs that make up human DNA. Insertion sort: running time n2 Merge sort: running time nlgn 全国居民身份证管理系统: n = 1.3×109 人 国家安全防护指纹识别系统:n >= 1.3×109 人 3

Algorithm Analysis and Design Students: undergraduate, graduate Course property: base, core, ... in computing Bibliography 《Introduction to Algorithms》(Second Edition), T. H. Cormen, C. E. Leiserson, R. L. Rivest (2002, Turing Award), The MIT Press 《The Art of Computer Programming》, Donald E, Knuth 1974, Turing Award 《算法设计与分析》,吕国英编著,清华大学出版社,2005年。 《算法设计与分析》,王晓东编著,清华大学出版社 ...... 网友:“没有读过《Intro…》,不能算是一个真正的程序员” “计算机算法的圣经” “计算机程序设计 理论的荷马史诗” Kunth小传: 1. 看书一般看316页和100页 2. 看学生的作业一般看随机算法 3. Concrete Mathematics, 艺术品,所有页面都有涂鸦,《爱利丝漫游奇境记》,(白雪公主与七个小矮人,1937) Bill Gates: “如果你认为你是一名真正优秀的程序员,请读Knuth的《计算机程序设计艺术》,如果你能读懂整套书的话,请给我发一份你的简历。” 4 4

Algorithm Design and Analysis 学习方式 听课-上机实践(作业)-考试 15% 15% 70% 课堂要求 学术很自由,课堂很严肃:不迟到、早退;不允许接听电话、大声聊天… 考核形式 出勤率:about 15% 大作业(算法实现2-3个):about 15% 期末闭卷考试: about 70% 课程安排 课堂讲解:基本理论讲解,基本方法的介绍分析 上机实践:基本习题和经典习题的上机实践 5

主要内容介绍 第1章 算法引论 第2章 算法基本设计技巧 第3章 分治策略 第4章 动态规划 第5章 贪心算法 第6章 回溯法 第1章 算法引论 第2章 算法基本设计技巧 第3章 分治策略 第4章 动态规划 第5章 贪心算法 第6章 回溯法 第7章 分支限界法

第1章 算法引论 本章主要知识点: 1.1 算法与程序 1.2 表达算法的抽象机制 1.3 描述算法 1.4 算法复杂性分析

1.1 算法与程序 算法: 程序: 是满足下述性质的指令序列。 是算法用某种程序设计语言的具体实现。 1.1 算法与程序 算法: 是满足下述性质的指令序列。 输 入:有零个或多个外部量作为算法的输入。 输 出:算法产生至少一个量作为输出。 确定性:组成算法的每条指令清晰、无歧义。 有限性:算法中每条指令的执行次数有限,执行每条指令的时间也有限。 程序: 是算法用某种程序设计语言的具体实现。 程序可以不满足算法的性质(4)即有限性。

1.2 表达算法的抽象机制 高级程序设计语言的主要好处是: 1.从机器语言到高级语言的抽象 1.2 表达算法的抽象机制 1.从机器语言到高级语言的抽象 高级程序设计语言的主要好处是: (1)高级语言更接近算法语言,易学、易掌握,一般工程技术人员只需 要几周时间的培训就可以胜任程序员的工作; (2)高级语言为程序员提供了结构化程序设计的环境和工具,使得设计出来的程序可读性好,可维护性强,可靠性高; (3)高级语言不依赖于机器语言,与具体的计算机硬件关系不大,因而所写出来的程序可植性好、重用率高; (4)把繁杂琐碎的事务交给编译程序,所以自动化程度高,开发周期短,程序员可以集中时间和精力从事更重要的创造性劳动,提高程序质量。

1.2 表达算法的抽象机制 抽象数据类型带给算法设计的好处有: 抽象数据类型是算法的一个数据模型连同定义在该模型上 1.2 表达算法的抽象机制 2.抽象数据类型 抽象数据类型是算法的一个数据模型连同定义在该模型上 并作为算法构件的一组运算。 抽象数据类型带给算法设计的好处有: (1)算法顶层设计与底层实现分离; (2)算法设计与数据结构设计隔开,允许数据结构自由选择; (3)数据模型和该模型上的运算统一在ADT中,便于空间和时间耗费的折衷; (4)用抽象数据类型表述的算法具有很好的可维护性; (5)算法自然呈现模块化; (6)为自顶向下逐步求精和模块化提供有效途径和工具; (7)算法结构清晰,层次分明,便于算法正确性的证明和复杂性的分析。

1.3 描述算法 在本书中,采用Java语言描述算法。 以下,对Java语言的若干重要特性作简要概述。 1.3 描述算法 在本书中,采用Java语言描述算法。 1.Java程序结构 以下,对Java语言的若干重要特性作简要概述。 (1)Java程序的两种类型:应用程序和applet 区别:应用程序的主方法为main,其可在命令行中用命令 语句 java 应用程序名 来执行; applet的主方法为init,其必须嵌入HTML文件,由 Web浏览器或applet阅读器来执行。 (2)包:java程序和类可以包(packages)的形式组织管理。 (3)import语句:在java程序中可用import语句加载所需的包。 例如,import java.io.*;语句加载java.io包。

1.3 描述算法 数据类型 Java对两种数据类型的不同处理方式: 基本数据类型:详见下页表1-1 1.3 描述算法 2.Java数据类型 数据类型 基本数据类型:详见下页表1-1 非基本数据类型:如 Byte, Integer, Boolean, String等。 Java对两种数据类型的不同处理方式: 对基本数据类型:在声明一个具有基本数据类型的变量时,自 动建立该数据类型的对象(或称实例)。如:int k; 对非基本数据类型:语句 String s; 并不建立具有数据类型 String的对象,而是建立一个类型String的引用对象, 数据类型为String的对象可用下面的new语句建立。 s = new String(“Welcome”); String s = new String(“Welcome”);

1.3 描述算法 表格1-1 Java基本数据类型 类型 缺省值 分配空间(bits) 取值范围 boolean false 1 1.3 描述算法 表格1-1 Java基本数据类型 类型 缺省值 分配空间(bits) 取值范围 boolean false 1 [true,false] byte 8 [-128,127] char \u0000 16 [\u0000,\uFFFF] double 0.0 64 ±4.9*10-324 ~ ±1.8*10308 float 32 ±1.4*10-45 ~ ±3.4*1038 int [-2147483648,2147483647] long ±9.2*1017 short [-32768,32767]

1.3 描述算法 在Java中,执行特定任务的函数或过程统称为方法(methods) 。 1.3 描述算法 3.方法 在Java中,执行特定任务的函数或过程统称为方法(methods) 。 例如,java的Math类给出的常见数学计算的方法如下表所示: 方法 功能 abs(x) x的绝对值 max(x,y) x和y中较大者 ceil(x) 不小于x的最小整数 min(x,y) x和y中较小者 cos(x) x的余弦 pow(x,y) xy exp(x) ex sin(x) x的正弦 floor(x) 不大于x的最大整数 sqrt(x) x的平方根 log(x) x的自然对数 tan(x) x的正切

1.3 描述算法 3.方法 计算表达式 值的自定义方法ab描述如下: public static int ab(int a, int b) 1.3 描述算法 3.方法 计算表达式 值的自定义方法ab描述如下: 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; }

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

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

1.3 描述算法 6.通用方法 下面的方法swap用于交换一维整型数组a的位置i和位置j处的值。 1.3 描述算法 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类型及其所有子类

1.3 描述算法 6.通用方法 (1)Computable界面 1.3 描述算法 6.通用方法 (1)Computable界面 public static Computable sum(Computable [] a, int n) { if (a.length == 0) return null; Computable sum = (Computable) a[0].zero(); for (int i = 0; i < n; i++) sum.increment(a[i]); return sum; } 利用此界面使 方法sum通用化

1.3 描述算法 6.通用方法 (2)java.lang.Comparable 界面 1.3 描述算法 6.通用方法 (2)java.lang.Comparable 界面 Java的Comparable 界面中惟一的方法头compareTo用于比较 2个元素的大小。例如java.lang.Comparable.x.compareTo(y) 返回x-y的符号,当x<y时返回负数,当x=y时返回0,当x>y时返 回正数。 (3)Operable 界面 有些通用方法同时需要Computable界面和Comparable 界面 的支持。为此可定义Operable界面如下: public interface Operable extends Computable, Comparable {} (4)自定义包装类 由于Java的包装类如Integer等已定义为final型,因此无法 定义其子类,作进一步扩充。为了需要可自定义包装类。

1.3 描述算法 Java的new运算用于分配所需的内存空间。 1.3 描述算法 7.垃圾收集 8.递归 Java的new运算用于分配所需的内存空间。 例如, int [] a = new int[500000]; 分配2000000字节空间 给整型数组a。频繁用new分配空间可能会耗尽内存。Java的垃 圾收集器会适时扫描内存,回收不用的空间(垃圾)给new重新分配。 Java允许方法调用其自身。这类方法称为递归方法。 public static int sum(int [] a, int n) { if (n==0) return 0; else return a[n-1]+sum(a,n-1); } 计算一维整型数组前n个元素之和的递归方法

1.4 算法复杂性分析 需要时间资源的量称为时间复杂性,需要的空间资源的 量称为空间复杂性。这个量应该只依赖于算法要解的问 1.4 算法复杂性分析 算法复杂性是算法运行所需要的计算机资源的量, 需要时间资源的量称为时间复杂性,需要的空间资源的 量称为空间复杂性。这个量应该只依赖于算法要解的问 题的规模、算法的输入和算法本身的函数。如果分别用 N、I和A表示算法要解问题的规模、算法的输入和算法 本身,而且用C表示复杂性,那么,应该有C=F(N,I,A)。 一般把时间复杂性和空间复杂性分开,并分别用T和S来 表示,则有: T=T(N,I)和S=S(N,I) 。 (通常,让A隐含在复杂性函数名当中)

1.4 算法复杂性分析 最坏情况下的时间复杂性: 最好情况下的时间复杂性: 平均情况下的时间复杂性: 1.4 算法复杂性分析 最坏情况下的时间复杂性: 最好情况下的时间复杂性: 平均情况下的时间复杂性: 其中DN是规模为N的合法输入的集合;I*是DN中使T(N, I*) 达到Tmax(N)的合法输入; 是中使T(N, )达到Tmin(N)的合法 输入;而P(I)是在算法的应用中出现输入I的概率。

1.4 算法复杂性分析 算法复杂性在渐近意义下的阶: 渐近意义下的记号:O、Ω、θ、o 设f(N)和g(N)是定义在正数集上的正函数。 1.4 算法复杂性分析 算法复杂性在渐近意义下的阶: 渐近意义下的记号:O、Ω、θ、o 设f(N)和g(N)是定义在正数集上的正函数。 O的定义:如果存在正的常数C和自然数N0,使得当NN0时有f(N)Cg(N),则称函数f(N)当N充分大时上有界,且g(N)是它的一个上界,记为f(N)=O(g(N))。即f(N)的阶不高于g(N)的阶。 根据O的定义,容易证明它有如下运算规则: (1)O(f)+O(g)=O(max(f,g)); (2)O(f)+O(g)=O(f+g); (3)O(f)O(g)=O(fg); (4)如果g(N)=O(f(N)),则O(f)+O(g)=O(f); (5)O(Cf(N))=O(f(N)),其中C是一个正的常数; (6)f=O(f)。

1.4 算法复杂性分析 Ω的定义:如果存在正的常数C和自然数N0,使得当NN0时 1.4 算法复杂性分析 Ω的定义:如果存在正的常数C和自然数N0,使得当NN0时 有f(N)Cg(N),则称函数f(N)当N充分大时下有界,且g(N)是它 的一个下界,记为f(N)=Ω(g(N))。即f(N)的阶不低于g(N)的阶。 θ的定义:定义f(N)= θ(g(N))当且仅当f(N)=O(g(N))且 f(N)= Ω(g(N))。此时称f(N)与g(N)同阶。 o的定义:对于任意给定的ε>0,都存在正整数N0,使得 当NN0时有f(N)/Cg(N)ε,则称函数f(N)当N充分大时的阶比 g(N)低,记为f(N)=o(g(N))。 例如,4NlogN+7=o(3N2+4NlogN+7)。