第1章算法引论剖析_第1页
第1章算法引论剖析_第2页
第1章算法引论剖析_第3页
第1章算法引论剖析_第4页
第1章算法引论剖析_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1

算法分析与设计刘伟(Sunny)E-mail:weiliu_china@163Tel:135748184482主要内容介绍第1章 算法引论第2章 递归与分治策略第3章 动态规划第4章 贪心算法第5章 回溯法第6章 分支限界法3参考教材4算法无处不在(1)从学校去火车站走哪条线路所需时间最少?(2)如何推断两个人是父子关系(DNA测序)?(3)如何让一个体积有限的背包中物品的价值最大?(4)如何规划可以让一个省的每个城市之间都有高速马路连通但总长度最小?(5)一张中国地图,对每个省进行着色,最少要几种颜色才能保证相邻的两个省颜色不同?……5第1章算法引论1.1 算法与程序1.2 表达算法的抽象机制1.3 描述算法1.4 算法困难性分析本章主要学问点:61.1 算法与程序输入:有零个或多个外部量作为算法的输入。输出:算法产生至少一个量作为输出。确定性:组成算法的每条指令清晰、无歧义。有限性:算法中每条指令的执行次数有限,执行每条指令的时间也有限。是算法用某种程序设计语言的具体实现。程序可以不满足算法的性质(4)即有限性。是满足下述性质的指令序列。算法:程序:71.从机器语言到高级语言的抽象1.2 表达算法的抽象机制高级程序设计语言的主要好处是:(4)把繁杂琐碎的事务交给编译程序,所以自动化程度高,开发周期短,程序员可以集中时间和精力从事更重要的创建性劳动,提高程序质量。(1)高级语言更接近算法语言,易学、易驾驭,一般工程技术人员只需要几周时间的培训就可以胜任程序员的工作;(2)高级语言为程序员供应了结构化程序设计的环境和工具,使得设计出来的程序可读性好,可维护性强,牢靠性高;(3)高级语言不依靠于机器语言,与具体的计算机硬件关系不大,因而所写出来的程序可植性好、重用率高;82.抽象数据类型1.2 表达算法的抽象机制

抽象数据类型(ADT)是算法的一个数据模型连同定义在该模型上并作为算法构件的一组运算。

抽象数据类型带给算法设计的好处有:

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

ADT抽象数据类型名{数据对象:<数据对象的定义>

数据关系:<数据关系的定义>基本操作:<基本操作的定义>}ADT抽象数据类型名实例:线性表ADTList{数据对象:D={ai|ai(-ElemSet,i=1,2,...,n,n>=0}数据关系:R1={<ai-1,ai>|ai-1,ai(-D,i=2,...,n}基本操作:InitList(&L)

DestroyList(&L)

ListInsert(&L,i,e)

ListDelete(&L,i,&e)}ADTList103.伪代码1.2 表达算法的抽象机制输入3个数,打印输出其中最大的数。Begin(算法起先)输入A,B,CIFA>B则A→Max否则B→MaxIFC>Max则C→MaxPrintMaxEnd(算法结束)114.程序流程图1.2 表达算法的抽象机制12在本课程中,接受Java语言描述算法。1.Java程序结构1.3 描述算法(1)Java程序的两种类型:应用程序和applet 区分:应用程序的主方法为main,其可在吩咐行中用吩咐 语句java应用程序名来执行(2)包:Java程序和类可以包(packages)的形式组织管理。(3)import语句:在Java程序中可用import语句加载所需的包。 例如,importjava.io.*;语句加载java.io包。131.3 描述算法2.Java数据类型数据类型

基本数据类型:详见下页表1-1

非基本数据类型:如

Byte,Integer,Boolean,String等。

Java对两种数据类型的不同处理方式:

对基本数据类型:在声明一个具有基本数据类型的变量时,自 动建立该数据类型的对象(或称实例)。如:intk;对非基本数据类型:语句Strings;并不建立具有数据类型 String的对象,而是建立一个类型String的引用对象, 数据类型为String的对象可用下面的new语句建立。s=newString(“Welcome”);Strings=newString(“Welcome”);141.3 描述算法表1-1Java基本数据类型类型缺省值分配空间(bits)取值范围booleanfalse1[true,false]byte08[-128,127]char\u000016[\u0000,\uFFFF]double0.064±4.9*10-324~±1.8*10308float0.032±1.4*10-45~±3.4*1038int032[-2147483648,2147483647]long064±9.2*1017short016[-32768,32767]151.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)xyexp(x)exsin(x)x的正弦floor(x)不大于x的最大整数sqrt(x)x的平方根log(x)x的自然对数tan(x)x的正切161.3 描述算法3.方法

计算表达式 值的自定义方法ab描述如下:

publicstaticintab(inta,intb){return(a+b+Math.abs(a-b))/2;}

(1)方法参数:Java中全部方法的参数均为值参数。上述方法ab中,a和b 是形式参数(形参),在调用方法时通过实际参数(实参)赋值。(2)方法重载:Java允许方法重载,即允许定义有不同签名的同名方法。 上述方法ab可重载为:

publicstaticdoubleab(doublea,doubleb){return(a+b+Math.abs(a-b))/2.0;}

171.3 描述算法4.异样Java的异样供应了一种处理错误的方法。当程序发觉一个错误,就引发一个异样,以便在合适地方捕获异样并进行处理。通常用try块来定义异样处理。每个异样处理由一个catch语句组成。publicstaticvoidmain(String[]args){try{f();}catch(exception1){异样处理;}catch(exception2){异样处理;}…finally{finally块;}}181.3 描述算法5.Java的类(4)访问修饰公有(public)私有(private)保护(protected)Java的类一般由4个部分组成:(1)类名(2)数据成员(3)方法191.3 描述算法6.通用方法

下面的方法swap用于交换一维整型数组a的位置i和位置j处的值。

publicstaticvoidswap(int[]a,inti,intj){inttemp=a[i];a[i]=a[j];a[j]=temp;}

publicstaticvoidswap(Object[]a,inti,intj){objecttemp=a[i];a[i]=a[j];a[j]=temp;}

该方法只适用于整型数组该方法具有通用性,适用于Object类型及其全部子类以上方法修改如下:201.3 描述算法6.通用方法

(1)Computable接口

publicstaticComputablesum(Computable[]a,intn){if(a.length==0)returnnull;Computablesum=(Computable)a[0].zero();for(inti=0;i<n;i++)sum.increment(a[i]);returnsum;}利用此接口使方法sum()通用化

211.3 描述算法6.通用方法

(2)java.lang.Comparable接口Java的Comparable接口中惟一的方法头compareTo()用于比较2个元素的大小。例如java.lang.Comparable.xpareTo(y)返回x-y的符号,当x<y时返回负数,当x=y时返回0,当x>y时返回正数。(3)Operable接口有些通用方法同时须要Computable接口和Comparable接口的支持。为此可定义Operable接口如下:publicinterfaceOperableextendsComputable,Comparable{}

(4)自定义包装类由于Java的包装类如Integer等已定义为final型,因此无法定义其子类,作进一步扩充。为了须要可自定义包装类。221.3 描述算法7.垃圾收集8.递归Java的new运算用于安排所需的内存空间。例如,int[]a=newint[500000];安排2000000字节空间给整型数组a。频繁运用new安排空间可能会耗尽内存。Java的垃圾收集器会适时扫描内存,回收不用的空间(垃圾)给new重新安排。Java允许方法调用其自身,这类方法称为递归方法。publicstaticintsum(int[]a,intn){if(n==0)return0;elsereturna[n-1]+sum(a,n-1);}

计算一维整型数组前n个元素之和的递归方法

231.4 算法困难性分析算法困难性是算法运行所须要的计算机资源的量,须要时间资源的量称为时间困难性,须要的空间资源的量称为空间困难性。这个量应当只依靠于算法要解的问题的规模、算法的输入和算法本身的函数。假如分别用N、I和A表示算法要解问题的规模、算法的输入和算法本身,而且用C表示困难性,那么,应当有C=F(N,I,A)。一般把时间困难性和空间困难性分开,并分别用T和S来表示,则有:T=T(N,I)和S=S(N,I)。(通常,让A隐含在困难性函数名当中)241.4 算法困难性分析最坏状况下的时间困难性:最好状况下的时间困难性:平均状况下的时间困难性:其中DN是规模为N的合法输入的集合;I*是DN中使T(N,I*)达到Tmax(N)的合法输入;是中使T(N,)达到Tmin(N)的合法输入;而P(I)是在算法的应用中出现输入I的概率。251.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. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论