【学习笔记】<算法导论>基础知识1.1

来源:互联网 发布:recyclerview清空数据 编辑:程序博客网 时间:2024/05/16 12:56

【学习笔记】<算法导论>基础知识1.1

译者序

Thomas H.Cormen著的《Introduction to Algotithms》是世界范围内包括MIT/CMU/Stanford/UCB/Cornell/UIUC等国际和国内等1000多所大学都作为教材或者教学参考书,它也是《高引用计算机科学文献》(Most Cited Computer Science Citations)一览表中名列前茅。

书中内容

不仅包括典型算法、算法分析、算法设计方法和NP等内容,还包括高级数据结构。
文章的各章节是相互独立的。
课程的习题答案网址:http://mitpress.mit.edu/algorithms/

第一部分-基础知识

什么是算法?

非正式的,算法就是任何的计算过程,该过程取某个值或者值的集合作为输入并产生某个值或值的集合作为输出。算法就是把输入转换为输出的计算步骤。
可以把算法成为计算问题的工具
算法就是描述一个特定的计算过程来实现输入/输出关系.
比如说:我们有一个非递减排序。
**输入:**n个数的一个序列(a1,a2,…an)
输出:(a1’,a2’,a3’,…a4’),满足a1’≤a2’≤…≤a4’。
比如<31,41,59,26,41,58>,排序算法将返回序列<26,31,41,41,58,59>,这样的输入序列成为排序问题的一个实例(instance).问题实例是计算该问题所必需的的输入组成。
许多的程序都会用到排序算法,排序是计算机科学中的一个基本操作,现在已经有很多的排序算法,对于不同的应用,每种算法都有不同的优势,排序算法主要依赖于:被排序的项数,对于项数值的限制,这些项数被修改的程度,计算机体系结构,以及使用的存储设备(主存、磁盘或者磁带)。
一般对于每个输入的实例算法输出正确,则称该算法正确。
并解决了给定的计算问题,但是有时候不正确的算法只要其错误率可控也是有用的,比如31章中,我们研究大素数算法时,将看到可控错误率的例子,但是通常我们只关心正确的算法。

算法解决哪种问题

算法的使用无处不在。例如
- 人类基因组工程,包含10万对基因,确定30亿个化学基对的序列,在数据库中存储和分析就需要算法进行分析,可以节省人和机器的时间和金钱。
- 互联网使得人们能够快速访问和检索大量的信息,需要借助算法来管理和处理这些海量的数据。
- 电子商务使得货物和服务通过电子的形式进行洽谈和交换,并且依赖于信用卡号、密码和银行结单等这类个人信息的保密性,其中电子商务中的公钥密码和数字签名,是以数值计算和数论为基础的。
- 制造业和其他的商务企业常常需要最有益的方式来分配稀有的资源,比如石油公司在什么地方开发油田合适?候选人在什么地方购买竞选广告?互联网提供商在什么地方确定资源放置的位置以更好的服务其客户,这些都是线性规划的问题。
虽然这些例子超过了本书的范围,但是本书确实涉及了一些适用这些问题的基本技术本书还说明了如何求解下列问题

  • 给定一张交通图,上面标记每对相邻十字路口之间的距离,确定从一个十字路口到另一个十字路口的最短距离,建立一个图并需找最短路径可以解决这个问题。
  • 对于给定的两个有序的符号序列X=(x1,x2,x3,…,xm)和Y=(y1,y2,y3,y4,…,yn),求出X和Y的最长的公共序列,这是动态规划的一个实例。
  • 给定一个依据部件库的机械设计,其中每个部件可能包含其他部件的实例,我们需要依次列出这些部件,以便每个部件出现在使用它的任何部件之前。如果该设计由n个部件组成,则存在着n!中可能的顺序,这比指数函数增长还快,这个问题是拓扑排序的一个实例。
  • 给定平面上的n个点,我们希望找到这些点的凸壳,凸壳就是包含这些点的最小的凸多边形。
  • 像这类的问题还是很多的,但是这些有趣的算法共有两个特征。(1)存在许多的候选解,但是绝大多数的候选解都没有解决手头的问题,寻找一个真正的解决或者一个最好的解是最大的挑战。(2)算法解决的每个问题并不都有个容易识别的候选解集,例如:有时候需要变换时域为频域。

数据结构

数据结构是存储和组织数据的方式,旨在便于访问和修改,没有一种单一的数据结构对于所有的用途都是有效的,所以重要的是要知道每种数据结构都有优势和局限性。

技术

虽然本书可以当一本“菜谱”来使用,但是也许某一天你遇到的一个问题,你无法很快的找到一个已有的方法来解决它(比如本书的后面的练习和思考题),本书会教你一些算法的设计和分析的技术,以方便你自己设计算法、证明其正确性和理解其效率。

难题

我们讨论大部分的有效的算法,通常用速度来度量效率,也就是一个算法要花多长的时间来产生结果,但是有时候我们还没有找到一个有效的解法,这类问题叫做NP完全问题
NP完全问题是有趣的?(1)对于是否存在有效算法是未知的。(2)NP完全问题集有个非凡的性质,就是对于任何一个NP完全问题如果存在有效地算法,那么所有的NP完全问题都存在有效的算法,NP完全问题的这种关系使有效解的缺乏更加的诱人。(3)计算机科学家通过问题的描述的小小的改变来很大的改变已知最佳算法的效率。
你应该了解NP安全问题,因为有些NP安全问题会时不时的在实际的应用中跳出来,如果要求你找出一个NP完全问题的有效解法,那么你就可能花费许多的时间在毫无结果的探寻中,如果你能证明这个问题是完全NP的,那么你可以把时间花费到开发一个有效的算法,这个算法是一个好的解,但不一定是最好的可能解。
作为一个具体的实例,考虑一家具有一个中心仓库的投递公司,每天在中心仓库为每辆车投递货物并发送出去,以将货物投递到结构地址,每天结束时,每辆货车返回以便第二天装货,为了节省成本,公司希望选择投递站的一个序,按照此序产生每辆货车行驶的最短总距离,这个问题就是著名的“旅行商问题”.并且它是NP完全的,它没有已知的有效地方法,但是在某种特定的条件下,我们知道最有效的方法,它们给出了一个离最小可能解不远的总距离,这个就是“近似算法”。

并行性

我们知道处理器的时钟速度是以某个持续的比率增加了多年,但是物理的限制对不断提高的时钟速度给出了一个基本的路障:因为功率密度随着时钟速度超线性增加,一旦时钟速度变得足够快,芯片将有融化的危险。所以对于每秒更多的计算,芯片通常涉及成不止一个核,我们可以把多核比拟成单一芯片上的几台顺序的计算机:换句话说,是并行计算机。

练习

(1)给出显示生活中需要排序或者计算凸壳的例子。
排序例子:学生成绩排名,比赛排名等
凸壳例子:图像处理中筛选出特定形状的物体。
(2)除了速度外,真实的环境中还有可能与那些其他的效率度量。
处理相同数据的所有的时间。
耗电量。
所需要的硬件资源。
(3)选择一种以前已知的数据结构,并讨论优势和局限性。
数组,优势可以轻松地访问每个元素,速度较慢。
(4)前面给出的最短路径和旅行商问题有哪些相似之处?又有什么不同?
都是找最短路径问题,前面的有有效解,后面的是NP完全问题,只能找到可能的接近的有效解。
(5)提出一个现实生活中的问题,其中只有最佳解才行,然后提出一个问题,其中近似最佳的一个解足够好。
从学校回家,怎样才最快回家?怎样才最省钱回家?
泰坦尼克号中的落水的人,选择那块木板比较好?

0 0
原创粉丝点击