Skip to content

Latest commit

 

History

History
128 lines (86 loc) · 6.7 KB

算法之道.md

File metadata and controls

128 lines (86 loc) · 6.7 KB

算法之道

邹恒明 著

1. 无穷与无有

无限容积的罐子和无限个球,球从 1 开始连续编号。

过 1 秒后,在罐子中放 1~10 个球,并将 10 号球取出;
再过 1/2 秒,在罐子中放 11~20 个球,并将 20 号球取出;
再过 1/4 秒,在罐子中放 21~30 个球,并将 30 号球取出;
...
再过 1/2^n 秒,在罐子中放 10*n+1~10*(n+1)个球,并将 10*(n+1) 号球取出;

就这样将游戏进行下去。

假定放球和取球不占时间。当时间达到 2 秒时,罐子里还有多少球? 答案是:无穷。

现在改变策略。将每次拿 10、20、30...号球变为拿 1、2、3...号球,即第 x 次拿球,所拿的球的编号是 x,罐子里还有多少球? 答案是:无有(即 0)。

再改变策略,球还是这样放,但是取球是随机拿出一球。罐子里还有多少球? 答案是:无有。

为什么? 个人理解:如果放球和取球能够建立一一映射的关系,则罐子里就没球。

2. 主定理

型如

T(n)=a*T(n/b)+f(n)

的递归函数,计算时间复杂度。

| 条件             | 复杂度                  |
| ---------------- | ----------------------- |
| f(n)<n^(logb(a)) | T(n)=n^(logb(a))        |
| f(n)=n^(logb(a)) | T(n)=n^(logb(a)) * logb(n) |
| f(n)>n^(logb(a)) | T(n)=f(n)               |
| 无法比较          |     没有规律,靠猜       |

3. 动态规划

动态规划策略是一种分治策略,即将问题分解为一个或多个子问题。

动态规划的策略的特点就是根据问题的具体情况,对选择进行动态调整,并且在每一步的调整中做出的都是一个最优的选择(因为做出选择所需的信息都已经知道)。而且该最优选择与对子问题的最优解组合,获得原问题的最优解。

动态规划要能够成功,需要注意: (1)最优子结构 (2)重叠子问题

在考虑使用动态规划策略时,一般战略如下: (1)证明问题的解决方案中包括一个选择,选择之后将留下一个或多个子问题 (2)设计子问题的递归描述形式 (3)证明对原问题的最优解里包括对所有子问题的最优解(通常使用反证法) (4)证明子问题之间重叠(保证效率。如果没有重叠子问题,则动态规划与一般的递归算法别无二致)

动态规划的时间成本可以简单表述为:全部子问题数量 X 选择数量

4. 贪婪算法

一步一步地构建问题的最优解决方案,其中每一步均只需眼前的最佳选择,即希望通过局部最优达到全局最优。

贪婪策略想要获得最优解,必须满足以下 2 个条件: (1)每个大问题的最优解里面,包括下一级小问题的最优解 (2)每个小问题可由贪婪选择获得(如果没有该属性,则贪婪选择将不能保证得到最优解)

5. 分治、贪婪与动态规划

类型 标准分治 动态规划 贪婪选择
适用类型 通用问题 优化问题 优化问题
子问题结构 每个子问题不同 很多子问题重复 只有一个子问题
最优子结构 NA 必须满足 必须满足
子问题数 全部子问题都要解决 全部子问题都要解决 只要解决一个子问题
子问题在最优解里 全部 部分 部分
选择与求解次序 先选择后解决子问题 先解决子问题后选择 先选择后解决子问题

6. 在线算法与离线算法

满足以下条件的算法称为在线算法: (1)一次只提供一个操作序列 S 里面的一个操作 (2)对于每个操作,算法必须立即执行所需的操作(在不知道将来的操作是什么的情况下)

满足如下条件的算法称为离线算法:离线算法可以事先看到整个操作序列

离线方式下,最优是可能的;而在线方式下,最优即使在理论上也是不可能的

7. 决策问题和优化问题

决策问题讨论的是“一个特定的表述”是否为真,而优化问题讨论的则是寻找一个最好或得分最高的解答。

优化问题又可以分为 2 种类型:最小优化问题和最大优化问题。前者试图找出一种成本最低的解答,而后者试图找出一个收益最高的解答。

优化问题和决策问题是相伴而行的,即有一个优化问题,就有一个对应的决策问题,而每一个决策问题也对应一个优化问题。

搜索问题、决策问题和最优化问题之间是等价的。

8. 不可决定问题

易解问题存在多项式时间解;NP 完全问题到目前尚未找到多项式时间解;而难解问题则不存在多项式时间解。

找不到或不存在多项式时间解,并不说明这些问题没有解。这三类问题都有解,即都存在解决方案,只不过这些算法解决方案的时间或空间效率不怎么样,没有实际价值。从这个角度来说,这些问题都是可决定的问题:只要给出足够的时间,总能算出解。

但这个世界上还存在一类问题,它们是无解的,即不可能找到时间解,哪怕花费的时间成本是指数级或指数的指数级都无济于事。这些问题呗称为不可决定问题。

不可决定问题的一个根本特性是算法解决方案不存在,不论我们愿意花费多少时间和精力都无济于事。

9. 问题的分类

问题类型 描述 有理论解 有实际解 潜在证人有限
易解问题 多项式时间解决方案已知
NP 完全问题 多项式时间解决方案未知 是/否
难解问题 多项式时间解决方案不存在
部分不可决定问题 算法解决方案不存在,但证人数量有限 未知
高度不可决定问题 算法解决方案不存在,且证人数量无限 未知
不可解问题 任何解决方案都不存在 没有证人

图灵的停机问题,就是一个不可解问题。