码迷,mamicode.com
首页 > 其他好文 > 详细

《algorithm puzzles》——概述

时间:2016-05-13 13:49:22      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:

  这个专题我们开始对《algorithm puzzles》一书的学习,这本书是一本谜题集,包括一些数学与计算机起源性的古典命题和一些比较新颖的谜题,序章的几句话非常好,在这里做简单的摘录。

  手里拿着一把锤子,看什么都像钉子。我们这个年代最厉害的锤子就是算法。——William Poundstone.
  解题是一种实用技能,怎么说呢,有点像游泳吧。我们学习任何使用技能的办法就是模仿和实践。——George Polya.
  如果想使得上课不那么无聊,那么没有比加入带有创造力的主题更好的办法了,这些主题的特点就是带有娱乐、幽默、美感和惊喜。——Martin Gardner
  给人以最大享受的,不是知识,而是钻研;不是拥有,而是跋涉。——Carl Friedrich Gauss
  若是我不小心遗漏了一些多少有用或必要的内容,还请多多包涵,因为人人都会犯错,也不可能预知一切。——Fibonacci

  首先我们对“算法谜题”这个概念稍作释义,每个算法问题都应该有所谓的“谜面”,它可以是具体的,也可以是一般的。举个例子来说,给出利用天平检测出含有1枚假币的8枚硬币,这里的“8”就是一个谜面,或者更加抽象的说,在解决算法问题中我们致力于给出一个正确且高效的function(),一个计算的过程、一个有功能的函数,而显然谜题本身应该具备相应的自变量x,而f(x)就是这个问题的解。

  在解决算法谜题的时候,我们有一些通用的解题策略,比如穷举、回溯、分治、减治、变治、贪心、动态规划、递归等,这篇文章就是主要从思想层面来介绍这些解决算法问题的工具利器,以达到提升算法思维的目的。

 

  穷举:

  幻方:构造一个三阶幻方。(3*3的格子中填充数字1~9,是的每一行、每一列、两条对角线上的数字和都相等)。

  很容易想到,我们对于这样一个3*3的方格,有且仅有9!种填充数字的方法,然后我们进行一一验证找到符合的方案即可,然而这个过程貌似太过机械化,计算量也太大。这其实体现了穷举算法的两个特点,其一是解集可知性,我们在这里能够一目了然的知道这个问题中能够出现的所有情况。其二便其庞大的计算量和低效率,这一点使得其在解决谜面范围不确定或者较大的时候,显得捉襟见肘。

  然而有没有更好的方法呢?我们易证每行、每列以及对角线的和是15,由对称性的思维,我们能够看出5应该放在正中间。(1-9,2-8,3-7,4-6,可以满足两行两列和两个对角线)剩余的部分我们只需要枚举为数不多的情况,便可得到最终解。

  可以看到,这种方法本质上还是一种穷举,但是是一种范围极小的穷举,由于其基于了一定程度的优化处理,这往往是利用穷举策略时的核心所在。

 

 

《algorithm puzzles》——概述

标签:

原文地址:http://www.cnblogs.com/rhythmic/p/5487590.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!