ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:27.41KB ,
资源ID:2407011      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/2407011.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(算法初步知识点.docx)为本站会员(b****1)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

算法初步知识点.docx

1、算法初步知识点- Page 1- 6.3 算法基础 前面,我们讨论了程序设计中关于数据组织的问题。对程序设计来说,另外一个重要的 问题是如何确定数据处理的流程,即确定解决问题的步骤。这就是算法问题。算法是一组确 定的解决问题的步骤。它和机器以及语言并无关系,但最终还是需要使用特定的语言加以实 现。 6.3.1 算法的概念 算法是计算机科学特别是软件设计中最具研究性质的。在计算机科学中,算法是研究适 合计算机程序实现问题解决的方法,因此它是许多计算机问题的核心研究对象。 一般认为,算法是一组明确的、可以执行的步骤的有序集合。“有序集合”说明算法中 的步骤是有顺序关系的。算法中的每一步骤还必须是“

2、明确的”,模棱两可的步骤不能构成 算法。例如,“把变量x 加上一个不太大的整数”。这里 “不太大的整数”就很不明确。另外, 算法中的每一步骤还必须是“可执行的”。这里所说的可执行不是一定要能被计算机所直接 执行,即它不一定直接对应计算机的某个指令。但至少对阅读算法的人来说,相应步骤是有 效和可以实现的。例如,“列出所有的正整数”就是不可执行的(有无穷多的)。 当我们使用计算机来解决问题的时候,有时会面临多种可能的解决途径。而选择不同的 解决途径可能会有不同的问题求解效率。如果是一个简单的问题,这种选择也许无关紧要; 但对大型问题,这种选择就是至关重要的。如果被设计的程序需要机器运行数年、或至少

3、数 GB 以上的内存,那就看不出这个程序还有什么意义。对于一些复杂的问题,例如对现实的 模拟过程,使用设计优良的算法使系统运行速度和性能得以成倍的提高是完全可能的。 所以,不管需要解决的问题是属于哪个应用领域,严谨的、合理的、高效的算法设计对 解决复杂问题是非常有意义的。 下面,我们来看一个简单的算法例子。 【例6.3】在一个从小到大顺序排好的整数序列中查找某一指定的整数所在的位置。 这是一个查找问题。我们可以比较两种不同的查找方法。 方法一一种简单而直接的方法是按顺序查找,相应的查找步骤是: 1 )查看第一个数。 2 )若当前查看的数存在,则 若该数正是我们要找的数,则找到,查找过程结束;

4、若不是我们要找的数,继续查下一个数,重复 2 )步。 3 )若当前查看的数不存在,则要找的数不在序列里,查找过程结束。 方法二二分查找法(或称折半查找法,binary search)。由于序列中的整数是从小到大 排列的,所以可以应用此方法。该方法的要点是,先比较序列中间位置的整数,如果与 要找的数一样,则找到;若比中间那个整数小,则只要用同样方法在前半个序列中找就 可以了;否则,在后半个序列中找。相应查找步骤如下: 1 )把含n 个整数的有序序列设为待查序列 S 2 )若S 不空,则取序列S 中中间位置的整数,并设为middle。 若我们要找的数与 middle 一样,则找到,查找过程结束。

5、若我们要找的数小于middle,则将S 设为middle之前的半段序列,重复2 )。 若我们要找的数大于middle,则将S 设为middle之后的半段序列,重复2 )。 3 )若S 为空,则要找的数不在序列中,过程结束。 在上述两种方法中,顺序查找方法简单,但效率不高。一般来说,若整数序列中整数的 255 - Page 2-个数为n,即平均要找n/2 次才找到(若该数在序列中)。而二分查找法虽然思路相对复杂, 但效率高。通过分析可以知道,若要查找的数在个数为n的序列中,二分查找法平均花log2(n) 次左右的比较就可以找到。当问题的规模(n )很大时,不同算法的效率就可以很明显地看 出来了。

6、例如,当n为 100 万时,顺序查找平均要比较 50 万次左右,而二分查找平均用 20 次就够了(log2(100 万)20)。 算法的时间效率不仅与算法本身有关,而且与问题的规模有关。算法的时间效率与问题 规模的关系称为该算法的时间复杂性(time complexity)。例如,对于顺序查找算法,一般我 们称其时间复杂性是问题规模的线性函数(与问题规模成正比增长),而二分查找法的时间 复杂性则是对数函数(log),因而它随问题规模变大而在算法时间的增长上并不是很快。 我们再来看一个数论方面的算法-计算最大公约数的欧几里德算法。该算法大概可以被 认为是最古老的算法之一了。 【例6.4】求两个数

7、的最大公约数 (Gcd),即可以同时整除这两个数的最大整数。例如 Gcd (50,15)=5。假设两个整数为m 和n,并且有m 大于n (如果n 大于m,则交换m 和 n )。 欧几里德算法是通过连续运用以下等式,计算余数直到余数为0 为止,最后非0 的余数 就是最大公约数。其中,m mode n 代表m 除以n 的余数。 Gcd (m,n ) Gcd ( n,m mode n ) 例如,Gcd(50,15)=Gcd(15, 5)=Gcd(5,0)=5 求Gcd(m,n)的算法可使用一个更加结构化的描述,分为3 步: 1 )如果n 0,返回m 的值作为结果,同时过程结束;否则进入第2 )步。

8、2 )用m 除以n,得到余数赋值给rem 3 )将n 的值赋给m,将余数rem 赋给 n,返回第1)步。 这个算法和数学中分别找到m、n 的质因数到最后求得最大公约数的过程相比,欧几里 德算法在实现上要容易的多,而且更适合计算机的实现。 实际上,这个问题的算法是一个迭代过程。一般情况下,一次迭代并不是按照一个常数 因子递减,能够证明在两次迭代以后,余数最多是原始值的一半,因此迭代次数至多是2logn 。 这个算法还可以用于验证两个数互为素数的证明,例如Gcd (314159,271218)1 就 是证明了它们是互为素数。 就算法而言,它主要考虑的是问题求解的步骤或过程。但若要把算法变成程序,还

9、有许 多事情要做。首先要考虑问题中数据的表达,例如对于前面用二分法求解查找问题的算法来 说,要考虑:(1)如何表达整数序列 (一般用数组);(2 )如何表达我们下一步要查找的范 围,即子序列S 的范围 (一般可用S 的首、尾两个整数在数组中的下标来表示);(3)要查 找的数和S 的中间整数(可各用一个变量)。其次,要将算法过程用程序设计语言中的控制 语句来实现 (最主要的是循环控制与条件控制语句)。最后,要仔细设计与用户的交互(主 要是数据的输入与输出)。 在程序实现中,数据的组织 (数据结构)与算法是密切相关的、互为依赖的。好的数据 结构有可能会导致一个高效率的算法。所以,Pascal 之父

10、、结构化程序设计的先驱 Niklaus Wirth 就认为,“算法+ 数据结构= 程序”。 6.3.2 算法的表示 我们可以用多种方式来描述算法中解决问题的步骤,包括用自然语言、伪代码(pseudo code)或流程图(flow chart)。当然,程序本身也是对算法的一个精确的表达。 在前面的一些例子中,我们基本采用自然语言的方式来描述算法。下面分别来介绍伪代 码和流程图的表示方法。 256 - Page 3- 伪代码是一种主要应用符号、接近于程序形式的算法表示方法。与程序相比,伪代码表 示主要关心算法的过程,而忽略程序中应有的一些细节(如变量定义等)。目前,伪代码还 没有标准。有些人使用得

11、过细(基本接近于程序),有些人应用得过粗。 流程图是算法的图形表示法。它使用大图的形式掩盖了算法的所有细节,只显示算法从 开始到结束的整个流程。在流程图表示中,用箭头表示各步骤处理的流程,用矩形代表各 处理步骤,用菱形代表处理的分支。 程序设计语言中最典型的三种控制结构可用流程图表示如下(图 6.13)。 真 假 假 判断 判断 语句i 真 语句模块 语句模块 语句i+1 i j 语句模块i 语句i+2 a) 顺序结构 b) 分支结构 c) 循环结构 图6.13 三种控制结构的流程图 前面,顺序查找的过程也可用以下流程图表示(图 6.14)。 查看下一个数 不存在 下个数存在否 存在 否 当前

12、数是否等 于所要找的数 是 找到,输出当前数位置 未找到 结束 图6.14 顺序查找 257 - Page 4- 同样,二分查找算法也可以用以下流程图(图6.15)来表示。 初 始 化 le ft 、rig h t 为 拟 查 找 序 列 的 首 尾 整 数 的 下 标 ;i= 1; 假 le ft = rig h t 真 m id d le = (le ft+ r ig h t)/2 x 小 x 大 比 较 待 查 找 数 x 与 m id d le 对 应 数 的 大 小 相 等 le ft= m id d le + 1 返 回 m id d le r ig h t= m id d le

13、+ 1 没 找 到 , 返 回 -1 图6.15 二分查找法 6.3.3 算法的设计 设计算法的目的是确定问题的求解步骤。实际上,人们在设计算法求解问题时往往会自 觉或不自觉地采用一些问题的分析与求解策略。这就是算法设计的思想或方法。比较典型的 算法设计方法有:贪心法、分治法、回溯法等。 1、贪心法(greedy) 贪心法 (Greedy)背后隐藏的基本思想是从小的方案推广到大方案的解决方法。它分阶 段工作,在每一个阶段总是选择认为当前最好的方案,而不考虑将来的后果。所以,贪心法 只需随着过程的进行保持当前的最好方案。这种 “眼下能多占便宜的就先占着”的贪心者的 策略就是这类算法名称的来源。

14、用这种策略设计的算法往往比较简单,但不能保证求得的最后解是最佳的。在许多情况 下,最后解即使不是最优的,只要它能够满足设计目的,这个算法还是具有价值的。 我们举一个经典的例子进一步说明贪心法的设计思路。 典型的贪心法的例子是找零钱问题:如果有一些硬币,其面值有 1 角、5 分、2 分和 1 分,要求用最少数量的硬币给顾客找某数额的零钱 (如2 角4 分)。 贪心法的思路是:每次选取最大面额的硬币,直到凑到所需要的找零数额。如2 角4 分 的找零问题,首先考虑的是用 “角”,共需要2 个 1 角,还余4 分;考虑 5 分,再考虑2 分, 最后的结果是用2 个 1 角2 个2 分。 当然,这种找零的方法不能保证最优。例如,若硬币中有面值7 分的硬币,现在要找 1 角4 分。贪心法的结果是 1 个 1 角,2 个2 分;而实际上用2 个7 分就可以了。 另外,从一系列整数中挑选最大值的整数也可以用贪心法来做。其设计思路是:逐个查 看这一系列整数,先认为第一个是最大的,然后查看下一个;若新观察到的整数比已知最大 的整数还要大,则更新当前最大值,直到看完所有的整数。这就相当于拿一箩筐苹果让你挑 一个

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1