算法分析与设计 第一章_第1页
算法分析与设计 第一章_第2页
算法分析与设计 第一章_第3页
算法分析与设计 第一章_第4页
算法分析与设计 第一章_第5页
已阅读5页,还剩108页未读 继续免费阅读

下载本文档

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

文档简介

1、目 录,前言 引入篇 第一章 算法概述 第二章 算法分析基础 基础篇 第三章 算法基本工具与优化技巧 核心篇 第四章 基本的算法策略 第五章 图的搜索算法 应用篇 第六章 算法设计实践,引 入 篇,第一章 算法概述,11 用计算机求解 问题与算法,问题求解(problem solving)是个大课题,它涉及归约、推断、决策、规划、常识推理、定理证明和相关过程的核心概念。,111 用计算机求解问题的步骤,人在解决问题时有很大的灵活性,对于同一个问题,不同的人有不同的经验,会采用不同的方法,怎么样用计算机解决一个现实中的问题呢?虽然也是有很多不同的方法,但基本步骤是相同的。,问题分析 数学模型建立

2、 算法设计与选择 算法表示 算法分析 算法实现 程序调试 结果整理文档编制,用计算机解决一个现实中的问题步骤,1. 问题分析 准确、完整地理解和描述问题是解决问题的第一步。要做到这一点,必须注意以下一些问题:在未经加工的原始表达中,所用的术语是否都明白其准确定义?题目提供了哪些信息?这些信息有什么用?题目要求得到什么结果?题目中作了哪些假定?是否有潜在的信息?判定求解结果所需要的中间结果有哪些?等等。必须认真审查表达问题的有关描述,深入分析,以加深对问题的了解。,2、数学模型建立 用计算机解决实际问题必须有合适的数学模型,因为在现实问题面前,计算机是无能为力。对一个实际问题建立数学模型,可以考

3、虑这样两个基本问题:最适合于此问题的数学模型是什么?是否有已经解决了的类似问题可借鉴? 如果上述第二个问题的答复是肯定的,那么通过类似的问题的分析、比较和联想,可加速问题的解决。,3、算法设计与选择 算法设计是指设计求解某一特定类型问题的一系列步骤,并且这些步骤是可以通过计算机的基本操作来实现的。算法设计要同时结合数据结构的设计,简单说数据结构的设计就是选取存储方式。算法的设计与模型的选择更是密切相关的,但同一模型仍然可以有不同的算法,而且它们的有效性可能有相当大的差距。,4、算法分析 算法分析的目的,首先为了对算法的某些特定输入,估算该算法所需的内存空间和运行时间;其次是为了建立衡量算法优劣

4、的标准,用以比较同一类问题的不同算法。通常将时间和空间的增长率作为衡量的标准。另参见114算法及其设计的评价,5、算法表示 对于复杂的问题,确定算法后可以通过图形准确表示算法。算法的表示方式很多如:算法流程图、盒图、PAD图和伪码(类似于算法设计语言)等。,6、算法实现 根据选用的算法设计语言,要解决下列一些问题:有哪些变量,它们是什么类型?需要多少数组,规模有多大?用什么结构来组织数据?需要哪些子算法?等等。 算法的实现方式,对运算速度和所需内存容量都有很大影响。,7、程序调试 算法测试的实质是对算法应完成任务的实验证实,同时确定算法的使用范围。测试方法一般有两种:白盒测试对算法的各个分支进

5、行测试;黑盒测试检验对给定的输入是否有指定输出。 如何选择算法测试中的输入,还没有一般答案。通常采用的方法是,对输入数据做有代表性的采样,使之对被测试算法的各个语句、分支和路径尽可能都被检查到。对输入集中的边界点也要进行测试。经测试验证是否正确的算法,在较大程度上是可以相信它的正确性。,、结果整理文档编制 编制文档的目的是让人了解你编写的算法。首先要把代码编写清楚。代码本身就是文档。同时还要采用注释的方式,另外还包括算法的流程图,自顶向下各研制阶段的有关记录,算法的正确性证明(或论述),算法测试结果,对输入/输出的要求及格式的详细描述等。,在这些步骤中,算法设计是解决问题的核心。,112 算法

6、及其要素和特性,、算法的定义 算法是指在解决问题时,按照某种机械算法步骤一定可以得到问题结果的处理过程。当面临某个问题时,需要找到用计算机解决这个问题的方法和步骤,算法就是对解决这个问题的方法和步骤的描述。,机械算法步骤是指,算法中有待执行的运算和操作,必须是相当基本的。换言之,它们都是能够精确地运行的算法,执行者甚至不需要掌握算法的含义,即可根据该算法的每一步骤要求,进行操作并最终得出正确的结果。,就本课程而言,算法就是计算机解题的过程。在这个过程中,无论是形成解题思路还是编写算法,都是在实施某种算法。前者是推理实现的算法,后者是操作实现的算法。,2算法的要素 算法由操作、控制结构、数据结构

7、三要素组成。 操作 算术运算:加、减、乘、除 关系比较:大于、小于、等于、不等于 逻辑运算:与、或、非 数据传送:输入、输出, 赋值,控制结构 各操作之间的执行次序。 顺序结构:各操作依次执行 选择结构:由条件是否成立来选择 执行 循环结构:有些操作要重复执行,直到功能满 足某个条件时结束。又称重复或迭 代结构。,注明: 模块间的调用也是一种控制结构,特别地模块自身的直接或间接调用递归结构,是一种功能很强的控制结构。,数据结构 算法操作的对象是数据,数据间的逻辑关系、数据的存储方式及处理方式就是数据的数据结构。它与算法设计是紧密相关的。,3. 算法的基本性质 算法是把人类找到的求解问题的方法,

8、用以上要素过程化、形式化、机械化地表示出来。,在算法的表示中要满足以下的性质: 目的性 算法有明确的目的,能完成赋予它的功能 分步性 算法为完成其复杂的功能,由一系列计算机可执 行的步骤组成 有序性 算法的步骤是有序的,不可随意改变算法步骤的 执行顺序 有限性 算法是有限的指令序列,所包含步骤也是有限的 操作性 算法是有限的指令序列,算法所包含的步骤是有 限的,4. 算法的地位 算法是计算机学科中最具有方法论性质的核心概念,也被誉为计算机学科的灵魂。,5. 算法的基本特征 有穷性 一个算法在执行有穷步之后必须结束。也就是说一个算法它所包含的计算步骤是有限的而且每个步骤都能在有限时间内完成。,确

9、定性 对于每种情况下所应执行的操作,在算法中都有确切的规定,使算法的执行者或阅读者都能明确其含义及如何执行。并且在任何条件下,算法都只有一条执行路径。 可行性 算法中描述的操作都可以通过已经实现的基本操作运算有限次实现。,算法有零个或多个的输入 有些输入量需要在算法执行过程中输入,而有的算法表面上可以没有输入,实际上已被嵌入算法之中。 算法有一个或多个的输出 它是一组与输入有确定关系的量值,是算法进行信息加工后得到的结果。,113 算法设计及基本方法,1. 算法设计的概念 算法设计作为用计算机解决问题的一个步骤,其任务是对各类具体问题设计良好的算法;作为一门课程,是研究设计算法的规律和方法。,

10、2算法设计应注意的问题 1)正确性(Correctness) 一切合法的输入数据都能得出满足要求的结果;典型、苛刻的几组输入数据也能够得出满足要求的结果。,2)可读性(Readability) 算法应该易于人的理解;晦涩难读的算法易于隐藏较多错误而难以调试。 3)健壮性(Rubustness) 算法的异常情况。处理出错的方法是返回一个表示错误或错误性质的值,以便在更高的抽象层次上进行处理。,4)高效率与低存储量需求 效率指的是算法执行时间;存储量指的是算法执行过程中所需的最大存储空间。,3算法设计的基本方法 1)结构化方法“自顶向下, 逐步求精” “自顶向下”是将复杂、大的问题划分为小问题。

11、“逐步求精”是将现实世界的问题经抽象转化为逻辑空间或求解空间的问题。,结构算法设计技术的优越性: 符合人类解决复杂问题的普遍规律 。 用先全局后局部、先整体后细节、先 抽象后具体的逐步求精过程开发出的 算法有清晰的层次结构 。,2) 面向对象方法 对象=数据+对数据操作的代码实体 面向对象算法设计方法的过程包括以下步骤: 在给定的抽象层次上识别类和对象 识别这些对象和类的语义 识别类和对象之间的关系 实现类和对象,它的特征主要包括: 抽象化 将各种独立的操作分解成为可以用命名区分的单 元。 封装性 不同的操作具有不同的作用范围。 多态性 对于不同数据类型的相似操作使用相同的名。 继承性 类可以

12、被继承。,重用是面向对象的一个重要优点。最大特点是能够大幅度的提高软件项目的成功率,减少日后的维护费用,提高软件的可移植性和可靠性。,3)本书采用的设计方法结构化设计方法 (1)自顶向下模块化分解过程 把一个较大的算法划分为若干子算法 每一个模块可继续划分为更小的子模块 直到用三种控制结构和具体操作表示算 法 注:运用这种编程方法,考虑问题必须先进行 整体分析。,(2)模块划分的基本要求 模块的功能尽可能地单一化、明确化 模块间的联系及相互影响尽可能地小 模块的规模应当足够小,以便于调试 原则是简单性、独立性和完整性。,(3)模块间的接口问题 传递方式一般有以下几种: 按名共享:全局变量 子模

13、块返回调用模块信息:子模块名 调用模块传递给子模块信息:值参数传递 调用模块与子模块互相传递信息:变量参数传递(C语言没有此种传递方,Pascal、C+语言提供此类参数) 按地址共享变量:地址参数传递(参数为指针变量名、数组名,变量地址),(4)算法设计的基本方法 抽象 抽象包括算法的抽象和数据抽象。算法抽象是 指算法的寻求(或开发)采用逐步求精、逐层分 解的方法。数据抽象也指在算法抽象的过程中 逐步完善数据结构和引入新的数据及确定关于 数据的操作。 枚举 “枚举”一些真实数据 归纳 “归纳”出算法的细节,1.1.4 从算法到实现,从算法到实现应注意的事项: 1. 数据类型的选择 类型的选择主

14、要取决于你研究问题中数据的实际情况。如:数组m1010和临时变量t应该定义为长整型变量比较合理。 2 计算过程 如:C语言约定:“整数/整数”结果一定是整数,1/2的结果是0。而PASCAL语言则有专门的整除运算符“div”,1/2的结果是0.5。,3. 结果的输出格式 如:矩阵输出时上、下行的数据应该对齐。 4. 算法实现后的测试、调试 测试就是要发现算法是否存在问题。测试就是要找到出现问题的原因并改正它。然后还需要进行回归测试,以确保算法的正确性。,1.2 算法描述,121 算法描述简介,算法是对解题过程的精确描述。 算法 = 控制结构 + 原操作 表示算法的语言主要有:自然语言、流程图、

15、伪代码、计算机算法设计语言等。,1自然语言 自然语言是人们日常所用的语言。其缺点是: 由于自然语言的歧义性容易导致算法执行的不确定性。 自然语言的语句一般太长从而导致了用自然语言描述的算法太长。 当一个算法中循环和分支较多时就很难清晰地表示出来。 自然语言表示的算法不便翻译成计算机算法设计语言理解的语言。,2流程图 流程图可以表示任何算法的逻辑结构。 1) 基本组件,算法的 加工、处理 条件 控制流 连接点 入口和出口,2)三种基本控制结构 顺序结构:, 选择结构,IF THEN ELSE型分支 DOCASE型多分支, 循环结构,DO ,DOWHILE型循环 DOUNTIL循环结构,3) 算法

16、流程图的主要缺点 不是逐步求精的好工具,它诱使算法员过早地考虑算法的控制流程,而不去考虑算法的全局结构。 随意性太强,结构化不明显。 不易表示数据结构。 流程图的层次感不明显,3盒图(NS流程图) (1)盒图具有以下优点: 层次感强、嵌套明确 支持自顶向下、逐步求精。 容易转换成高级语言源算法,(2)三种基本控制结构 顺序结构, 选择结构,当条件P为真执行语句体A 当条件P的值为P1时执行语句体 否则执行语句体 A1,为P2时执行语句体A2,, 循环结构,如果条件P成立, 如果条件P不成立, 重复执行S 重复执行S,(3)主要缺点: 不易扩充和修改,不易描述大型复杂算法。,4 PAD图 问题分

17、析图(Problem Analysis Diagram, 简称PAD)表示的算法是一个二维树形结构图,层次感强、嵌套明确且有明确的控制流程。,三种基本控制结构 顺序结构, 选择结构,如果条件P成立,执行S1 当条件P的值为P1,执行语句体S1 条件不成立,执行S2 为P2时执行语句体A2,, 循环结构,如果条件P成立,重复执行S 如果条件P不成立,重复执行S,PAD图的主要优点: 设计出来的算法必是结构化的。 PAD图描绘的算法结构清晰。 用PAD图表现的算法逻辑,易读、易懂、记。 容易用软件工具自动将PAD图转换成高级语言 源算法。 既可用于表示算法逻辑,也可用于描绘数据结构。 支持自顶向下

18、、逐步求精。 缺点:由于是图形符号书写、录入不方便。,例:,图3.6 问题分析图实例,5伪代码 伪代码是用介于自然语言和计算机语言之间的文字和符号来描述算法的工具。它不用图形符号,因此书写方便格式紧凑,易于理解,便于用计算机算法设计语言实现。,6算法设计语言的缺点 算法的基本逻辑流程难于遵循与自然语言一样,算法设计语言也是基于串行的,当算法的逻辑流程较为复杂时这个问题就变得更加严重 特定算法设计语言编写的算法限制了与他人的交流,不利于问题的解决 要花费大量的时间去熟悉和掌握某种特定的算法设计语言 要求描述计算步骤的细节而忽视算法的本质 需要考虑语法细节,而扰乱算法设计的思路 考虑到算法设计语言

19、的不断更新,不适于描述算法。 算法设计都不用算法设计语言直接描述。,122 算法描述约定,本书采用类C语言的伪代码描述,具体细节约定如下: 1、三种基本控制结构的描述 1)顺序结构 一个操作以分号“;”结束,每行一般只写一条操作。,2)选择结构 单条件控制 if 条件 语句体1 else 语句体2,多条件控制 switch(表达式0) case常量表达式1: 语句组1; case常量表达式n: 语句组n; default : 语句组n+1; ,3)循环结构 计数循环: for(表达式1;表达式2;表达式3) 循环体 当型循环: while (循环条件) 循环体 直到型循环: do 循环体 wh

20、ile(循环条件); 说明:在这三种循环体中,均可有loop语句和 break语句。,2、数据结构说明 算法中的标识符由字母数字构成,以字母开头。 1)一般类型说明方式:类型名 变量表; 类型名有:整型int 、实型float、双精度型 double 字符型 char 2)指针类型说明方式:类型名 *指针变量名表;,3)构造类型: 数组说明:类型名 一维数组名n(开辟n个空间, 下标0n-1); 类型名 二维数组名m,n(开辟m*n个空 间,下标0,0m-1,n-1); 结构类型: struct 结构体类型名 类型 成员名; 类型 成员名; . ;,4)动态空间申请函数 malloc(size

21、) 功能:申请size个字节的一个空间;返回所申请空间的首地址。 calloc(num,size ) 功能:申请num个size个字节的空间;返回所申请空间的首地址。 free( *p ) 功能:释放p指向的动态空间。,3模块及模块间的接口方式的描述 算法或算法中模块结构为: 模块(算法)名(参数) 模块体 ,模块间的接口方式的描述如下: 全局变量:定义模块外的变量。 子模块返回调用模块信息: 调用函数:子模块名 被调用函数:return(返回信息) 调用模块传递给子模块信息:值参数传递 实际参数为:表达式、普通变量名、常量或数组元素 形式参数为:普通变量名, 调用模块与子模块互相传递信息:变

22、量参数传递 实际参数为:普通变量名 形式参数为: input a,b; c=1; /变量c是为累乘因数而设置的; for (i=2; i=a and i=b; i+) /“枚举”可能的公约数 while (a mod i=0 and b mod i=0 ) /“试”i是否为公约数 c=c*i; a=a/i; b=b/i; print(“%d is maximal common divisor”,c); ,算法说明:若是则进入内层循环累乘因数,并且除 掉这个因数,避免下次重复处理该因数。 算法分析:通过以上算法设计过程应该看到,可以依赖以前学到的解决问题方法,改进有关步骤以便能通过机械的计算机操

23、作(准确地说是通过算法设计语言)来实现。 “问题分析、建模、算法设计要点、算法分析”是解决问题的必然过程。,下面是初学者容易发生的一些问题,提前指出以引起大家注意: 通过输入语句增加算法的通用性。 会忘掉“输出”或在模块间传递处理的数据结果 易忽略细节造成“死循环”。 出现语序方面的错误,特别是双重循环中指令常有嵌套错误。 注意学习和总结。 用大脑“运行”算法是学习算法很好的方法。 解题时要学会择优。简单说择优要考虑四个方面:可读性、可修改性、时间效率和空间效率。,13* 现代算法概览,131 压缩算法,一、数据压缩 二、常见的通用压缩格式,一、数据压缩 1. 数据压缩 数据压缩就是采用特殊的

24、编码方式来保存数据,使数据占用的存储空间比较少。 2. 即时压缩和非即时压缩 即时压缩经常用到专门的硬件设备,如压缩卡等。非即时压缩一般不需要专门的设备,直接在电脑中使用相应的压缩程序就可以了。,3数据压缩和文件压缩 其实数据压缩包含了文件压缩,数据本来是泛指任何数字化的信息,包括电脑中用到的各种文件,但有时候,数据是专指对一些带时间性的数据如音乐、影像等(称为流媒体)以及一些及时采集的数据(如股市行情、温度等),这些数据常常是即时采集,即时处理的。而文件就是专指保存在磁盘等物理介质的数据集合了,如一篇文章数据、一段音乐数据、一段程序编码数据等。文件经过压缩后一般称为压缩文件。文件的压缩一般也

25、称为打包,将压缩的文件还原成本来的样子称为解包、释放、扩展或解压缩等。,另外,有一种压缩文件称为自解压文件,这种压缩文件实际上是一个程序文件,这个程序文件运行后,能够自己将压缩的文件还原出来,而不需要另外的解压缩工具。很多程序的安装文件都是自解压文件。,4. 无损压缩与有损压缩 比如一个图片文件当保存为不同的格式时,其数据量(文件大小)的差别非常大,使用BMP和JPEG格式生成的文件有时会相差十几倍。而所谓的JPEG格式图片就是在微小的损失图片质量的情况下对图片文件中的相同或相似数据进行大量压缩,以使之生成的文件更小。,此外,另一种常见的有损压缩表现在音频和视频方面,如我们看到的VCD、DVD

26、视频格式影碟和MP3、VQF、RealMedia音频文件,都是采用压缩算法编码的,这种经过压缩处理的文件在还原成声音或影像时或多或少都会有一些质量损失 对于一些程序数据和文档数据压缩而言,有损压缩就行不通了,否则还原的数据有误还怎么使用?为此几乎所有的无损压缩算法都具有严格的CRC校验功能,二、常见的通用压缩格式 1ZIP压缩格式 2CAB压缩格式 3ARJ压缩格式 4RAR压缩格式 5. 推荐使用的压缩工具 对于初学者以及日常很少接触文档备份和压缩 的朋友来讲,使用WinZip或者ZipMagic。如果你 需要经常备份文件或者使用软盘传送文件,首使 用 WinRAR。,132 加密算法,一、

27、软件主要加解密算法方法简介 二、网络信息加密简介,一、软件主要加解密算法方法简介 加密方法可分为两大类:钥匙盘方式和加密狗方式。 解密方法主要可分为两种:软解密和硬解密,二、网络信息加密简介 加密技术是一门古老而深奥的学科。计算机加密技术是研究计算机信息加密、解密及其变换的科学,是数学和计算机的交叉学科,也是一门新兴的学科。 密码是实现秘密通讯的主要手段,是隐蔽语 言、文字、图像的特种符号。,任何一个加密系统至少包括下面四个组成部分: 未加密的报文,也称明文; 加密后的报文,也称密文; 加密解密设备或算法; 加密解密的密钥。,数据加密技术主要分为数据传输加密和数据存储加密。 数据传输加密技术主

28、要是对传输中的数据流进行加密,常用的有: 链路加密 节点加密 端到端加密,数据加密算法有很多种,密码算法标准化是信息化社会发展的必然趋势。按照发展进程来看,密码经历了古典密码、对称密钥密码和公开密钥密码三个阶段。,133 人工智能算法,人类智能的计算机模拟。 在人工智能中包括语言处理、自动定理证明、智能数据检索系统、视觉系统、问题求解、人工智能方法和程序语言以及自动程序设计等。,人工智能的研究与应用领域: 1.问题求解 2.逻辑推理与定理证明 3.自然语言理解 4.自动程序设计 5.专家系统 6.机器学习 7.神经网络 8.机器人学 9模式识别 10.机器视觉 11智能控制 12.智能检索 1

29、3.智能调度与指挥 14.分布式人工智能与Agent 15.计算智能与进化计算 16.数据挖掘与知识发现 17.人工生命 18.系统与语言工具,134 并行算法,并行计算是指同时对多个任务或多条指令、或对多个数据项进行处理。完成此项处理的计算机系统称为并行计算机系统。 并行算法(Parallel Algorithm)是一些可同时执行的多个进程的集合,这些进程相互作用和协调工作,从而达到对给定问题的求解。,任务分解的方法有: 1)递归分解 2)数据分解 3)搜索分解方式 4)综合分解,135 其它实用算法,1数值算法 2运筹学相关算法 3统计分析算法 4网络搜索引擎算法,1数值算法 为了方便使用

30、这些算法解决实际问题,已有很多软件公司致力于将这些算法开发为实用软件,现介绍如下: (1)Maple (2)Matlab 6.0 (3)Mathematica 4.0 (4)Mathcad (5)MahtGV,2运筹学相关算法 运筹学的重要组成部分线性规划、非线性规划、二次规划、整数规划、运输问题、动态规划和排队论,这些算法基本成熟,有相关软件如下: (1)运筹学软件包 2.0 (2)Lindo60,3统计分析算法 从研究问题的角度可以大致分为: 分类算法 有聚类分析,判别分析等,现在也可以 用神经网络算法来分类 结构简化算法 如逐步回归分析选择预报因子,聚类分 析,FOF分解,因子分析等 相关性分析算法 回归分析,相关系数分析(用于点 对点 、点的相关),典型相关分析,(用于场与场的 整体相关),奇异值分解 用于预测研究的算法 多元线性回归,非线性回 归,神经网络,支撑向量机等。较通用的两个统计分析 软件:Sas,Spss。,4网络搜索引擎算法 搜索引擎的最新技术发展包括以下几个方面: 1)提高搜索引擎对用户检索提问的理解 2)对检索结果进行处理(排名算法) 3)确定搜索引擎信息搜集范围,提高搜索引擎 的针对性 4)将搜索引擎的技术开发重点放在对检索结果 的处理上,提供更优化的检索结果,1)提高搜索引擎对用户检索提问的理解 为了提高搜索引擎对用户检索提问的理解,就必须有一

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论