算法的乐趣1.1 什么是算法_算法的乐趣1.1 什么是算法试读-查字典图书网
查字典图书网
当前位置: 查字典 > 图书网 > 编程 > 算法的乐趣 > 1.1 什么是算法

算法的乐趣——1.1 什么是算法

本章的标题既然是“程序员与算法”,就必然要涉及一个基本问题,那就是“程序员是否必须会算法”。这是一个充满争议的问题,虽然并不像“生存还是毁灭”之类的选择那样艰难而沉重,但也绝不是一个轻松的话题。朋友们在我的“算法系列”博客专栏上发表的评论和回复,并不都是我所期待的赞美和鼓励,也常常会有一些冷言冷语。比如,“穷举也算是算法吗”或者“请你说明一下算法在XX系统中能起到什么作用”。 有一次,一个网友通过邮件问我:“你写的都是小儿科的东西,几十行代码就能搞定,能不能整一点高深的算法?”我反问他什么是他所理解的高深的算法,他答复说:“像遗传算法、蚁群算法之类的。”于是我给了他一个遗传算法求解0-1背包问题的例子(参见第16章),并告诉他,这也就是几十行代码的算法,怎么理解成是高深的算法?他刚开始不承认这是遗传算法,直到我给了他Denis Cormier公开在北卡罗来纳州立大学服务器上的遗传算法的源代码后,他才相信他一直认为深不可测的遗传算法的原理原来是这么简单。 还有一个网友直言我写的“用三个水桶等分8升水”之类的问题根本就称不上算法,他认为像“深蓝”那样的人工智能才算是算法。我告诉他计算机下棋的基本理论就是博弈树,或者再加一个专家系统。但是他认为博弈树也是很高深的算法,于是我给了他一个井字棋游戏(参见第23章),并告诉他,这就是博弈树搜索算法,非常智能,你绝对战胜不了它(因为井字棋游戏很简单,这个算法会把所有的状态都搜索完)。我相信他一定很震惊,因为这个算法也不超过100行代码。 对于上面提到的例子,我觉得主要原因在于大家对算法的理解有差异,很多人对算法的理解太片面,很多人觉得只有名字里包含“XX算法”之类的东西才是算法。而我认为算法的本质是解决问题,只要是能解决问题的代码就是算法。在讨论程序员与算法这个问题之前,我们先探讨一个最基本的问题:什么是算法。 1.1 什么是算法 《算法导论》一书将算法(algorithm)描述为定义良好的计算过程,它取一个或一组值作为输入,并产生一个或一组值作为输出。Knuth在《计算机程序设计艺术》一书中将算法描述为从一个步骤开始,按照既定的顺序执行完所有的步骤,最终结束(得到结果)的一个过程。Weiss在《数据结构与算法分析》一书中将算法描述为一系列的计算步骤,将输入数据转换成输出的结果。 虽然没有被普遍接受的“算法”的正式定义,但是各种著作中对算法的基本要素或基本特征的定义都是明确的,Knuth总结了算法的四大特征。  确定性。算法的每个步骤都是明确的,对结果的预期也是确定的。  有穷性。算法必须是由有限个步骤组成的过程,步骤的数量可能是几个,也可能是几百万个,但是必须有一个确定的结束条件。  可行性。一般来说,我们期望算法最后得出的是正确的结果,这意味着算法中的每一个步骤都是可行的。只要有一个步骤不可行,算法就是失败的,或者不能被称为某种算法。  输入和输出。算法总是要解决特定的问题,问题来源就是算法的输入,期望的结果就是算法的输出。没有输入的算法是没有意义的,没有输出的算法是没有用的。 算法需要一定的数学基础,但是没有任何文献资料将算法限定于只解决数学问题。有些人将贪婪法、分治法、动态规划法、线性规划法、搜索和枚举(包括穷尽枚举)等方法理解为算法,其实这些只是设计算法常用的设计模式(Knuth称之为设计范式)。同样,计算机程序只是算法的一种存在形式,伪代码、流程图、各种符号和控制表格也是常见的算法展示形式。而顺序执行、并行执行(包括分布式计算)、递归方法和迭代方法则是常用的算法实现方法。 综合以上分析和引述,本人将算法定义为:算法是为解决一个特定的问题而精心设计的一套数学模型以及在这套数学模型上的一系列操作步骤,这些操作步骤将问题描述的输入数据逐步处理、转换,并最后得到一个确定的结果。使用“精心设计”一词,是因为我将算法的设计过程理解为人类头脑中知识、经验激烈碰撞的过程,将算法理解为最终“小宇宙爆发”一般得到的智力结果。

展开全文


推荐文章

猜你喜欢

附近的人在看

推荐阅读

拓展阅读

《算法的乐趣》其他试读目录

• 1.1 什么是算法 [当前]
• 1.2 程序员必须要会算法吗
• 1.3 算法的乐趣在哪里
• 1.4 算法与代码
• 1.5 总结
• 7.1 稳定匹配问题
• 7.2 Gale-Shapley算法的应用实例
• 7.3 有多少稳定匹配
• 7.4 二部图与二分匹配
• 7.5 总结
• 7.6 参考资料
  • 大家都在看
  • 小编推荐
  • 猜你喜欢
  •