`
yiminghe
  • 浏览: 1453250 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

编程之美:烙饼排序问题

阅读更多

书中的题目描述:

 

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

“我以前在餐馆打工,顾客经常点非常多的烙饼。店里的饼大小不一,我习惯在到达顾客饭桌前,把一摞饼按照大小次序摆好——小的在上面,大的在下面。由于我一只手托着盘子,只好用另一只手,一次抓住最上面的几块饼,把它们上下颠倒个个儿,反复几次之后,这摞烙饼就排好序了。

我后来想,这实际上是个有趣的排序问题:假设有n块大小不一的烙饼,那最少要翻几次,才能达到最后大小有序的结果呢?

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

这个排序问题非常有意思,首先我们要弄清楚解决问题的关键操作——“单手每次抓几块饼,全部颠倒”。

 

 

 

每次我们只能选择最上方的一堆饼,一起翻转。而不能一张张地直接抽出来,然后进行插入,也不能交换任意两块饼子。这说明基本的排序办法都不太好用。那么怎么把这n个烙饼排好序呢?

由于每次操作都是针对最上面的饼,如果最底层的饼已经排序,那我们只用处理上面的n-1个烙饼。这样,我们可以再简化为n-2、n-3,直到最上面的两个饼排好序。

 

具体可见附件电子书

 

 

用javascript实现下:演示@google code

 

 

不要用ie折磨自己了,chrome最快,ff勉强

 

<script type="text/javascript">
	
	Array.prototype.clone=function(){
		return this.slice(0,this.length);
	};
	
	function FlapJack(arr){
		this._original=arr;
		
		//工作数组,会经常变化的
		this._work=arr.clone();
		
		//最终有序数组
		this._result=[];
		
		//最优翻转步鄹
		this._reverseStep=[];
		
		//记录枚举状态的中间翻转步鄹
		this._workReverseStep=[];
		
		//总共调用了多少次search操作
		this._totalSearchCount=0;
		
		//初始上限,最多2.(n-1)次翻转可以有序
		this.maxStep=2*(arr.length-1);
	}
	
	FlapJack.prototype.run=function(){
		this.search(0);
	};
	
	FlapJack.prototype.search = function(step){
		this._totalSearchCount++;
		
		//当前工作数组达到有序的最少翻转此数
		var nEstimate = this.lowerBound(this._work);
		
		//已经超过当前上限,忽略,剪枝
		if(nEstimate + step > this.maxStep || step >= this.maxStep) return;
		
		//已经完成要求有序
		if(this.isSorted(this._work)) {
			//当前步鄹为最优,记录当前步鄹详情
			if(step < this.maxStep) {
				this.maxStep = step;
				this._reverseStep=this._workReverseStep.slice(0,step);
				this._result=this._work.clone();
				return;
			}
		}
		
		
		//枚举搜索
		for(var i=1;i<this._work.length;i++) {
			//0...i 翻转
			this.reverse(this._work,0,i);
			//记录翻转步鄹
			this._workReverseStep[step]=i;
			//继续枚举搜索
			this.search(step+1);
			//还原继续搜索
			this.reverse(this._work,0,i);
		}
		
		
	};
	
	FlapJack.prototype.isSorted=function(arr) {

        for(var i = 1; i < arr.length; i++){
            if(arr[i-1] > arr[i]) {
                return false;
            }
        }
        return true;
   };
	
	//下界计算,凡是有两个位置相邻尺寸不相邻的都需要至少一次翻转将它们分开
	FlapJack.prototype.lowerBound=function(arr){
		var ret=0;
		for(var i=1;i<arr.length;i++) {
			if(Math.abs(arr[i]-arr[i-1])!=1)
				ret++;
		}
		return ret;
	};
	
	
	//
	FlapJack.prototype.reverse = function(arr,begin,end) {
		
		var i=begin,
				j=end,
				t=0;
		
		for(;i<j;i++,j--) {
			t=arr[i];
			arr[i]=arr[j];
			arr[j]=t;
		}		
	};
	
	
	if(!window['consoleH']) {
		consoleH={
			log:function(msg){
				document.writeln(msg+"<br />");
				//alert(msg);
			}
		};
	}
	
	(function main(){		
		
		var fj=new FlapJack([3, 2, 1, 6, 5, 4 ,9, 8 ,7, 0]);
		fj.run();
		
		consoleH.log("初始结果 [ "+[3, 2, 1, 6, 5, 4 ,9, 8 ,7, 0]+" ]");	
		consoleH.log("搜索次数 "+fj._totalSearchCount);
		consoleH.log("最终有序结果 [ "+fj._result+" ]");			
		consoleH.log("最优翻转次数 "+fj.maxStep);		
		consoleH.log("最优翻转步鄹 "+fj._reverseStep);	
		
	})();
	
</script>
 

 

 

 

 

  • 大小: 1.4 KB
分享到:
评论

相关推荐

    华为oj烙饼排序

    【华为OJ烙饼排序】是华为在线测评平台(OpenJudge)上的一道高级编程题目,主要考察的是排序算法的应用和实现。烙饼排序(Flipping Sorting),也称为煎饼排序,是一种基于比较的排序算法,它的灵感来源于煎饼翻转...

    烙饼排序算法和买书问题源码

    《程序之美-C语言:烙饼排序算法与买书问题源码》 在计算机科学的世界里,算法是解决问题的关键。本文将深入探讨两个编程问题:烙饼排序算法和买书问题,这两个问题都涉及到C语言的高效实现。我们将通过源代码分析...

    翻转烙饼排序问题(C语言源码)

    翻转烙饼排序问题是一种经典的计算机科学问题,其核心是在一系列烙饼中通过翻转操作将烙饼按大小顺序排列。这个问题在计算机科学领域中,尤其是算法设计与分析、数据结构以及人工智能等领域有着广泛的应用。下面,...

    《烙饼问题》课件.ppt

    烙饼问题的数学应用 《烙饼问题》课件.ppt是一个关于数学应用的教学资源,旨在让学生通过探索和分析烙饼问题,学习数学知识,发展逻辑思维和解决问题的能力。下面是该资源的知识点总结: 一、数学概念: 1. 最...

    数学广角优化烙饼问题PPT课件.pptx

    《数学广角优化烙饼问题》是一份针对中小学生设计的专业课件,主要讲解如何通过优化策略来解决实际生活中的烙饼问题,旨在培养学生的逻辑思维和优化意识。在这个问题中,核心是找到烙饼最节省时间的方法。 首先,...

    人教四年级数学上册烙饼问题PPT教案.pptx

    2. **数学模型**:烙饼问题可以抽象为一个数学模型,其中饼数代表问题规模,每次可烙饼的数量作为限制条件,每面烙的时间是固定参数。通过这个模型,我们可以找出解决不同数量饼的最优解。 3. **递推关系**:饼数与...

    人教版四年级数学上册烙饼问题PPT教案.pptx

    1. **烙饼问题**:烙饼问题是一种经典的优化问题,通常出现在小学数学的教学中,旨在训练学生的逻辑思维和优化策略。在这个问题中,每次只能同时烙两张饼,每面需要烙3分钟,目标是找到最短的时间来烙制一定数量的饼...

    四年级数学上册烙饼问题PPT课件PPT课件PPT学习教案.pptx

    【知识点详解】 1. **烙饼问题**:烙饼问题是一种经典的优化问题,通常涉及到在有限的...理解这些知识点有助于培养学生的逻辑思维能力,提高他们面对实际问题时的解决能力,并引导他们将数学知识应用于日常生活之中。

    四年级数学上册烙饼问题PPT学习教案.pptx

    本资料主要涉及的是四年级数学中的“烙饼问题”,这是一个经典的优化问题,旨在教授学生如何在有限的条件下高效地完成任务。烙饼问题通常与时间管理和效率优化有关,是运筹学的一个简单实例,对于培养孩子的逻辑思维...

    烙饼问题.ppt

    烙饼问题与时间复杂度分析 在这个文件中,我们可以看到一个经典的烙饼问题,它是计算机科学中一个著名的例子,用于说明时间复杂度的概念。下面我们将详细解释这个问题的解决方案和相关的知识点。 首先,让我们了解...

    人教四年级上册数学广角烙饼问题PPT学习教案.pptx

    《四年级上册数学广角:烙饼问题》 在人教版四年级上册的数学广角课程中,我们探讨了一个有趣的实际问题——烙饼问题。这个问题涉及到优化时间管理和效率提升,对于培养学生的逻辑思维和解决问题的能力具有重要意义...

    129烙饼问题人教版四年级上册第七单元.ppt

    《129烙饼问题》是人教版四年级上册第七单元的一个数学问题,主要探讨如何高效地利用有限的资源解决实际问题。这个题目涉及到了优化策略和时间管理的概念,对于孩子们来说,是一个很好的实践应用例子。 首先,我们...

    《烙饼问题》教学课例11.doc

    《烙饼问题》的教学课例主要探讨的是如何运用优化思维解决实际问题,特别是通过烙饼这一日常生活中的例子,让学生理解并初步体验运筹思想和对策方法。运筹思想是一种数学策略,它涉及到在多种可能的解决方案中寻找...

    82烙饼问题.ppt

    优化烙饼问题 通过这节课,我们可以学习到数学广角——优化烙饼问题的思想。优化烙饼问题是指在烙饼时,如何通过合理的安排来节约时间和能源。我们可以通过简单的实例,初步体会运筹思想在解决实际问题中的应用。 ...

    数学广角合理烙饼问题PPT课件.pptx

    这个PPT课件是关于数学中的“合理烙饼问题”,主要探讨如何在有限的资源下,以最短的时间烙制多张饼。这个问题是优化问题的一个经典实例,常见于小学或初中的数学教学中,旨在培养学生的逻辑思维和解决问题的能力。 ...

    烙饼问题 (4).ppt

    例如,在多线程编程中,如何分配和管理资源以最大化并发执行的任务数,从而提高程序的运行效率,就与烙饼问题的解决思路相类似。 此外,烙饼问题还可以帮助我们理解动态规划的思想。动态规划是一种通过将大问题分解...

    四年级数学上册8数学广角_优化8.2烙饼问题教学反思素材新人教版

    《四年级数学上册8数学广角_优化8.2烙饼问题教学反思素材新人教版》这篇教学反思聚焦于小学四年级数学课程中的一个重要概念——优化问题,特别是以“烙饼问题”为实例的教学实践。这个课题旨在引导学生理解和应用...

    经典算法,当然是经典了

    标签中的“烙饼问题”是一种经典的排序问题,也被称为煎饼排序。在这个问题中,想象一个平底锅可以同时煎两张饼,而我们要对多张饼进行排序,每次只能翻转一张或两张饼。烙饼问题展示了如何在有限的操作下达到目标...

    四年级数学烙饼问题教学设计.doc

    1. **统筹思想**:在烙饼问题的教学中,统筹思想是一个核心概念。它是指在处理问题时,通过合理规划和安排,以达到最高效、最节省资源的结果。在这个问题中,学生需要理解如何在有限的条件下(每次只能烙两张饼)...

    四年级数学上册烙饼问题.pptx

    这篇PPT主要探讨了在数学问题中如何有效地利用时间和资源,特别关注了“烙饼问题”。烙饼问题是一个经典的优化问题,它源自于日常生活中的烹饪活动,旨在寻找最小化完成任务所需时间的方法。在这个问题中,每次只能...

Global site tag (gtag.js) - Google Analytics