问题:

星期五的晚上,一帮同事在希格玛大厦附近的“硬盘酒吧”多喝了几杯。程序员多喝了几杯之后谈什么呢?自然是算法问题。有个同事说:“我以前在餐馆打工,顾客经常点非常多的烙饼。店里的饼大小不一,我习惯在到达顾客饭桌前,把一摞饼按照大小次序摆好——小的在上面,大的在下面。由于我一只手托着盘子,只好用另一只手,一次抓住最上面的几块饼,把它们上下颠倒个个儿,反复几次之后,这摞烙饼就排好序了。我后来想,这实际上是个有趣的排序问题:假设有n块大小不一的烙饼,那最少要翻几次,才能达到最后大小有序的结果呢?”

你能否写出一个程序,对于n块大小不一的烙饼,输出最优化的翻饼过程呢?

解决策略:通过递归枚举每种翻转策略,以找出最优策略。技巧:先找一种可行解,计算该可行方案的翻转次数,称此次数为上限,即超过此次数的翻转策略都不用考虑了。故达到上限是递归的一个结束条件。此外,还需进行剪枝。剪枝策略引用自:http://blog.sina.com.cn/s/blog_a2aa00d70101ewuf.html

1 )减小“最少翻转次数上限值”的初始值,采用前面提到的翻转方案,取其翻转次数为初始值。对书中的例子{3,2,1,6,5,4,9,8,7,0},初始值可以取10。

2 )避免出现已处理过的状态一定会减少遍历吗?答案是否定的,深度优先遍历,必须遍历完一个子树,才能遍历下一个子树,如果一个解在某层比较靠后位置,若不允许处理已出现过的状态时,可能要经过很多次搜索,才能找到这个解,但允许处理已出现过的状态时,可能会很快找到这个解,并减小“最少翻转次数的上限值”,使更多的分支能被剪掉,反而能减少遍历的节点数。比如说,两个子树A、B,搜索子树A,100次后可得到一个对应翻转次数为20的解,搜索子树B,20次后可得到翻转次数为10的解,不允许处理已出现过的状态,就会花100次遍历完子树A后,才开始遍历B,但允许翻转回上一次状态,搜索会在A、B间交叉进行,就可能只要70次找到子树B的那个解(翻转次数为10+2=12),此时,翻转次数上限值比较小,可忽略更多不必要的搜索。以书中的{3,2,1,6,5,4,9,8,7,0}为例,按程序(1.3_pancake_1.cpp),不允许翻转回上次状态时需搜索195次,而允许翻转回上次状态时只要搜索116次。

3) 如果最后的几个烙饼已经就位,只须考虑前面的几个烙饼。对状态(0,1,3,4,2,5,6),编号为5和6的烙饼已经就位,只须考虑前5个烙饼,即状态(0,1,3,4,2)。如果一个最优解,从某次翻转开始移动了一个已经就位的烙饼,且该烙饼后的所有烙饼都已经就位,那么对这个解法,从这次翻转开始得到的一系列状态,从中移除这个烙饼,可得到一系列新的状态。必然可以设计出一个新的解法对应这系列新的状态,而该解法所用的翻转次数不会比原来的多。

4 )估计每个状态还需要翻转的最少次数(即下限值),加上当前的深度,如果大等于上限值,就无需继续遍历。这个下限值可以这样确定:从最后一个位置开始,往前找到第一个与最终结果位置不同的烙饼编号(也就是说排除最后几个已经就位的烙饼),从该位置到第一个位置,计算相邻的烙饼的编号不连续的次数,再加上1。每次翻转最多只能使不连续的次数减少1,但很多人会忽略掉这个情况:最大的烙饼没有就位时,必然需要一次翻转使其就位,而这次翻转却不改变不连续次数。(可以在最后面增加一个更大的烙饼,使这次翻转可以改变不连续数。)如:对状态(0,1,3,4,2,5,6)等同于状态(0,1,3,4,2),由于1、3和4、2不连续,因而下限值为2+1=3。下限值也可以这样确定:在最后面增加一个比所有烙饼都大的已经就位的烙饼,然后再计算不连续数。如:(0,1,3,4,2),可以看作(0,1,3,4,2,5),1和3、4和2 、2和5这三个不连续,下限值为3。

5)多数情况下,翻转次数的上限值越大,搜索次数就越多。可以采用贪心算法,通过调整每次所有可能翻转的优先顺序,尽快找到一个解,从而减少搜索次数。比如,优先搜索使“下限值”减少的翻转,其次是使“下限值”不变的翻转,最后才搜索使“下限值”增加的翻转。对“下限值”不变的翻转,还可以根据其下次的翻转对“下限值”的影响,再重新排序。由于进行了优先排序,翻转回上一次状态能减少搜索次数的可能性得到进一步降低。

6 )其它剪枝方法:

假设进行第m次翻转时,“上限值”为min_swap。

如果翻转某个位置的烙饼能使所有烙饼就位(即翻转次数刚好为m),则翻转其它位置的烙饼,能得到的最少翻转次数必然大等m,因而这些位置都可以不搜索。

如果在某个位置的翻转后,“下限值”为k,并且k+m>=min_swap,则对所有的使新“下限值”kk大等于k的翻转,都有kk+m>=min_swap,因而都可以不搜索。该剪枝方法是对上面的“调整翻转优先顺序”的进一步补充。

另外,翻转某个烙饼时,只有两个烙饼位置的改变才对“下限值”有影响,因而可以记录每个状态的“下限值”,进行下一次翻转时,只须通过几次比较,就可以确定新状态的“下限值”。(判断不连续次数时,最好写成-1<=x &&x<=1, 而不是x==1 || x==-1。对于 int x; a<=x&& x<=b,编译器可以将其优化为unsigned (x-a) <= b-a。)

编程之美 一摞烙饼问题相关推荐

  1. 编程之美 一摞烙饼的排序问题

    一摞烙饼问题其实是一个很有意思的问题,它的描述是让一摞随机顺序的烙饼通过单手翻转的方式进行排序,以达到这摞烙饼由小到大顺序放置在盘子上的目 的,其特点是每次翻转都会导致第一个烙饼到所要反转的那个烙饼之 ...

  2. 编程之美之一摞烙饼的排序1

    拿到这个问题, 第一反应是利用分治的算法思想, 每次把当前的最大的一块烙饼放到指定位置 ,这样的思想非常简单,实现也非常容易.但是这只是提供了,问题的一个可行解,看完书中的内容之后发现,题目中要求的是 ...

  3. 编程之美-一摞烙饼的排序方法整理

    [问题描述] [方法]

  4. 编程之美 - 读书笔记 - 烙饼问题与搜索树

    前 面已经写了一些关于烙饼问题的简单分析,但因为那天太累有些意犹未尽,今天再充实一些内容那这个问题研究透.我想,通过这篇文章,我们就可以把这一类问题 搞懂.再遇到优化问题,如果我们想不到别的办法,就可 ...

  5. 《编程之美》1.3一摞烙饼的排序

    <编程之美>1.3一摞烙饼的排序       本文内容主要整理自http://yangguosheng.here.blog.163.com/blog/static/111479292201 ...

  6. 《编程之美——微软技术面试心得》一摞烙饼的排序初体验

    <编程之美>读书笔记:1.3 一摞烙饼的排序 问题: 星期五的晚上,一帮同事在希格玛大厦附近的"硬盘酒吧"多喝了几杯.程序员多喝了几杯之后谈什么呢?自然是算法问题.有个 ...

  7. 【编程之美】一摞烙饼的排序

    一,问题:                     星期五的晚上,一帮同事在希格玛大厦附近的"硬盘酒吧"多喝了几杯.程序员多喝了几杯之后谈什么呢?自然是算法问题.有个同事说:&qu ...

  8. 《编程之美》一摞烙饼问题探讨

    <编程之美>一摞烙饼问题探讨 这类问题我最早遇到是厨师摆盘子问题,就是厨师要把一个架子上的盘子按照从大到小排列,只能象本题中翻动烙饼的方式翻动盘子,当时我给出了这样的答案: int Fin ...

  9. 《编程之美》之摞烙饼的排序问题

    转载自http://blog.csdn.net/zuiaituantuan/article/details/6056601 一摞烙饼问题其实是一个很有意思的问题,它的描述是让一摞随机顺序的烙饼通过单手 ...

最新文章

  1. VS2008中自定义C++工程模板与修改新建文件默认编码的办法
  2. 2020-08淘宝特价版杀入短视频赛道,步步紧逼拼多多-10
  3. 蓝桥杯 第十届 JAVAB组 E迷宫
  4. 华为系统鸿蒙优势,华为鸿蒙2.0可以替代安卓吗,华为鸿蒙2.0优势在哪
  5. Nginx核心模块ngx_http_proxy_module与nginx反向代理、负载均衡详解
  6. 小白入职AI数据工程师
  7. sql server sysobjects 中type 和xtype
  8. Goldengate实现在线数据迁移
  9. 震惊!99%的网络工程师都不知道的组播问题
  10. ETERM操作和错误集合
  11. 多线程爬取图片(生产者-消费者模式)
  12. 2019世界计算机语言排行,TIOBE:2019年12月全球编程语言排行榜
  13. 安霸Ambarella CV系列芯片
  14. 置换贴图,法线贴图,凹凸贴图的区别
  15. MINE:Mutual Information Neural Estimation
  16. ubuntu查看电脑配置命令
  17. Java学习07–前端基础之CSS
  18. CATIA工程图插入图框
  19. 渗透测试工程师零基础学习教程2023年最新版,想入门学习这一篇就够了。
  20. 图神经网络 推荐系统,基于神经网络的推荐

热门文章

  1. RPC编程:RPC概述和架构演变
  2. 微信文章分享代码(PHP版)
  3. 牵着她——表白不成功算我输(Python实现)
  4. GPS卫星定位系统与手机窃听原理
  5. The table xxxx is full处理
  6. .NetCore微信支付+服务商模式(saas)
  7. 快来给你的Hexo博客招募亿只live2d看板娘吧(๑•̀ㅂ•́)و✧
  8. 共享式以太网和交换式以太网的区别
  9. Google“窃取”内容渠道控制权?
  10. Raki的读paper小记:Named Entity Recognition without Labelled Data: A Weak Supervision Approach(半成品)