欢迎来到天天文库
浏览记录
ID:36969433
大小:30.79 KB
页数:10页
时间:2019-05-16
《算法分析与设计基础》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、算法分析与设计基础(清华版)Takenfrom"IntroductiontoTheDesignandAnalysisofAlgorithms"byAnanyLevitin节选自《算法设计与分析基础》潘彦译蛮力法就像宝剑不是撬棍一样,科学也很少使用蛮力。——EdwardLytton(1830-1873),leila,第二卷,第一章认真做事常常是浪费时间。——RobertByrne,撞球大师,台球选手和作家人们是这样描述它的:蛮力法是一种简单直接地解决问题的方法,常常直接基于问题的描述和所涉及的概念定义。这里的“力”是指计算机的能“力”,而不是人的智“力”。我们也
2、可以用“直接做吧!”来描述蛮力法的策略。而且一般来说,蛮力策略也常常是最容易应用的方法。虽然巧妙和高效的算法很少来自于蛮力法,但我们不应该忽略它作为一种重要的算法设计策略的地位。第一,和其他某些策略不同,我们可以应用蛮力法来解决广阔领域的各种问题(实际上,它可能是惟一一种几乎什么问题都能解决的一般性方法)。具体来说,蛮力法常常用于一些非常基本、但又十分重要的算法,比如计算n个数字的和,求一个列表的最大元素,等等。第二,对于一些重要的问题来说(比如:排序、查找、矩阵乘法和字符串匹配),蛮力法可以产生一些合理的算法,它们多少具备一些实用价值,而且并不限制实例的规模
3、。第三,如果要解决的问题实例不多,而且蛮力法可以用一直能够接受的速度对实例求解,那么,设计一个更高效算法所花费的代价很可能是不值得的。第四,即使效率通常很低,仍然可以用蛮力算法解决一些小规模的问题实例。最后,一个蛮力算法可以为研究或教学目的服务,例如,它可以作为准绳,来衡量同样问题的更高效算法。下列这些著名的算法可以看作是蛮力法的例子:基于定义的矩阵乘法算法;选择排序;顺序查找;简单的字符串匹配算法。穷举查找是解组合问题的一种蛮力方法。它要求生成问题中的每一个组合对象,选出其中满足该问题约束的对象,然后找出一个期望的对象。旅行商问题、背包问题和分配问题是典型的
4、能够用穷举查找算法求解的问题,至少在理论上是这样的。除了相关问题的一些规模非常小的实例,穷举查找法几乎是不实用的。分治法无论人们在祈祷什么,他们总是在祈祷一个奇迹。每一个祈祷都可以简化为:伟大的上帝呀,请让两个二相加不等于四吧。——伊万·屠格涅夫(1818-1883),俄国作家和短篇小说家分治法可能是最著名的通用算法设计技术了。虽然它的名气可能和它那好记的名字有关,但它的确是当之无愧的:很多非常有效的算法实际上是这个通用算法的特殊实现。其实,分治法是按照以下方案工作的:·将问题的实例划分为同一个问题的几个较小的实例,最好拥有同样的规模。·对这些较小的实例求解(
5、一般使用递归方法,但在问题规模足够小的时候,有时也会使用一些其他方法)。·如果必要的话,合并这些较小问题的解,以得到原始问题的解。不是所有的分治算法都一定比简单蛮干更有效。但是,通常我们向算法女神所做的祈祷都被应允了,因而,使用分治法往往比使用其他方法效率更高。实际上,分治法孕育了计算机科学中许多最重要和最有效的算法。虽然我们通常只考虑顺序算法,但要知道,分治法对于并行算法是非常理想的,因为各个子问题都可以由不同的CPU同时计算。许多分治算法的时间效率T(n)满足方程T(n)=aT(n/b)+f(n)。一些应用分治法的案例:合并排序是一种分治排序算法。它把一个
6、输入数组一分为二,并对它们递归排序,然后把这两个排好序的子数组合并为原数组的一个有序排列。在任何情况下,这个算法的时间效率都是Θ(nlogn),而且它的键值比较次数非常接近理论上的最小值。它的主要缺点是需要相当大的额外存储空间。快速排序是一种分治排序算法,它根据元素值和某些事先确定的元素的比较结果,来对输入元素进行分区。快速排序十分有名,这不仅因为对于随机排列的数组,它是一种较为出众的nlogn效率算法,而且因为它的最差效率是平方级的。折半查找是一种对有序数组进行查找O(logn)效率算法。它是应用分治技术的一个非典型案例,因为在每次迭代中,它只需要解决两个问
7、题的一个。二叉树的经典遍历算法——前序、中序、后序和其他类似的算法都需要递归处理左右两棵子树,它们都可以当作是分治技术的例子。用一些特定的外部顶点来替代给定树的空子树,有助于对这些算法进行分析。有一种处理两个n位整数相乘的分治算法,大约需要做n(index:1.585)次一位数乘法。Strassen算法只需要做7次乘法就能计算出两个2桔方阵的积,但比基于定义的算法要做更多次的加法。利用分治技术,该算法计算两个n阶方阵的积,但比基于定义的算法要做更多次的加法。利用分治技术,该算法计算两个n阶方阵的乘法时需要做n(index:2.807)次乘法。分治技术可以成功地
8、应用于两个重要的计算几何问题:最近对问
此文档下载收益归作者所有