编程之美-小飞的电梯调度算法另一种解

放暑假了,在家闲着也是闲着,翻一翻去年买的《编程之美》这本书,有一些收获。昨天看到小飞的电梯调度算法这个问题,思考一番,得到了和书中给出的标准答案不一样的解决方法。

一、问题描述:

亚洲微软研究院所在的希格玛大厦一共有6部电梯。在高峰时间,每层都有人上下,电梯在每层都停。实习生小飞常常会被每层都停的电梯弄得很不耐烦,于是他提出了这样一个办法:
由于楼层并不算太高,那么在繁忙的上下班时间,每次电梯从一层往上走时,我们只允许电梯停在其中的某一层。所有乘客从一楼上电梯,到达某层后,电梯停下来,所有乘客再从这里爬楼梯到自己的目的层。在一楼的时候,每个乘客选择自己的目的层。在一楼的时候,每个乘客选择自己的目的层,电梯则自动计算出应停的楼层。

问:电梯停在哪一层楼,能够保证这次乘坐电梯的所有乘客爬楼梯的层数之和最少。

二、书中的解法

书中给出了两种解法:

在给出具体的解法之前先给出书中选择的抽象模型,模型是这样的:

假设楼层总共有N层,电梯停在第x层,要去第i层的乘客数目是Tot[i],这样,所爬楼层的的总数就是∑i{Tot[i]*|i-x|}

解法一:brute force。

这是最容易想到的解法。从第1层开始枚举x一直到第N层,然后再计算出如果电梯在第x层楼停的话,所有乘客总共要爬多少层楼。这个解法的时间复杂度是O(N2).

解法二:

假设电梯停在i层楼,可以计算出所有乘客要爬楼层的层数为Y,假设此时有N1个乘客在i层楼以下,N2个乘客在i层楼,N3个乘客在i层楼以上,则当电梯停在i+1层的时候,N1+N2个乘客要多下一层楼,共多下N1+N2层,N3个乘客要少往上面爬一层楼,少上N3层楼,此时Y(i+1) = Y(i) + N1+N2-N3,很显然,当N1+N2<N3的时候,Y不断减小。Y1很容易算出来,另外我们还可以看出,N1+N2是递增的,N3是递减的,所以N1+N2一旦大于N3的时候,我们直接退出循环即可,没有必要再计算下去。这种解法的时间复杂度是O(N)。

三、我的解法

上面这两种解法都是书中直接给出来的。因为我在看完题目之后没有直接看解答,得到的抽象模型就和上面提到的模型不一致,走上了另外一条路。

下面是我的思考过程。

假设乘客数是n,想去的对应楼层是N1,N2,...,Nn。要求N,使得min{∑i|N-Ni|}

如果我们能对序列N1,N2,...,Nn排序,得到一个有序序列为Nk1,Nk2,...,Nkn。那么问题可以表述为:求N,使得min{∑i|N-Nki|}  (Nk1<=Nk2<=...<=Nkn)。

把上面的式子看成是一个关于N的函数,我们很容易想象出这个函数的曲线——大概就是一个端口朝上的二元一次函数的曲线。

下面的问题就是怎么找到取极小值的N,其实想象出函数的曲线,这个问题也是非常直接的。

如果n是奇数,当N是中位数的时候,能取到极小值。

如果n是偶数,N取有序序列最中间的两个数或者这两个数之间任何一个数都能取到极小值。比如说,序列是2,3,5,7,那么N=3,4或者5都是极小值。

以上的两个结论证明起来也非常简单,这里不再赘述,有兴趣的同学不妨在纸上画一画。

至于怎么找出一个无须序列的中位数,方法很多,对时间空间的需求各不一样。可能会在下一篇博客中说说这个问题。

我们在面对一个具体的问题时,第一步往往是找到一个合适的抽象模型来描述这个问题,不同的抽象模型可能会衍生出不同的解决方法,甚至有的抽象模型能够解决问题,有的则不能,即使都能解决问题,解决问题的效率也可能存在巨大的差异。在这个例子中,因为选择了一个和书中不一样的抽象模型,得到了一个不一样的解题思路。

抽象模型很重要。

编程之美-小飞的电梯调度算法另一种解

时间: 2024-11-10 00:53:34

编程之美-小飞的电梯调度算法另一种解的相关文章

编程之美读书笔记1.8 - 小飞的电梯调度算法

http://blog.csdn.net/pipisorry/article/details/36688019 问题: 亚洲微软研究院所在的希格玛大厦一共有6部电梯.在高峰时间,每层都有人上下,电梯每层都停.实习生小飞常常会被每层都停的电梯弄的很不耐烦,于是他提出了这样一个办法: 由于楼层并不算太高,那么在繁忙的上下班时间,每次电梯从一层往上走时,我们只允许电梯停在其中的某一层.所有乘客从一楼上电梯,到达某层后,电梯停下来,所有乘客再从这里爬楼梯到自己的目的层.在一楼的时候,每个乘客选择自己的目

第1章 游戏之乐——小飞的电梯调度算法

小飞的电梯调度算法 1. 问题描述: 亚洲微软研究院所在的希格玛大厦一共有6部电梯.在高峰时间,每层都有人上下,电梯每层都停.实习生小飞常常会被每层都停的电梯弄的很不耐烦,于是他提出了这样一个办法:由于楼层并不算太高,那么在繁忙的上下班时间,每次电梯从一层往上走时,我们只允许电梯停在其中的某一层.所有乘客从一楼上电梯,到达某层后,电梯停下来,所有乘客再从这里爬楼梯到自己的目的层.在一楼的时候,每个乘客选择自己的目的层,电梯则计算出应停的楼层. 问:电梯停在哪一层楼,能够保证这次乘坐电梯的所有乘客

【数学】小飞的电梯调度算法

题目:<编程之美>P53 若干个乘客从一楼上电梯,电梯出发后,只能停靠在某一层.问电梯停在哪一层,可以让所有乘客走的总楼层数最少? 分析: 电梯可以停在负层,但没有0层.所以程序返回0时,表示出错.这里有个陷阱,因为没有0层,所以在计算时,应该先把负数的楼层加1.当最后算出来的结果小于等于0时,再减去一,才是实际中的负数层数. 代码中输入的数组的元素,表示每个乘客想去的楼层.最佳停靠楼层肯定落在区间[minfloor,maxfloor],其中minfloor表示乘客想去楼层的最小值,maxfl

1.8 小飞的电梯调度算法

题目:有一栋楼,现在设计一种电梯调度算法:电梯在一楼让大家上电梯,然后根据大家选择要到的楼层算出某一楼层i,电梯在i层停下让所有人下电梯,然后大家爬楼梯达到自己的楼层.请问电梯停在哪一层,可以使得这一次的所有乘客爬楼层之和最短? (一) 最直接最简单的方法就是直接枚举从第一层到最后一层,然后算出电梯停在哪一层会使得所有乘客爬楼层之和最短. 代码如下: int nPerson[]; //nPerson[i]表示到第i层的乘客的数目 int nFloor = 0, nMinFloor = 0; in

编程之美 1.8小飞的电梯调度算法

题目: 亚洲微软研究院所在的希格玛大厦一共有6部电梯.在高峰时间,每层都有人上下,电梯每层都停.实习生小飞常常会被每层都停的电梯弄的很不耐烦,于是他提出了这样一个办法: 由于楼层并不算太高,那么在繁忙的上下班时间,每次电梯从一层往上走时,我们只允许电梯停在其中的某一层.所有乘客从一楼上电梯,到达某层后,电梯停下来,所有乘客再从这里爬楼梯到自己的目的层.在一楼的时候,每个乘客选择自己的目的层,电梯则计算出应停的楼层. 问:电梯停在哪一层楼,能够保证这次乘坐电梯的所有乘客爬楼梯的层数之和最少? 方法

结对编程--电梯调度算法

1.需求分析: 实现电梯调度算法,预先输入乘坐电梯人数.每个人的起始楼层和到达楼层以及当前电梯所在楼层,电梯会根据算法依次将所有人员接入电梯并送至其重点楼层. 2.代码截图 3.约定的规范 使用Tab制表符 每行不超过100 {}另起一行 规范示例: 4.记录时间 命题讨论:1h 思路分析:1h 代码编写:24h 程序测试:2h 博客记录:1h 5.心得体会 结对编程可以通过自己的parterner来发现自己之前的不足,矫正错误 通过电梯调度算法,复习了数据结构和C语言的指针,结构体等

结对编程之电梯调度算法

   电梯调度结对编程                             1.题目:设计一个电梯调度算法,实现基本的电梯调度功能,要求有四部电梯,每部电梯21层,并且具有重量检验算法. 2.设计前的准备:确定了结对之后,我们首先对设计中可能遇到的问题进行了大体的分析与讨论,确定了编程的方向(java语言)并且约定了一些编程规范,语法规范为使用eclipse中的format规范代码,其他可能遇到的编程问题会在开发中随时交流.接着我们对题目进行了更深入的分析,考虑到电梯运行时的各种情况并发表自

读书问题之《编程之美》 -----12061161 赵梓皓

我阅读的书是<编程之美> 刚开始的时候阅读序,就觉得控制cpu利用率这个问题很好玩,所以重点看了这部分和解决办法,问题也都大部分是这部分的.那么问题就来了(挖掘机技术xxx?中国山东找蓝翔) 咳咳,问题在下面: 1.关于问题的提出.(也是一点点建议) 本书的主要内容是告诉读者如何思考问题和解决问题.但是提出问题也是很重要的,正如爱因斯坦所说“提出一个问题往往比解决一个问题更重要”,很多面试题(比如井盖为啥是圆的)我觉得正常人很少会想到.所以,这个问题是怎么想出来的...我很好奇.也希望作者能够

结对项目:电梯调度算法的实现和测试——报告

一.编程人员 徐方宇.陈少杰 二.工作照片 三.结对编程优缺点 优点: 1. 程序员互相帮助,互相教对方,可以得到能力上的互补. 2. 可以让编程环境有效地贯彻Design. 3. 增强代码和产品质量,并有效的减少BUG. 4. 降低学习成本.一边编程,一边共享知识和经验,有效地在实践中进行学习. 5. 在编程中,相互讨论,可能更快更有效地解决问题. 缺点: 对于有不同习惯的编程人员,可以在起工作会产生麻烦,甚至矛盾. 两个人在一起工作可能会出现工作精力不能集中的情况.程序员可能会交谈一些与工作