Download presentation
Presentation is loading. Please wait.
1
算法设计与分析 Algorithm Design and Analysis
上海理工大学 光电信息与计算机工程学院 高丽萍 Tel : Office: Room 602(新图书馆楼602房间) 1
2
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 :
3
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
4
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
5
Algorithm Design and Analysis
学习方式 听课-上机实践(作业)-考试 15% 15% % 课堂要求 学术很自由,课堂很严肃:不迟到、早退;不允许接听电话、大声聊天… 考核形式 出勤率:about 15% 大作业(算法实现2-3个):about 15% 期末闭卷考试: about 70% 课程安排 课堂讲解:基本理论讲解,基本方法的介绍分析 上机实践:基本习题和经典习题的上机实践 5
6
主要内容介绍 第1章 算法引论 第2章 算法基本设计技巧 第3章 分治策略 第4章 动态规划 第5章 贪心算法 第6章 回溯法
第1章 算法引论 第2章 算法基本设计技巧 第3章 分治策略 第4章 动态规划 第5章 贪心算法 第6章 回溯法 第7章 分支限界法
7
第1章 算法引论 本章主要知识点: 1.1 算法与程序 1.2 表达算法的抽象机制 1.3 描述算法 1.4 算法复杂性分析
8
1.1 算法与程序 算法: 程序: 是满足下述性质的指令序列。 是算法用某种程序设计语言的具体实现。
1.1 算法与程序 算法: 是满足下述性质的指令序列。 输 入:有零个或多个外部量作为算法的输入。 输 出:算法产生至少一个量作为输出。 确定性:组成算法的每条指令清晰、无歧义。 有限性:算法中每条指令的执行次数有限,执行每条指令的时间也有限。 程序: 是算法用某种程序设计语言的具体实现。 程序可以不满足算法的性质(4)即有限性。
9
1.2 表达算法的抽象机制 高级程序设计语言的主要好处是: 1.从机器语言到高级语言的抽象
1.2 表达算法的抽象机制 1.从机器语言到高级语言的抽象 高级程序设计语言的主要好处是: (1)高级语言更接近算法语言,易学、易掌握,一般工程技术人员只需 要几周时间的培训就可以胜任程序员的工作; (2)高级语言为程序员提供了结构化程序设计的环境和工具,使得设计出来的程序可读性好,可维护性强,可靠性高; (3)高级语言不依赖于机器语言,与具体的计算机硬件关系不大,因而所写出来的程序可植性好、重用率高; (4)把繁杂琐碎的事务交给编译程序,所以自动化程度高,开发周期短,程序员可以集中时间和精力从事更重要的创造性劳动,提高程序质量。
10
1.2 表达算法的抽象机制 抽象数据类型带给算法设计的好处有: 抽象数据类型是算法的一个数据模型连同定义在该模型上
1.2 表达算法的抽象机制 2.抽象数据类型 抽象数据类型是算法的一个数据模型连同定义在该模型上 并作为算法构件的一组运算。 抽象数据类型带给算法设计的好处有: (1)算法顶层设计与底层实现分离; (2)算法设计与数据结构设计隔开,允许数据结构自由选择; (3)数据模型和该模型上的运算统一在ADT中,便于空间和时间耗费的折衷; (4)用抽象数据类型表述的算法具有很好的可维护性; (5)算法自然呈现模块化; (6)为自顶向下逐步求精和模块化提供有效途径和工具; (7)算法结构清晰,层次分明,便于算法正确性的证明和复杂性的分析。
11
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包。
12
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”);
13
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* ~ ±1.8*10308 float 32 ±1.4*10-45 ~ ±3.4*1038 int [ , ] long ±9.2*1017 short [-32768,32767]
14
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的正切
15
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; }
16
1.3 描述算法 Java的异常提供了一种处理错误的方法。当程序发现一个错误,就引发一个异常,以便在合适地方捕获异常并进行处理。
1.3 描述算法 4.异常 Java的异常提供了一种处理错误的方法。当程序发现一个错误,就引发一个异常,以便在合适地方捕获异常并进行处理。 通常用try块来定义异常处理。每个异常处理由一个catch语句组成。 public static void main(String [] args) { try { f ( ); } catch (exception1) { 异常处理; } catch (exception2) … finally { finally块; } }
17
1.3 描述算法 Java的类一般由4个部分组成: (1)类名 (2)数据成员 (3)方法 公有(public) 私有(private)
1.3 描述算法 5.Java的类 Java的类一般由4个部分组成: (1)类名 (2)数据成员 (3)方法 公有(public) 私有(private) 保护(protected) (4)访问修饰
18
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类型及其所有子类
19
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通用化
20
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型,因此无法 定义其子类,作进一步扩充。为了需要可自定义包装类。
21
1.3 描述算法 Java的new运算用于分配所需的内存空间。
1.3 描述算法 7.垃圾收集 8.递归 Java的new运算用于分配所需的内存空间。 例如, int [] a = new int[500000]; 分配 字节空间 给整型数组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个元素之和的递归方法
22
1.4 算法复杂性分析 需要时间资源的量称为时间复杂性,需要的空间资源的 量称为空间复杂性。这个量应该只依赖于算法要解的问
1.4 算法复杂性分析 算法复杂性是算法运行所需要的计算机资源的量, 需要时间资源的量称为时间复杂性,需要的空间资源的 量称为空间复杂性。这个量应该只依赖于算法要解的问 题的规模、算法的输入和算法本身的函数。如果分别用 N、I和A表示算法要解问题的规模、算法的输入和算法 本身,而且用C表示复杂性,那么,应该有C=F(N,I,A)。 一般把时间复杂性和空间复杂性分开,并分别用T和S来 表示,则有: T=T(N,I)和S=S(N,I) 。 (通常,让A隐含在复杂性函数名当中)
23
1.4 算法复杂性分析 最坏情况下的时间复杂性: 最好情况下的时间复杂性: 平均情况下的时间复杂性:
1.4 算法复杂性分析 最坏情况下的时间复杂性: 最好情况下的时间复杂性: 平均情况下的时间复杂性: 其中DN是规模为N的合法输入的集合;I*是DN中使T(N, I*) 达到Tmax(N)的合法输入; 是中使T(N, )达到Tmin(N)的合法 输入;而P(I)是在算法的应用中出现输入I的概率。
24
1.4 算法复杂性分析 算法复杂性在渐近意义下的阶: 渐近意义下的记号:O、Ω、θ、o 设f(N)和g(N)是定义在正数集上的正函数。
1.4 算法复杂性分析 算法复杂性在渐近意义下的阶: 渐近意义下的记号:O、Ω、θ、o 设f(N)和g(N)是定义在正数集上的正函数。 O的定义:如果存在正的常数C和自然数N0,使得当NN0时有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)。
25
1.4 算法复杂性分析 Ω的定义:如果存在正的常数C和自然数N0,使得当NN0时
1.4 算法复杂性分析 Ω的定义:如果存在正的常数C和自然数N0,使得当NN0时 有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,使得 当NN0时有f(N)/Cg(N)ε,则称函数f(N)当N充分大时的阶比 g(N)低,记为f(N)=o(g(N))。 例如,4NlogN+7=o(3N2+4NlogN+7)。
Similar presentations