今天继续看《编程之美》的第三个问题。
问题的描述就不多说了,这是一个典型的离散数学问题(这个链接有非常详细的问题描述),喜欢图案的童鞋(比如我),可以参看CMU的一个讲义。
从1975年比尔盖茨和他的导师发表的文章:Gates, W. and Papadimitriou, C. "Bounds for Sorting by Prefix Reversal." Discrete Mathematics. 27, 47~57, 1979. 开始,二三十年间不断有人在讨论。现在维基百科中对这个问题有两个词条pancake sorting和prefix reversal。
书中的初步解析大体思路自然是没有一点问题,只是得出的上界结论有点不正确,这个直接影响了书中递归退出条件:“我们至多需要 2(n-1)次翻转就可以把所有烙饼排好序”。这个数值应该是2n-3,如下推理:我们知道将最大尺寸的放在最下边最多需要2次,此时取这n个中的n-2个(剩下那个最小的和次最小的),将这个n-2个煎饼按由小到大放置好最多需要2(n-2)次,此时还有两个,最多只需要1次就可以完成整个煎饼的排序。所以,上限次数为2(n-2)+1=2n-3。
当然这个是上限,会有更优化的解法,于是书中就给出了一些讨论,说真的我没太看懂,分析相对于冗长的代码实在太少……
这篇论文给了一个所谓断点的思路,个人觉得不错。文中后来提到比尔盖茨的论文使用的演算法,进而引出了DNA序列问题,使得这个游戏一样的问题焕发出了新的光彩。
另外,值得注意的是现在所谓“煎饼数”(书中有定义)的计算已经到了n=19的地步,以下两个独立研究可以作为参考,我对偏向纯数学的就不是很geek,没太研究了。
http://arxiv.org/abs/0901.3119 http://kam.mff.cuni.cz/~cibulka/pancakes/
http://www.springerlink.com/content/l1650023g3443852/
我觉得新版的《编程之美》要是更新这个题的话,可以多参阅这个链接。
本文转自gnuhpc博客园博客,原文链接:http://www.cnblogs.com/gnuhpc/archive/2012/12/21/2828087.html,如需转载请自行联系原作者