算法分析与设计基础 (清华版)

本文探讨了分治算法的基本原理,强调其在解决复杂问题中的高效性,同时也指出并非所有问题使用分治都能优于直接方法。分治策略包括问题分解、子问题求解和结果合并三个步骤。贪婪算法则在每一步选择局部最优解,期望最终得到全局最优解。虽然贪婪算法并不总是能找到最优解,但在特定问题上依然有价值。此外,介绍了分支限界法,通过节点的边界值与当前最佳解比较,以优化搜索过程并找到潜在的最优解。
摘要由CSDN通过智能技术生成
               
Taken from "Introduction to The Design and Analysis of Algorithms" by Anany Levitin
节选自《算法设计与分析基础》潘彦 译
蛮力法
就像宝剑不是撬棍一样,科学也很少使用蛮力。
——Edward Lytton (1830 - 1873),leila,第二卷,第一章
认真做事常常是浪费时间。
——Robert Byrne,撞球大师,台球选手和作家
人们是这样描述它的:蛮力法是一种简单直接地解决问题的方法,常常直接基于问题的描述和所涉及的概念定义。这里的“力”是指计算机的能“力”,而不是人的智“力”。我们也可以用“直接做吧!”来描述蛮力法的策略。而且一般来说,蛮力策略也常常是最容易应用的方法。虽然巧妙和高效的算法很少来自于蛮力法,但我们不应该忽略它作为一种重要的算法设计策略的地位。第一,和其他某些策略不同,我们可以应用蛮力法来解决广阔领域的各种问题(实际上,它可能是惟一一种几乎什么问题都能解决的一般性方法)。具体来说,蛮力法常常用于一些非常基本、但又十分重要的算法,比如计算n个数字的和,求一个列表的最大元素,等等。第二,对于一些重要的问题来说(比如:排序、查找、矩阵乘法和字符串匹配),蛮力法可以产生一些合理的算法,它们多少具备一些实用价值,而且并不限制实例的规模。第三,如果要解决的问题实例不多,而且蛮力法可以用一直能够接受的速度对实例求解,那么,设计一个更高效算法所花费的代价很可能是不值得的。第四,即使效率通常很低,仍然可以用蛮力算法解决一些小规模的问题实例。最后,一个蛮力算法可以为研究或教学目的服务,例如,它可以作为准绳,来衡量同样问题的更高效算法。
下列这些著名的算法可以看作是蛮力法的例子:基于定义的矩阵乘法算法;选择排序;顺序查找;简单的字符串匹配算法。穷举查找是解组合问题的一种蛮力方法。它要求生成问题中的每一个组合对象,选出其中满足该问题约束的对象,然后找出一个期望的对象。旅行商问题、背包问题和分配问题是典型的能够用穷举查找算法求解的问题,至少在理论上是这样的。除了相关问题的一些规模非常小的实例,穷举查找法几乎是不实用的。
分治法
无论人们在祈祷什么,他们总是在祈祷一个奇迹。每一个祈祷都可以简化为:伟大的上帝呀,请让两个二相加不等于四吧。
——伊万·屠格涅夫(1818 - 1883),俄国作家和短篇小说家
分治法可能是最著名的通用算法设计技术了。虽然它的名气可能和它那好记的名字有关,但它的确是当之无愧的:很多非常有效的算法实际上是这个通用算法的特殊实现。其实,分治法是按照以下方案工作的:
  • 将问题的实例划分为同一个问题的几个较小的实例,最好拥有同样的规模。
  • 对这些较小的实例求解(一般使用递归方法,但在问题规模足够小的时候,有时也会使用一些其他方法)。
  • 如果必要的话,合并这些较小问题的解,以得到原始问题的解。

不是所有的分治算法都一定比简单蛮干更有效。但是,通常我们向算法女神所做的祈祷都被应允了,因而,使用分治法往往比使用其他方法效率更高。实际上,分治法孕育了计算机科学中许多最重要和最有效的算法。虽然我们通常只考虑顺序算法,但要知道,分治法对于并行算法是非常理想的,因为各个子问题都可以由不同的CPU同时计算。许多分治算法的时间效率T(n)满足方程T(n)=aT(n/b)+f(n)。

一些应用分治法的案例:
合并排序是一种分治排序算法。它把一个输入数组一分为二,并对它们递归排序,然后把这两个排好序的子数组合并为原数组的一个有序排列。在任何情况下,这个算法的时间效率都是Θ(nlogn),而且它的键值比较次数非常接近理论上的最小值。它的主要缺点是需要相当大的额外存储空间。
快速排序是一种分治排序算法,它根据元素值和某些事先确定的元素的比较结果,来对输入元素进行分区。快速排序十分有名,这不仅因为对于随机排列的数组,它是一种较为出众的nlogn效率算法,而且因为它的最差效率是平方级的。
折半查找是一种对有序数组进行查找O(logn)效率算法。它是应用分治技术的一个非典型案例,因为在每次迭代中,它只需要解决两个问题的一个。
二叉树的经典遍历算法——前序、中序、后序和其他类似的算法都需要递归处理左右两棵子树,它们都可以当作是分治技术的例子。用一些特定的外部顶点来替代给定树的空子树,有助于对这些算法进行分析。
有一种处理两
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值