标签:
这个专题我们开始对《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,可以满足两行两列和两个对角线)剩余的部分我们只需要枚举为数不多的情况,便可得到最终解。
可以看到,这种方法本质上还是一种穷举,但是是一种范围极小的穷举,由于其基于了一定程度的优化处理,这往往是利用穷举策略时的核心所在。
标签:
原文地址:http://www.cnblogs.com/rhythmic/p/5487590.html