作业 13

读书笔记

进入21世纪,整个世界的高科技发展突飞猛进。在高新技术潮流中,计算机科学与技术占据着非常重要的地位。然而,说到计算机科学与技术,必然要提及的则是算法。
本学期,我也通过算法分析与设计课程,在先前的学习基础上,更深入地接触和了解了算法。为了更好地理解和掌握课上学习到的算法,并一定程度地进行拓展延伸,我找到了《算法设计与分析基础》这本书。老师课上所讲解的很多算法在这本书中都能够找到,结合课堂笔记和课后作业,这本书看起来并不特别费力,讲解方式易于接受,对于我们这样的“新手”来说非常友好。
书中说,教授算法有两种方式:一种是按照问题的类型对算法进行分类,另一种则是根据设计技术来分类。不同于常见的教科书,本书选择了后者,将许多面目迥异的算法归为一类,每一章都围绕一种特定的设计技术展开,用一种全新的视角教授算法设计,这与算法课上老师的教学方式不谋而合。例如,书中利用蛮力法这一种设计技术,解决了冒泡排序、图报问题、旅行者问题、背包问题等问题;利用贪婪技术,讲解了Prim算法、Kruska算法、Dijkstra算法和哈弗曼树等。
在算法学习中,算法的分析对我来说是一个难点,因此我也比较关注这一点。而通过阅读这本书,我了解到对算法的分析有两种主要方法,一种是对算法效率做数学分析,另一种则是经验分析。“对算法效率的经验分析”深深吸引了我。
书中首先给出了一个对算法效率做经验分析的通用方案:1.了解实验目的2.决定要用操作次数还是直接用时间来度量算法效率3.决定样本的特性:范围和大小等4.为实验准备算法的程序实现5.生成输入样本6.执行,记录并观察数据7.分析得到的数据。如何进行经验分析,则是围绕这一方案进行讲解。
在做经验分析时,首先要考虑目标,实验的具体涉及依赖于具体的目标。常见的目标包括:检验算法结论的精确性,比较相同问题不同算法或相同算法不同实现的效率等。
实验的目标会影响、甚至决定对算法效率的度量。如何度量算法效率常见的一种简单操作,就是在算法中插入计数器,记录操作次数。利用这种方法时,为了保证其正确性,在每次修改程序后都要对它进行测试。此外,第二种方法则是利用系统命令或其他可行方法,查询程序开始和结束的时间,计算时间差得出程序运行时间。然而,需要明确的是系统时间是存在一定误差的,且现代计算机速度很快,程序运行时间可能被报告为0,此外报告的时间很可能包含了CPU运行其他程序的时间。所以这种度量方法是存在一定弊端的。
无论选择基本操作计数方法还是系统计时法,我们都必须确定实验样本的特性。一般来说,我们用一个样本来代表一类“典型”输入,即实例,比如书中旅行者算法部分作为测试基准的实例。但更多时候,样本由实验者确定。针对于样本规模,一种比较明智的做法是先从一个相对较小的样本开始,后续如果有必要再加大;对于样本的范围,则要根据具体程序,不要小得没有意义,也不要过分大。
我们有时要在所选范围内产生输入的程序,对此,输入的规模既可以符合一种模式,也可以随机产生。根据一种莫斯改变输入规模的主要优点在于能够便利我们分析这种改变带来的影响。例如对样本规模进行翻倍,可以计算算法效率度量M之间的比率M(2n)/M(n)。对于不同实例,我们需要考虑是否要包含相同规模的不同实例,这便需要根据我们预测观测到的度量值是否会因此产生不同。此外,对于算法效率的经验分析而言,大多数情况下是需要产生随机数的,目前由于其产生原理的是近似的,计算机科学家倾向于称之为“伪随机数”。从实用出发,一般利用随机数发生器。另外,还有产生随机数的算法,其中研究最为彻底、使用比较广泛的是线性同余法——Random(n,m,seed,a,b)。
Random(n,m,seed,a,b)
//生成n个随机数的序列
//输入:正整数n和正整数参数m,seed,a,b
//输出:n个随机数的序列r1,r2,…,rn,该序列值是均匀分布在0和m-1区间内的整数值
r0←seed
for i←1 to n do
r1←(a*r i-1 +b) mod m
最后,经验数据(实验结果)需要记录下来并进行分析,可利用表格或散点图的形式记录。一般将两种形式结合起来利用,取长补短。表格记录便于计算,而散点图更容易确定算法侠侣的类型。例如:对数算法的散点图呈上凸形状,线性算法的散点趋向于分布在直线周围,nlgn、n^2、立方算法的散点图会具有下凹形状……
经验分析可用于外推法,即预测对于不包含在样本中的输入,算法会表现出来的性能。例如M(n)/g(n)→c,则可用cg(n)表示其他的M(n)。虽然这种做法是具有道理的,但要小心使用,用这种做法得到的估计值常常是不做精度声明的。
相对于数学分析,经验分析的主要优点是能够适用于任何算法,但结论依赖于实例和计算机。算法效率经验分析的学习对我在算法复杂度分析的方面有一定帮助,本书的末尾还总结了一系列算法复杂度分析的公式。此外,每一种算法和思想的讲解之后,书中都会提供相关的练习题,帮助读者进行练习实践。对于算法分析初学者来说,这本书是值得推荐的。
此外,在本学期课程和本书的阅读之后我有了对于算法的新认识。算法是一系列解决问题的清晰指令,即对于符合一定规范的输入,能够在有限的时间内获得相应的输出。狭义来说,算法就是用计算机解决问题的方法。算法是计算机科学的一个分支,更是其核心。当前,从理论的角度来看,对算法的研究已经被工人是计算机科学的基石。无论是计算科学还是计算实践,算法都在其中扮演着重要的角色。事实上,可以毫不夸张地说,算法与绝大多数科学、商业和技术都存在着或多或少的联系,而且学习算法对于开发人的逻辑思维和分析能力非常有帮助。因而,算法的学习在当前的环境之下显得尤为必要。同时,在算法学习中一定要注重学练结合,这样才能更好地代入体会相关思维,将算法中包含的思维内化到自己的思维中,用之于更多算法学习以及其他学习中,甚至用之于生活情境之中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值