第五章 完全搜索(Complete search)
又不知道怎么翻译了,所以还是把原词放着…
首先介绍了一下完全搜索是一种基本上能够解决所有算法问题的方法。主要思想就是遍历整个解空间来寻找问题的答案。
第一节讲了如何生成子集,也就是我们如何得到一个集合的幂集,给了两个实现方案。一个是递归的实现,一个是迭代的实现。
第二节讲了如何生成全排列。也讲了两种方法,第一种递归和生成子集的递归算法差不多。第二种迭代方法则是借用了标准库函数next_permutation,这个函数还是非常好用的~
第三节讲了回溯,用的是放置皇后的例子,用递归解决的。简简单单,可可爱爱。
第四节讲了剪枝,可以用来优化回溯等很多问题,我遇到的一些问题我就是先从暴力出发,然后通过一步步的剪枝,最后达到AC的。这里书里面举了一个遍历方阵当中所有块的问题,由于起点和终点固定,所以有很多可以优化剪枝的地方。作者进行了四步优化。这里不细说了,可以看书了解。
第五节讲了个Meet in the middle(这我真不知道怎么翻译),大致的思想就是解的搜索空间分成两部分,然后没部分单独进行过问题的解决,最后把答案合起来,感觉就是分治法。举得例子是一个寻找和是否可行方案。这个问题可不要太经典,后面还会遇到。
第六章 贪心算法(Greedy algorithms)
这个我总知道怎么翻译了,哈哈哈哈
首先,贪心算法是一个步步寻找最优解的算法。贪心算法的难点在于如何寻找一个合适的贪婪策略,可以生成最优的结果。
第一节,硬币问题,如何用给定的一些面额的硬币,用最少的硬币数凑出一个指定的和。这个和上一章最后一节问题基本上是一样的,不过说这个更加有现实基础一些。在作者开始给的例子中,我们只需要尽量多使用大额的硬币(贪心)便可以达到最优结果。但是作者随后又抛出了一个当我们硬币面额比较接近的时候这种策略不会得到最优结果的例子。
第二节,规划,给定一些时间的开始时间和结束时间,我们想要在指定的时间内完成尽可能多的任务。这个时候的贪心策略是怎么样的呢?作者分为三步分别探索寻找持续时间最短、开始时间最早、结束时间最早。通过举例,我们可以得到正确的贪心策略是每次寻找结束时间最早的事件。可以很简单的论证出来。
第三节,任务与期限,给定一些任务持续时间和对应期限,每个任务离期限越早完成便可以得到越多的分数,超越期限越多则会扣越多的分数,目标是获取尽可能多的分数。这个算法的的贪心策略就只是单纯的每次选择持续时间最短的任务,和对应期限一点关系都没有,也可以通过简单的论证得到这个策略为什么是最优的。
第四节,最小化和(Minimizing sums),给定一些数,找出一个数x使得这些数与x的差的C幂次和最小,C是个常数。作者讨论了当C=1和C=2的情况,学过统计应该知道,这里当C=1时,中位数是最佳结果。当C=2时,均值是最佳结果。
第五节,数据压缩(Data compression),哈夫曼编码YYDS!!!
我我我我我
抱歉,这是一篇历时两天的文章,问题在于我虽然用的静音键盘,但是在自习室似乎还是吵到了我的隔壁,因为我看到戴起了耳机,所以隔天换了个地方再写,今天又读了两章,分别是动态规划和Amortized analysis。